2018年10月

2008年上大学的时候买了一台台式机,戴尔inspiron 530。配置如下:

硬件part详情
CPUCore 2 Quad Q6600
主板Intel G33
显卡8600GT
内存DDR2 800MHz 4G (1Gx4)
硬盘320GB 机械硬盘
电源350W

这台电脑用了大学四年,2012年本科毕业后就放在家里吃灰。

今年(2018年)十一假期,我爹问我那台电脑要不要扔到农村老家去,我才想起来这家伙已经躺在我房间里好几年没开过机了。于是把它重新通电开了个机。由于主板电池早就没电了,因此一开始就报CMOS校验出错。然而忽略此错误后,电脑居然奇迹般的引导进入了Windows。真是个老不死的。

于是我开始计划给这台老家伙重新修整一番。

- 阅读剩余部分 -

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);