Redis 内存优化案例

释放双眼,带上耳机,听听看~!

在Redis的配置文件中有这么两项配置:

hash-max-ziplist-entries 512
hash-max-ziplist-value 64
其中的‘ziplist’代表数据结构,是一种数据压缩方式,作用是减少内存的使用空间
在某个阀值范围内,hashtable会使用ziplist,对数据进行压缩,超出阀值后,会自动转为使用正常的hashmap结构
上面这两项就是定义这个阀值

hash-max-ziplist-entries 512
当hashtable中的条目数量在512以下时,使用ziplist

hash-max-ziplist-value 64
当hashtable中每个key/value的长度都小于64字节时,使用ziplist
以上2个条件中,任意一个条件超过设置值时,就不再使用ziplist了

案例
之前在网上看过一个案例,介绍了Instagram使用这项配置的实践经验
Instagram是一个超大型的图片类应用,他们有一个需求

根据图片ID得到作者ID
最简单的实现方式就是使用string类型

图片ID为KEY,作者ID为VALUE,一条一条的set/get
经测试,图片量为3亿时,一共需要20G左右的内存
经过一些优化后,效果不明显,他们便向Redis的一个开发者咨询解决方案

得到的建议是:
对数据进行分段,使用hash结构
因为hash结构在一定数据量下会进行压缩存储,可以节约很多内存
经过反复测试,在他们的环境下,entries阀值为1000时最合适,超过的话,CPU的压力较大
所以,数据分段的方式为:
1000条数据为一段,放在一个hash表中
例如 图片ID为1234888
他在一个hash表中,这个hash表的key为 1234,里面有1000个field,其中就包括了 888,值为其作者ID

Redis 内存优化案例

取1234888的作者ID时,就是取得key1234的hashtable中field888的值
经过测试,使用这种方式后,内存的使用量降到了5G左右,效果非常明显
类似的配置项还有:

list-max-ziplistzset-max-ziplist

点击
阅读原文 查看
文章列表

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索