Redis 数据类型底层模型详解

134 阅读3分钟

Redis 数据类型概览

Redis 支持多种数据类型,每种类型都有其独特的底层实现模型。以下是 Redis 的主要数据类型及其底层模型:

数据类型底层模型特点
String动态字符串(SDS)🔋 高效、支持二进制安全
List双向链表或压缩列表🚄 支持快速头尾操作
Hash压缩列表或哈希表🗂️ 适合存储对象
Set整数集合或哈希表🧮 去重、支持集合运算
ZSet压缩列表或跳表🏆 有序、支持范围查询

🔧 底层模型详解

1. String(字符串)

底层模型SDS(Simple Dynamic String,简单动态字符串)
特点

  • 二进制安全:可以存储任意二进制数据(如图片、视频)。
  • 高效扩容:预分配空间,减少内存分配次数。
  • 常数复杂度:获取字符串长度的时间复杂度为 O(1)。

图解

+---------+--------+--------+--------+
| len     | free   | buf    |        |
| (5)     | (5)    | "Hello"|        |
+---------+--------+--------+--------+
  • len:字符串实际长度。
  • free:剩余可用空间。
  • buf:存储字符串内容的字节数组。

应用场景

  • 缓存(如用户信息、配置)。
  • 计数器(如文章阅读量)。

2. List(列表)

底层模型双向链表 或 压缩列表(ziplist)
特点

  • 双向链表:支持快速头尾操作(LPUSH、RPOP),但内存占用较高。
  • 压缩列表:内存紧凑,适合存储小列表,但操作效率较低。

图解
双向链表

+---+    +---+    +---+
| A |<-->| B |<-->| C |
+---+    +---+    +---+

压缩列表

+---+---+---+---+---+---+
| A | B | C | D | E | F |
+---+---+---+---+---+---+

应用场景

  • 消息队列(LPUSH + BRPOP)。
  • 最新文章列表(LPUSH + LRANGE)。

3. Hash(哈希)

底层模型压缩列表 或 哈希表(dict)
特点

  • 压缩列表:适合存储小哈希(字段少、值小),内存紧凑。
  • 哈希表:适合存储大哈希,支持快速查找、插入、删除。

图解
哈希表

+---+    +---+    +---+
| K1| -> | V1|    | K2| -> | V2|
+---+    +---+    +---+

应用场景

  • 存储对象(如用户信息)。
  • 缓存复杂数据结构(如商品详情)。

4. Set(集合)

底层模型整数集合(intset)  或 哈希表(dict)
特点

  • 整数集合:适合存储小集合(元素为整数),内存紧凑。
  • 哈希表:适合存储大集合,支持快速去重、查找。

图解
整数集合

+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+

哈希表

+---+    +---+
| A | -> |   |
+---+    +---+
| B | -> |   |
+---+    +---+

应用场景

  • 去重(如用户标签)。
  • 集合运算(如共同好友)。

5. ZSet(有序集合)

底层模型压缩列表 或 跳表(skiplist)
特点

  • 压缩列表:适合存储小有序集合,内存紧凑。
  • 跳表:适合存储大有序集合,支持快速范围查询。

图解
跳表

+---+                      +---+
| 1 | -------------------> | 5 |
+---+                      +---+
| 1 | ------> | 3 | ------> | 5 |
+---+         +---+         +---+
| 1 | -> | 2 | -> | 3 | -> | 4 | -> | 5 |
+---+    +---+    +---+    +---+    +---+

应用场景

  • 排行榜(如游戏积分)。
  • 范围查询(如时间线)。

🛠️ 底层模型选择规则

Redis 会根据数据的大小和类型,自动选择合适的底层模型:

  • 小数据:使用压缩列表、整数集合等紧凑结构,节省内存。
  • 大数据:使用哈希表、跳表等高效结构,提升性能。

⚡ 性能优化建议

  1. 控制数据大小

    • 避免单个键存储过大数据(如大列表、大哈希)。
    • 使用分片(如哈希分片)分散数据。
  2. 选择合适的数据类型

    • 优先使用哈希、集合等高效结构,避免过度使用字符串。
  3. 监控内存使用

    • 使用 INFO memory 命令监控内存使用情况。
    • 定期清理过期数据。

🌟 Redis 的底层模型设计是其高性能的核心保障:

  • String:SDS 实现高效、安全的字符串存储。
  • List:双向链表和压缩列表支持快速头尾操作。
  • Hash:压缩列表和哈希表适合存储对象。
  • Set:整数集合和哈希表实现高效去重。
  • ZSet:压缩列表和跳表支持有序范围查询。