无序集合
-
集合对象的编码可以是intset 或者 hashtable
-
intset 编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面
-
hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的只则全部被设置为NULL
-
编码转换的规则
- 当集合对象可以同时满足以下两个条件时,对象使用intset 编码
- 集合对象保存的元素都是整数值
- 集合对象保存的元素不能超过512个
- 反之,则使用hashtable 实现
- 强调一下,如上规则可以修改参数 set-max-intset-entries
- 当使用intset编码所需的以上两个条件的任意一个不能被满足时,对象的编码转换操作就会被执行 ,编码也会从intset 变成 hashtable
- 当集合对象可以同时满足以下两个条件时,对象使用intset 编码
有序集合
-
有序集合的编码可以是ziplist或者skiplist
-
编码转换的规则
- 当集合对象可以同时满足以下两个条件时,对象使用ziplist 编码
- 有序集合对象保存的元素小于128个
- 有序集合保存的所有元素成员的长度都小于64字节
- 反之,则使用skiplist 实现
- 强调一下,如上规则可以修改参数 zset-max-ziplist-entries 和 zset-max-ziplist-value
- 当使用ziplist编码所需的以上两个条件的任意一个不能被满足时,对象的编码转换操作就会被执行 ,编码也会从ziplist 变成 skiplist
- 当集合对象可以同时满足以下两个条件时,对象使用ziplist 编码
-
为什么有序集合需要同时使用跳跃表和字典来实现呢?
- 主要是从性能上来讲,跳跃表适合范围查找,字典则使用元素直接获取数据,字典是无序的,所以需要额外开辟新的内存空间进行排序。