编码
一、认识
Redis
中的 redisObject
有不同的编码方式,用于优化内存使用和操作效率。根据数据类型和数据规模,Redis
会选择适当的编码方式。Redis
会根据以下条件自动选择编码方式:
-
数据类型(字符串、列表、集合等)。
-
数据规模(元素数量和大小)。
-
配置文件设置(如
zset-max-ziplist-entries
、hash-max-ziplist-entries
等)。
Redis
的编码方式提供了存储效率和操作性能的灵活平衡:
-
小型数据使用紧凑的编码(如
ZIPLIST
、EMBSTR
、INTSET
)。 -
大型或动态数据使用高效的结构(如
HT
、SKIPLIST
、QUICKLIST
)。 理解这些编码方式有助于优化Redis
的性能和内存使用。
二、HT
HT
:哈希表,用于存储较大或非整数的集合。
三、INT
INT
:当字符串可以转换为整数时(例如 123
),会使用整数编码。存储为一个 64
位的 long
值,节省内存。
四、RAW
RAW
原始字符串。使用动态分配的内存存储大字符串。适用于大于 44
字节的字符串。
五、EMBSTR
EMBSTR
:针对小字符串(44
字节或更小)的优化。将 redisObject
和字符串数据存储在连续的内存块中,减少内存碎片和分配开销。一旦字符串需要修改,会转换为 RAW
。
六、INTSET
INTSET
:小型整数集合(只包含整数)。数据量较小时(元素个数低于 512,或可配置)。
七、ZIPLIST
ZIPLIST
:使用压缩列表存储小型列表。节省内存,但对大量数据或频繁修改不适合。适用于:元素总大小小于 list-max-ziplist-size
配置的值。列表元素数量较少。
八、SKIPLIST
SKIPLIST
:跳跃表,用于存储大型有序集合。提供高效的范围查找和排序。
九、QUICKLIST
QuickList
是一个新的数据结构,它结合了 双向链表(LinkedList
) 和 压缩列表(ZipList
) 的优点。它将原本用作链表节点的结构,替换为压缩的内存结构,从而大大提高了内存效率和操作速度。
十、LINKEDLIST
LinkedList
为双向链表, 每个元素有一个指向前一个元素和后一个元素的指针,因此可以在 O(1)
时间复杂度内完成头部或尾部的插入和删除操作。 相比于 ZipList
,占用更多内存,插入和删除效率较高,查询效率较低。