Redis6 类型-物理编码-对应表
类型 | 编码 | 对象 |
---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | 使用整数值实现的字符串对象 |
REDIS_STRING | REDIS_ENCODING_EMBSTR | 使用 embstr 编码的简单动态字符串实现的字符串对象 |
REDIS_STRING | REDIS_ENCODING_RAW | 使用简单动态字符串实现的字符串对象 |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的列表对象 |
REDIS_LIST | REDIS_ENCODING_LINKEDLIST | 使用双端链表实现的列表对象 |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的哈希对象 |
REDIS_HASH | REDIS_ENCODING_HT | 使用字典实现的哈希对象 |
REDIS_SET | REDIS_ENCODING_INTSET | 使用整数集合实现的集合对象 |
REDIS_SET | REDIS_ENCODING_HT | 使用字典实现的集合对象 |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 使用压缩列表实现的有序集合对象 |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 使用跳跃表和字典实现的有序集合对象 |
Redis6 数据类型对应的底层数据结构
字符串
int
:8 个字节的长整型。embstr
:小于等于 44 个字节的字符串。raw
:大于 44 个字节的字符串。
Redis 会根据当前值的类型和长度决定使用哪种内部编码实现。
哈希
ziplist
(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries
配置(默认 512 个)、同时所有值都小于hash-max-ziplist-value
配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的 结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。hashtable
(哈希表):当哈希类型无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为O(1)
。
列表
ziplist
(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries
配置(默认 512 个)、同时所有值都小于hash-max-ziplist-value
配置(默认 64 字节)时,Redis 会选用 ziplist 来作为列表的内部实现来减少内存的使用。linkedlist
(链表):当列表类型无法满足 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。quicklist ziplist 和 linkedlist 的结合以 ziplist 为节点的链表(linkedlist)。
集合
intset
(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries
配置(默认 512 个)时,Redis 会用 intset 来作为集合的内部实现,从而减少内存的使用。hashtable
(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合的内部实现。
有序集合
ziplist
(压缩列表):当有序集合的元素个数小于zset-max-ziplist- entries
配置(默认 128 个),同时每个元素的值都小于zset-max-ziplist-value
配置(默认 64 字节)时,Redis 会用 ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。skiplist
(跳跃表):当 ziplist 条件不满足时,有序集合会使用 skiplist 作为内部实现,因为此时 ziplist 的读写效率会下降。
数据类型以及数据结构的关系
Redis6
Redis7
Redis 数据类型以及数据结构的时间复杂度
名称 | 时间复杂度 |
---|---|
哈希表 | O(1) |
跳表 | O(logN) |
双向链表 | O(N) |
压缩列表 | O(N) |
整数数组 | O(N) |