写入Memcache时是否应该压缩值?
最后更新于:2022-04-01 11:54:14
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 压缩结果
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-07_5705f50029619.jpg)
## 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 总结
将数据压缩后然后在写入memcache。
优点:
1)压缩后的数据存储,减少了内存的开销。
2) 压缩的数据,长度变小,减少了客户端与memcache服务器端的网络发送时间。
缺点:
1)由于需要压缩与解压,这样会多占用cpu的开销。
2)压缩比不压缩时间开销稍微更大点。
## 4 扩展
压缩的算法,有很多种,最常见的一种就是减少重复。比如2,3,4,5,5,5,5,5,5,5,7;上面的数据重复了6个5;可以在压缩的时候写出2,3,4,0,6,5,7。具体详解,有兴趣可以查看我转载的一篇优秀博客《几种压缩算法原理介绍》:[http://blog.csdn.net/clevercode/article/details/46691645](http://blog.csdn.net/clevercode/article/details/46691645)。
## 版权声明:
1)原创作品,出自"CleverCode的博客",严禁转载,否则追究版权法律责任。
2)原创地址:[http://blog.csdn.net/clevercode/article/details/46691851](http://blog.csdn.net/clevercode/article/details/46691851)。
3)分类地址(PHP程序员技术精粹):[http://blog.csdn.net/clevercode/article/category/3169943](http://blog.csdn.net/clevercode/article/category/3169943)(博客持续增加,关注请收藏)。
4)欢迎大家关注CleverCode博客更多的精彩内容:[http://blog.csdn.net/CleverCode](http://blog.csdn.net/CleverCode)。
5)欢迎大家关注CleverCode的微博:[http://weibo.com/CleverCode](http://weibo.com/CleverCode)。