Redis 数据类型及其底层数据结构

字符串(String)

  • 底层数据结构:简单动态字符串(Simple Dynamic String, SDS)
  • 优势:SDS 支持修改操作,如追加、截断等,而不仅仅是读取。它们还能高效地增长和缩小,且带有前置空间,用于减少因增长而重新分配内存的次数。
  • 使用理由:字符串是最基本的数据类型,适用于处理文本或二进制数据,提供了灵活性和高效的存储能力。
  • 解决问题:存储和操作键值对数据,支持存储序列化的复杂数据结构、二进制安全。

列表(List)

  • 底层数据结构:双向链表(Linked List)或压缩列表(ziplist)
  • 优势:双向链表支持在两端快速添加或删除元素,而压缩列表则在内存使用上更为高效。
  • 使用理由:列表适合存储有序的元素集合,特别是当需要在两端进行操作时。
  • 解决问题:快速实现队列和栈的功能,以及按插入顺序存储和检索数据。

集合(Set)

  • 底层数据结构:散列表(hashtable)或整数集合(intset)
  • 优势:散列表提供了快速的查找、添加和删除操作,而整数集合在存储小整数集时更为内存高效。
  • 使用理由:集合用于存储无序的唯一元素,适合快速判断元素是否存在于集合中。
  • 解决问题:实现无序元素集合的存储,支持高效的集合操作如并集、交集和差集。

有序集合(Sorted Set)

  • 底层数据结构:跳跃表(skiplist)和散列表(hashtable)
  • 优势:跳跃表支持快速的元素访问和范围查询,而散列表则用于快速查找元素。
  • 使用理由:有序集合维护了一个按分数排序的元素集合,适合实现排行榜等功能。
  • 解决问题:结合了集合的唯一性和列表的有序性,支持按分数范围查询元素。

哈希(Hash)

  • 底层数据结构:压缩列表(ziplist)或散列表(hashtable)
  • 优势:压缩列表在小数据集上节省内存,而散列表则在处理大量数据时提供了快速的访问时间。
  • 使用理由:哈希适合存储对象的字段和值,提供了一种类似于结构体的数据组织方式。
  • 解决问题:存储和访问对象属性,支持对对象模型的高效映射。

自动转换底层数据结构

Redis中的底层数据结构转换是自动进行的,无需人为干预。Redis为了优化性能和内存使用,会根据数据的实际使用情况自动选择最合适的底层数据结构。

触发转换的条件

转换通常是由以下条件触发的:

  1. 列表 (List): 当列表的元素个数或单个元素的长度超过预设的阈值时,Redis会将底层表示从压缩列表转换为双向链表。
  2. 集合 (Set): 当集合中的元素数量超过一定限制,或者集合中包含的不再是仅有整数类型的元素时,Redis会从整数集合转换到散列表。
  3. 哈希 (Hash): 类似于集合,当哈希类型的字段或字段值的大小超过预设的阈值时,Redis会从压缩列表转换到散列表。
  4. 有序集合(Sorted Set):当有序集合的元素数量增加或元素的大小超过阈值时,Redis会自动将底层数据结构从压缩列表转换为跳表和字典

配置参数

Redis提供了一些配置参数,允许用户定义这些阈值,这些参数包括:

  1. 哈希 (Hash):

    • hash-max-ziplist-entries 默认值为 512
    • hash-max-ziplist-value 默认值为 64 字节
  2. 列表 (List):

    • list-max-ziplist-size 默认值为 -2

    • -2时,表示列表中每个元素的最大大小为8KB。如果列表中任何元素的大小超过8KB,Redis将不会使用压缩列表作为底层数据结构,而是改用其他的数据结构,如双向链表

    • list-max-ziplist-size配置允许使用负数值来表示不同的限制:

      -50: 这些负数值代表了固定的字节数限制。例如,-1表示元素最大为1字节,-2表示元素最大为8字节,依此类推,直到-5正数值: 如果配置为正数,则表示压缩列表可以存储的元素的最大数量。

  3. 集合 (Set):

    • set-max-intset-entries 默认值为 512
  4. 有序集合 (Sorted Set):

    • zset-max-ziplist-entries 默认值为 128
    • zset-max-ziplist-value 默认值为 64 字节

这些参数可以在Redis配置文件中设置,或者通过CONFIG SET命令动态设置。当数据结构的实际使用超过这些配置的阈值时,Redis就会自动进行数据结构的转换,以确保数据结构的存储效率和操作性能。

相关推荐
睡觉的时候不会困1 小时前
Redis 主从复制详解:原理、配置与主从切换实战
数据库·redis·bootstrap
程序员的世界你不懂3 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
自学也学好编程3 小时前
【数据库】Redis详解:内存数据库与缓存之王
数据库·redis
JAVA不会写4 小时前
在Mybatis plus中如何使用自定义Sql
数据库·sql
IT 小阿姨(数据库)4 小时前
PgSQL监控死元组和自动清理状态的SQL语句执行报错ERROR: division by zero原因分析和解决方法
linux·运维·数据库·sql·postgresql·centos
ChinaRainbowSea4 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
小欣加油4 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
王璐WL4 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
小马学嵌入式~5 小时前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite
zzzsde5 小时前
【数据结构】队列
数据结构·算法