IT技术博客大学习 共学习 共进步

启用memcached压缩注意事项

某人的栖息地 2009-10-26 23:12:02 浏览 5,123 次

    在php开发中,开启memcache的数据压缩存储是一件很简单的事情。在多数情况下,压缩数据不仅不会降低程序的执行效率,反倒会因为网络传输的开销降低,带来速度提升。看看最常用的Memcache::set方法:

    bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )

    在这个方法中,将$flag设置为MEMCACHE_COMPRESSED即可启用memcache压缩存储。

这样做有什么弊端?

    如果没有做额外判断,每一次写入memcache都会启用压缩,不管数据的大小。对应的,每次获得数据都需要做一次解压缩的操作,这是典型的一刀切手法。实际上在数据很小的情况下,不需要压缩,在这个基础上压缩省不了多少空间。

更好的压缩策略?

    好了,我的想法是在数据超过一定大小(比如2k)的情况下,才开启压缩。这个好办,捋起袖子就干,在调用Memcache::set方法之前,首先判断一下数据的大小,一个strlen就搞定了,再简单不过了。

PHP:
$memcache = new Memcache;
$memcache->connect(\'localhost\', 11211);
$flag = strlen($data)> 2048 ? MEMCACHE_COMPRESSED : 0;
$memcache->set(\'mykey\', $data, $flag);

    有人可能会问了,array和object怎么办,这玩意可不能用strlen判断长度。

    这还真能难住我一阵子,要知道把array/object写入memcache的时候,php会自动做serialize,再把它当作字符串插入memcache。

PHP:
$flag = strlen(serialize($data))> 2048 ? MEMCACHE_COMPRESSED : 0;

    谁会采用这段代码?看起来非常山寨,而且serialize也不快,赔本买卖。

更好的办法!

    上面的文字都是废话,直接看这段就好。Memcache::setCompressThreshold方法可以包办之前所有的逻辑。

    Memcache::setCompressThreshold ― Enable automatic compression of large values

    bool Memcache::setCompressThreshold ( int $threshold [, float $min_savings ] )

    举个例子,下面这段会自动启用压缩策略,当数据大于2k时,以0.2的压缩比进行zlib。

PHP:
$memcache->setCompressThreshold(2000, 0.2);

    根据我的测试结果,setCompressThreshold方法会忽略Memcache::set的flag参数

建议继续学习

  1. 分布式缓存系统 Memcached 入门 (阅读 16,042)
  2. 30分钟3300%性能提升――python+memcached网页优化小记 (阅读 13,582)
  3. Cacti 添加 Memcached 监控 (阅读 9,162)
  4. Redis和Memcached的区别 (阅读 7,942)
  5. windows下压缩包在linux解压乱码的解决办法 (阅读 5,302)
  6. memcached 源码阅读笔记 (阅读 5,264)
  7. php的echo为什么这么慢 (阅读 5,221)
  8. 使用系统命令实现文件的压缩与加密 (阅读 5,184)
  9. Memcached内存管理机制浅析 (阅读 5,081)
  10. Android设计中的.9.png (阅读 4,903)