Redis的五大数据类型实现原理 (2)

  list 列表,它是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际上是个链表结构。

  ① 编码

  列表对象的编码可以是 ziplist(压缩列表) 和 linkedlist(双端链表)。

  比如我们执行以下命令,创建一个 key = ‘numbers’,value = ‘1 three 5’ 的三个值的列表。

rpush numbers 1 "three" 5

  ziplist 编码表示如下:

图片名称

  linkedlist表示如下:

图片名称

  ② 编码转换

  当同时满足下面两个条件时,使用ziplist(压缩列表)编码:

  1、列表保存元素个数小于512个

  2、每个元素长度小于64字节

  不能满足这两个条件的时候使用 linkedlist 编码。

  上面两个条件可以在redis.conf 配置文件中的 list-max-ziplist-value选项和 list-max-ziplist-entries 选项进行配置。

4. 哈希对象

  哈希对象的键是一个字符串类型,值是一个键值对集合。

  ① 编码

  哈希对象的编码可以是 ziplist 或者 hashtable。

  当使用ziplist,也就是压缩列表作为底层实现时,新增的键值对是保存到压缩列表的表尾。比如执行以下命令:

hset profile name "Tom" hset profile age 25 hset profile career "Programmer"

  如果使用ziplist,profile 存储如下:

图片名称

  当使用 hashtable 编码时,上面命令存储如下:

图片名称

  hashtable 编码的哈希表对象底层使用字典数据结构,哈希对象中的每个键值对都使用一个字典键值对。

  在前面介绍压缩列表时,我们介绍过压缩列表是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,相对于字典数据结构,压缩列表用于元素个数少、元素长度小的场景。其优势在于集中存储,节省空间。

  ② 编码转换

  和上面列表对象使用 ziplist 编码一样,当同时满足下面两个条件时,使用ziplist(压缩列表)编码:

  1、列表保存元素个数小于512个

  2、每个元素长度小于64字节

  不能满足这两个条件的时候使用 hashtable 编码。第一个条件可以通过配置文件中的 set-max-intset-entries 进行修改。

5. 集合对象

 集合对象 set 是 string 类型(整数也会转换成string类型进行存储)的无序集合。注意集合和列表的区别:集合中的元素是无序的,因此不能通过索引来操作元素;集合中的元素不能有重复。

  ① 编码

  集合对象的编码可以是 intset 或者 hashtable。

  intset 编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合中。

  hashtable 编码的集合对象使用 字典作为底层实现,字典的每个键都是一个字符串对象,这里的每个字符串对象就是一个集合中的元素,而字典的值则全部设置为 null。这里可以类比Java集合中HashSet 集合的实现,HashSet 集合是由 HashMap 来实现的,集合中的元素就是 HashMap 的key,而 HashMap 的值都设为 null。

SADD numbers 1 3 5

图片名称

SADD Dfruits "apple" "banana" "cherry"

图片名称

  ② 编码转换

  当集合同时满足以下两个条件时,使用 intset 编码:

  1、集合对象中所有元素都是整数

  2、集合对象所有元素数量不超过512

  不能满足这两个条件的就使用 hashtable 编码。第二个条件可以通过配置文件的 set-max-intset-entries 进行配置。

6. 有序集合对象

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzzff.html