? ? ? ?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 總結
? ? ? ? 將數據壓縮后然后在寫入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)。