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就会自动进行数据结构的转换,以确保数据结构的存储效率和操作性能。

相关推荐
喵叔哟7 分钟前
重构代码之移动字段
java·数据库·重构
念白44311 分钟前
智能病历xml提取
数据库·sql·oracle
qingy_204615 分钟前
【JavaWeb】JavaWeb入门之XML详解
数据库·oracle
大数据面试宝典19 分钟前
用AI来写SQL:让ChatGPT成为你的数据库助手
数据库·人工智能·chatgpt
努力的小雨24 分钟前
快速上手 KSQL:轻松与数据库交互的利器
数据库·经验分享
Gentle58626 分钟前
labview中连接sql server数据库查询语句
数据库·labview
Gentle58627 分钟前
labview用sql server数据库存取数据到一个单元格
数据库·labview
2401_8576363930 分钟前
共享汽车管理新纪元:SpringBoot框架应用
数据库·spring boot·汽车
菲兹园长30 分钟前
表的设计(MYSQL)
数据库·mysql
Java Fans1 小时前
MySQL数据库常用命令大全(完整版——表格形式)
数据库·mysql