关于redis:Redis数据结构与内部编码

4次阅读

共计 1813 个字符,预计需要花费 5 分钟才能阅读完成。

概要

Redis 对外的数据结构包含:字符串(string)、哈希(hash)、列表(list)、汇合(set)以及有序汇合(zset)。这些数据结构都有对应的 API 能够在客户端应用。如上每一种数据结构在 Redis 外部又对应不只一种外部编码实现。Redis 依据存储的数据抉择比拟适合的外部编码以实现内存与性能之间的均衡。

键对应存储的值的数据类型通过 type 命令查看,外部编码通过 object encoding 命令查看:

127.0.0.1> set a b
OK
127.0.0.1> type a
string 
127.0.0.1> object encoding a
"embstr"

字符串(string)

字符串类型的值能够是字符串(简略字符串,简单字符串如(JSON、XML),数字(整数、浮点数),甚至是二进制(图片、视频、音频)),值最大不能超过 512MB。

字符串类型的外部编码有 3 种:
int:键值 8 个字节的长整型
embstr:键值是小于等于 39 个字节的字符串
raw:键值是大于 39 个字节的字符串

哈希(hash)

哈希类型是指键值自身又是一个键值对,形如:value = {{field1=value1},{field2=value2}}

哈希类型的外部编码有 2 种:
ziplist:当哈希类型的元素个数小于 hash-max-ziplist-entries 配置(默认 512 个),同时所有的值都小于 hash-max-ziplist-value 配置(默认 64 字节)时。ziplist 更加节俭内存。
hashtable:当不满足 ziplist 条件,ziplist 的读写效率会降落,此时,应用 hashtable 作为外部编码,hashtable 的读写工夫复杂度是 O(1)。

 开发揭示:为了节俭内存,能够将一个大的哈希拆分成若干小的哈希来满足 ziplist 条件。

列表(list)

列表用来存储多个有序的字符串,列表中的每个字符串称之为一个元素,列表中的元素能够反复,一个列表最多能够存储 2^31 – 1 个元素。
列表类型的外部编码有 3 种:
ziplist:当列表类型的元素个数小于 list-max-zip-entries 配置(默认 512 个),同时列表中的每个元素的值都小于 list-max-ziplist-value 配置(默认 64 字节),ziplist 更加节俭内存。
linkedlist:当不满足 ziplist 条件,外部编码应用 linkedlist 实现。
quicklist:是一个以 ziplist 为节点的 linkedlist,联合了 ziplist 和 linkedlist 的长处。从 Redis 3.2 版本开始,新增了这种更加优良的列表外部编码实现。

 开发揭示:lpush + lpop = Stack(栈)lpush + rpop = Queue(队列)lpush + brpop = Message Queue(音讯队列)

汇合(set)

汇合用来存储多个字符串,汇合中最多能够存储 2^32 -1 个元素。相比列表,汇合是无序且不反复的, 能够实现多个汇合之间取交加,并集,差集。
汇合的外部编码有 2 种:
intset:当汇合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认 512 个),Redis 应用 intset 作为汇合的外部编码实现,intset 更加节俭内存。
hashtable:当不满足 intset 条件,Redis 应用 hashtable 作为外部编码实现。

有序汇合(zset)

有序汇合领有汇合的个性,除此之外,有序汇合中的元素能够排序,有序汇合通过给元素设置一个分数(score)来作为排序根据。
有序汇合的外部编码有 2 种:
ziplist:当有序汇合的元素个数小于 zset-max-ziplist-entries 配置(默认 512 个),同时每个元素的值小于 zset-max-ziplist-value 配置(默认 64 字节),ziplist 绝对比拟节俭内存。
skiplist:当 ziplist 条件不满足时,有序汇合应用 skiplist 作为外部编码。

总结

理解 Redis 的数据结构和外部编码实现有助于在缓存数据时进行正当的设计,抉择适合的数据结构进行数据缓存,同时联合外部编码实现的条件分类,做到绝对节俭内存。

Redis 这种数据结构和外部编码实现拆散的设计有两个益处:第一,每一种数据结构能够对应多个外部编码,依据不同的键值抉择更加高效的外部编码;第二,外部编码的降级迭代对外部来说是通明的,客户端无感知。

正文完
 0