CleverCode最近在查看资料时,发现一种写入Memcache时,先采用gzcompress()压缩后在写入。这种做法到底好不好,我在这里分析一些,与大家一起探讨一下。
1 php压缩效率分析
1.1 压缩函数
当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了。gzcompress()和gzuncompress()函数。同时,你还可以使用gzencode()和gzdecode()函数来压缩,只不用其用了不同的压缩算法。
这里使用gzcompress()和gzuncompress()函数。
<?php
/**
* testInfo.php
*
* php压缩效率分析
*
* Copyright (c) 2015 http://blog.csdn.net/CleverCode
*
* modification history:
* --------------------
* 2015/6/30, by CleverCode, Create
*
*/
$string =
"CleverCode是一名PHP工程师,他只想把自己一点点的智慧分享给大家!
他的博客地址:http://blog.csdn.net/CleverCode。
他的微博地址:http://weibo.com/CleverCode。
他推荐的博客专栏:
《设计模式之PHP项目应用》:http://blog.csdn.net/column/details/phpusedesignpattern.html。
《Linux常用软件安装与配置》:http://blog.csdn.net/column/details/linuxsoftwareinstall.html。
Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc ut elit id mi ultricies
adipiscing. Nulla facilisi. Praesent pulvinar,
sapien vel feugiat vestibulum, nulla dui pretium orci,
non ultricies elit lacus quis ante. Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Aliquam
pretium ullamcorper urna quis iaculis. Etiam ac massa
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc. In id magna pellentesque
tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. Etiam at justo in leo congue mollis.
Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut malesuada lacus eu nulla bibendum
id euismod urna sodales.";
//压缩
$compressed = gzcompress($string);
echo "Original size: ". strlen($string)."\n";
/* 输出原始大小
Original size: 1157
*/
echo "Compressed size: ". strlen($compressed)."\n";
/* 输出压缩后的大小
Compressed size: 680
*/
// 解压缩
$original = gzuncompress($compressed);
?>
1.2 压缩结果
2 Memcache写入压缩
根据上面的压缩方式,可以看到节省了内存约50%。那么在我们内存不充足的情况下。我们在写入Memcache时可以先压缩,然后再放入到内存中。
2.1 自己压缩
<?php
/**
* testMemcache.php
*
* 写入Memcache
*
* Copyright (c) 2015 http://blog.csdn.net/CleverCode
*
* modification history:
* --------------------
* 2015/6/30, by CleverCode, Create
*
*/
/**
* 写缓存
*
* @param string $key key
* @param mixed $data 数据
* @param int $expire 有效时间
* @return null
*/
function mc_set($key = '', $data = '', $expire = 3600){
// 序列化
$string = serialize($data);
// 压缩
$compressed = gzcompress($string);
// 写入缓存
$memcache_obj = new Memcache();
$memcache_obj->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;
}
?>
2.2 自带压缩
Memcache函数set时候有一个参数,可以指定是否压缩。如下。
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]] )
Memcache::set()向key存储一个元素值为 var。参数expire是以秒为单位的失效时间, 如果设置为0表明该元素永不过期(但是它可能会因为为了给其他项分配空间而被删除)。如果你希望存储的元素 经过压缩(使用zlib),你可以设置flag的值为MEMCACHE_COMPRESSED。
样例:
<?php
/**
* testMemcache.php
*
* 写入Memcache
*
* Copyright (c) 2015 http://blog.csdn.net/CleverCode
*
* modification history:
* --------------------
* 2015/6/30, by CleverCode, Create
*
*/
/* OO API */
$memcache_obj = new Memcache();
/* connect to memcached server */
$memcache_obj->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');
?>
3 总结
4 扩展
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!