php的Memcache和Memcached如何保证平滑迁移
Memcache这玩意虽然也是用于php连接memcached服务的,但是十分古老了,而且貌似也不维护了。
如果需要从Memcache迁移到Memcached,就会涉及到兼容性的问题——这里的兼容性发生在线上升级的时候,一部分机器升级了Memcached,然而旧的机器缓存还是用Memcache写入的,Memcached读出来就会产生问题,导致升级过程中服务处于几乎不可用的状态。
问题1
Memcached默认会对超过一定长度的数据进行压缩,而Memcache是没有压缩的,因此调用Memcached的写入时,需要取消压缩:
$memcached->setOption(Memcached::OPT_COMPRESSION, false);
问题2
Memcached和Memcache在有多台memcached服务时,使用的默认散列算法不同。Memcache用的是crc32。因此需要把Memcached的散列算法也设置为crc32
$memcached->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
问题3
通过Memcache写入memcached服务中的数据被Memcached读出来会被错误解读,反之亦然
这是由于Memcache写入的时候,设置在memcached服务中的flag无论如何都是0,而如果用Memcached写入(默认方式),则可能为0(string)、1(int)、3(对象)、4(数组)等等。这是因为Memcache是先做序列化再写入的,读取后也会默认做一次反序列化。因此在调用Memcached::set的时候,需要给被存入缓存的数据做一次序列化变成string,这样flag就一定是0,读写就和Memcache一致了。
// 写入
$memcached->set($key, serialize($value), $expire);
// 读取
$raw = $memcached->get($key);
$value = unserialize($raw);