写入Memcache时是否应该压缩值?

       CleverCode最近在查看资料时,发现一种写入Memcache时,先采用gzcompress()压缩后在写入。这种做法到底好不好,我在这里分析一些,与大家一起探讨一下。

 

1 php压缩效率分析

1.1 压缩函数

          当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了。gzcompress()和gzuncompress()函数。同时,你还可以使用gzencode()和gzdecode()函数来压缩,只不用其用了不同的压缩算法。
这里使用gzcompress()和gzuncompress()函数。

 

 

 

1.2 压缩结果

 

2 Memcache写入压缩

      根据上面的压缩方式,可以看到节省了内存约50%。那么在我们内存不充足的情况下。我们在写入Memcache时可以先压缩,然后再放入到内存中。

 

2.1 自己压缩

 

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。

 

样例:

 

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。
 
 
 

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

 

 

 


 

你可能感兴趣的:(PHP程序员技术精粹)