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

     答: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. 建议在对查询速度要求不高的时候使用短结构存储,因为节省内存占用的同时牺牲了查询速度;