Redis降低内存占用方案(一):短结构

     问: 降低内存占用有什么好处?

     答:1. 让redis存储更多数据; 2. 有助于减少创建快照和加载快照所需的时间;3. 提升载入aof文件和重写aof文件时的效率;4. 缩短主从同步所需要的时间; 

     本章主要内容: 短结构分片结构打包存储二进制位和字节

     短结构

     什么是短结构?redis中的数据类型均有两种(string有三种)实现方式,节约内存空间的那种存储结构可以称为短结构,与之对应的存储方式称之为长结构。

     短结构和长结构使用的配置详情见下表(string情况在此不讨论): 


短结构长结构基本配置项注释
listziplistlinkedlist

list-max-ziplist-entries=512

list-max-ziplist-value=64 

列表元素长度都小于64字节并且列表元素数量小于512时,使用ziplist,反之使用linkedlist。
hashziplisthashtable

hash-max-ziplist-entries=512

hash-max-ziplist-value=64

哈希对象保存的所有键值对的key和value都小于64字节并且哈希对象保存的键值对数量小于512时,使用ziplist,反之使用hashtable。
setintsethashtableset-max-intset-entries=512集合对象多有元素都是整数并且元素的数量不超过512时,使用intset,反之使用hashtable。
zsetziplistskiplist

zset-max-ziplist-entries=128

zset-max-ziplist-value=64 

有序集合保存元素小于128个并且所有元素成员长度都小于64字节时,使用ziplist,反之使用skiplist。

      

     延伸线上问题:在一批list中,如何找出使用非ziplist的键值?

     答:debug object命令可以查看特定对象的信息,encoding表示编码类型,serializedlength表示占用内存大小。

     如下,该键值占用了641549字节内存。

105956_miAf_167206.png

     所以,解决延伸问题需要以下三个步骤:

    1. scan

     2. debug object key

     3. filter encoding != ziplist   


     长压缩列表的解码和内存内数据移动是性能瓶颈

     对一个压缩列表表示的对象进行读取或更新,可能会对整个压缩列表进行解码,甚至对内存中的数据进行移动。

     整数集合的问题并非来自于编码和解码数据,而在于它在执行插入删除操作时需要对数据进行移动。


     总结:

     1. 使用短结构存储数据可以大幅度的降低内存占用;

     2. 建议在对查询速度要求不高的时候使用短结构存储,因为节省内存占用的同时牺牲了查询速度;







转载于:https://my.oschina.net/justfairytale/blog/598636

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值