2016年7月20日星期三

Redis 内存容量优化

在上一篇blog中(http://wadeling.blogspot.com/2016/07/redis.html),提到接手的一个redis服务,这个redis服务一开始是完全用string类型来存储key值,导致需要的内存容量非常的大。而且咨询使用方,有可能业务量还要几倍的上涨,而我们现在的机器只有16G内存,就算加内存,内存压力也太大了。于是有了内存优化的想法。
查询了网络上的一些优化文章,通过实验,发现还是有不少优化效果。具体思路就是把string类型的数据转成hash来存,同时保证每个hashkey里面的filed个数在一定范围内,这样redis会把hash的内存做优化处理,减小了内存的使用量。经过实验,100万个key,采用string类型存储,需要88M的内存,如果用hash来存,只需要45M内存。
优化方案如下:
1.查看redis的hash设置
通过cli方式查看:config get hash-max-ziplist-entries,值是512.
config get hash-max-ziplist-value,值是64.
即每个hashkey里面的field数目为512一下,value长度是64字节以内时,redis会对内存做优化。
2.对10万个key做分hash存储

//把md5字符串转成整数,具体方法是取前面8个字符,用base_convert转成10进制
$md5int = $this->md5str_to_int($md5str);

//3000为估算,即最后会有3000个hashkey,每个hashkey里面大概有300多个field,满足要求
$key = $md5int % 3000;

//hset来存入
$ret = $this->redis->hSet($key,$md5str,$value);


参考:
redis内存容量优化
Redis内存优化案例
instagram使用redis内存优化
redis官方内存优化方案

没有评论:

发表评论