Stay hungry, Stay foolish

0%

Memcache的一些笔记

flag

对于Memcache的add、set以及replace方法里有个flag的标识:

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

之前在使用时一直不甚了了,抽空补了一下。

先看PHP手册里对其的解释:

flag:使用MEMCACHE_COMPRESSED指定对值进行压缩(使用zlib)。

###使用方法

  • 手动指定:
1
2
3
4
5
$mc = new Memcache();
$mc->connect('127.0.0.1', '12105');
$data = '12345';
$flag = strlen($value) -> 2046 ? MEMCACHE_COMPRESSED : 0;
$mc->set('TEST', $data, $flag);
  • setCompressThreshold方法

Memcache::setCompressThreshold 开启对于大值的自动压缩。 同样你也可以使用函数memcache_set_compress_threshold()。

1
2
3
$mc = new Memcache();
$mc->connect('127.0.0.1', '12105');
$mc->setCompressThreshold(2046, 0.2);
1
2
3
$mc = new Memcache();
$mc->connect('127.0.0.1', '12105');
memcache_set_compress_threshold($mc, 2046, 0.2);

方法一灵活但烦琐,而且对数组和对象的长度判断需要先序列化。要注意的是:如果使用了第二种方法,会忽略第一种方法中的$flag的值。

Memcache和Memcached

在看Memcache的时候发现PHP的手册里还有一个Memcached类,这两者有什么异同呢?在网上搜索了下:

  1. 从手册上看,两者使用差不多,Memcached比Memcache多了些方法;

  2. Memcache是原生的,Memcached基于libmemcached扩展,前者面向对象和面向过程并存,后者仅面向对象,后者会随memcache服务器的更新而跟进,前者就不好说了;

  3. 对比表显示,用Memcached更靠谱;

  4. Memcached支持Binary Protocol,Memcache不支持,意味着Memcached会有更高的性能。

  5. Memcached目前还不支持长连接。

  6. 对于上述的压缩参数,Memcached取消了add、set方法里的设置,直接转交给setOption方法了。(Memcached::OPT_COMPRESSION 默认开启压缩,数据超过100bytes)

序列化

对于数组及对象的设置,Memcache和Memcached会自动对其进行序列化,后者默认采用PHP的序列化函数serialize,还可以设置为igbinary序列化(Memcached::SERIALIZER_IGBINARY)和JSON序列化(Memcached::SERIALIZER_JSON,需要php5.2.10以上)

igbinary、serialize和json_encode对比

http://www.ooso.net/archives/538 (有图有真相)

参考资料:

据说打赏我的人,代码没有BUG