CleverCode最近在查看资料时,发现一种写入Memcache时,先采用gzcompress()压缩后在写入。这种做法到底好不好,我在这里分析一些,与大家一起探讨一下。
当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了。gzcompress()和gzuncompress()函数。同时,你还可以使用gzencode()和gzdecode()函数来压缩,只不用其用了不同的压缩算法。
这里使用gzcompress()和gzuncompress()函数。
根据上面的压缩方式,可以看到节省了内存约50%。那么在我们内存不充足的情况下。我们在写入Memcache时可以先压缩,然后再放入到内存中。
connect('memcache_host', 11211);
$memcache_obj->set($key, $compressed, 0, $expire);
}
/**
* 读缓存
*
* @param string $key
* @return mixed
*/
function mc_get($key = ''){
// 写入缓存
$memcache_obj = new Memcache();
/* connect to memcached server */
$memcache_obj->connect('memcache_host', 11211);
// 读取
$compressed = $memcache_obj->get($key);
// 解压
$string = gzuncompress($compressed);
// 反序例化
$data = unserialize($string);
return $data;
}
?>
Memcache函数set时候有一个参数,可以指定是否压缩。如下。
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
Memcache::set()向key存储一个元素值为 var。参数expire是以秒为单位的失效时间, 如果设置为0表明该元素永不过期(但是它可能会因为为了给其他项分配空间而被删除)。如果你希望存储的元素 经过压缩(使用zlib),你可以设置flag的值为MEMCACHE_COMPRESSED。
样例:
connect('memcache_host', 11211);
/*
* 设置'var_key'对应值,使用即时压缩
* 失效时间为50秒
*/
$memcache_obj->set('var_key', 'some really big variable', MEMCACHE_COMPRESSED, 50);
echo $memcache_obj->get('var_key');
?>