字符串(String)
- 底层数据结构:简单动态字符串(Simple Dynamic String, SDS)
- 优势:SDS 支持修改操作,如追加、截断等,而不仅仅是读取。它们还能高效地增长和缩小,且带有前置空间,用于减少因增长而重新分配内存的次数。
- 使用理由:字符串是最基本的数据类型,适用于处理文本或二进制数据,提供了灵活性和高效的存储能力。
- 解决问题:存储和操作键值对数据,支持存储序列化的复杂数据结构、二进制安全。
列表(List)
- 底层数据结构:双向链表(Linked List)或压缩列表(ziplist)
- 优势:双向链表支持在两端快速添加或删除元素,而压缩列表则在内存使用上更为高效。
- 使用理由:列表适合存储有序的元素集合,特别是当需要在两端进行操作时。
- 解决问题:快速实现队列和栈的功能,以及按插入顺序存储和检索数据。
集合(Set)
- 底层数据结构:散列表(hashtable)或整数集合(intset)
- 优势:散列表提供了快速的查找、添加和删除操作,而整数集合在存储小整数集时更为内存高效。
- 使用理由:集合用于存储无序的唯一元素,适合快速判断元素是否存在于集合中。
- 解决问题:实现无序元素集合的存储,支持高效的集合操作如并集、交集和差集。
有序集合(Sorted Set)
- 底层数据结构:跳跃表(skiplist)和散列表(hashtable)
- 优势:跳跃表支持快速的元素访问和范围查询,而散列表则用于快速查找元素。
- 使用理由:有序集合维护了一个按分数排序的元素集合,适合实现排行榜等功能。
- 解决问题:结合了集合的唯一性和列表的有序性,支持按分数范围查询元素。
哈希(Hash)
- 底层数据结构:压缩列表(ziplist)或散列表(hashtable)
- 优势:压缩列表在小数据集上节省内存,而散列表则在处理大量数据时提供了快速的访问时间。
- 使用理由:哈希适合存储对象的字段和值,提供了一种类似于结构体的数据组织方式。
- 解决问题:存储和访问对象属性,支持对对象模型的高效映射。
自动转换底层数据结构
Redis中的底层数据结构转换是自动进行的,无需人为干预。Redis为了优化性能和内存使用,会根据数据的实际使用情况自动选择最合适的底层数据结构。
触发转换的条件
转换通常是由以下条件触发的:
- 列表 (List): 当列表的元素个数或单个元素的长度超过预设的阈值时,Redis会将底层表示从压缩列表转换为双向链表。
- 集合 (Set): 当集合中的元素数量超过一定限制,或者集合中包含的不再是仅有整数类型的元素时,Redis会从整数集合转换到散列表。
- 哈希 (Hash): 类似于集合,当哈希类型的字段或字段值的大小超过预设的阈值时,Redis会从压缩列表转换到散列表。
- 有序集合(Sorted Set):当有序集合的元素数量增加或元素的大小超过阈值时,Redis会自动将底层数据结构从压缩列表转换为跳表和字典
配置参数
Redis提供了一些配置参数,允许用户定义这些阈值,这些参数包括:
-
哈希 (Hash):
hash-max-ziplist-entries
默认值为512
hash-max-ziplist-value
默认值为64
字节
-
列表 (List):
-
list-max-ziplist-size
默认值为-2
-
-2
时,表示列表中每个元素的最大大小为8KB。如果列表中任何元素的大小超过8KB,Redis将不会使用压缩列表作为底层数据结构,而是改用其他的数据结构,如双向链表 -
list-max-ziplist-size
配置允许使用负数值来表示不同的限制:-5
到0
: 这些负数值代表了固定的字节数限制。例如,-1
表示元素最大为1字节,-2
表示元素最大为8字节,依此类推,直到-5
。正数值
: 如果配置为正数,则表示压缩列表可以存储的元素的最大数量。
-
-
集合 (Set):
set-max-intset-entries
默认值为512
-
有序集合 (Sorted Set):
zset-max-ziplist-entries
默认值为128
zset-max-ziplist-value
默认值为64
字节
这些参数可以在Redis配置文件中设置,或者通过CONFIG SET
命令动态设置。当数据结构的实际使用超过这些配置的阈值时,Redis就会自动进行数据结构的转换,以确保数据结构的存储效率和操作性能。