问: 降低内存占用有什么好处?
答:1. 让redis存储更多数据; 2. 有助于减少创建快照和加载快照所需的时间;3. 提升载入aof文件和重写aof文件时的效率;4. 缩短主从同步所需要的时间;
短结构、分片结构、打包存储二进制位和字节。
短结构:
什么是短结构?redis中的数据类型均有两种(string有三种)实现方式,节约内存空间的那种存储结构可以称为短结构,与之对应的存储方式称之为长结构。
短结构和长结构使用的配置详情见下表(string情况在此不讨论):
短结构 | 长结构 | 基本配置项 | 注释 | |
list | ziplist | linkedlist | list-max-ziplist-entries=512 list-max-ziplist-value=64 | 列表元素长度都小于64字节并且列表元素数量小于512时,使用ziplist,反之使用linkedlist。 |
hash | ziplist | hashtable | hash-max-ziplist-entries=512 hash-max-ziplist-value=64 | 哈希对象保存的所有键值对的key和value都小于64字节并且哈希对象保存的键值对数量小于512时,使用ziplist,反之使用hashtable。 |
set | intset | hashtable | set-max-intset-entries=512 | 集合对象多有元素都是整数并且元素的数量不超过512时,使用intset,反之使用hashtable。 |
zset | ziplist | skiplist | zset-max-ziplist-entries=128 zset-max-ziplist-value=64 | 有序集合保存元素小于128个并且所有元素成员长度都小于64字节时,使用ziplist,反之使用skiplist。 |
延伸线上问题:在一批list中,如何找出使用非ziplist的键值?
答:debug object命令可以查看特定对象的信息,encoding表示编码类型,serializedlength表示占用内存大小。
如下,该键值占用了641549字节内存。
所以,解决延伸问题需要以下三个步骤:
1. scan
2. debug object key
3. filter encoding != ziplist
长压缩列表的解码和内存内数据移动是性能瓶颈。
对一个压缩列表表示的对象进行读取或更新,可能会对整个压缩列表进行解码,甚至对内存中的数据进行移动。
整数集合的问题并非来自于编码和解码数据,而在于它在执行插入删除操作时需要对数据进行移动。
总结:
1. 使用短结构存储数据可以大幅度的降低内存占用;
2. 建议在对查询速度要求不高的时候使用短结构存储,因为节省内存占用的同时牺牲了查询速度;