Skip to content

Redis常见的数据结构

Redis 常见数据结构

Redis 是一种键值数据库,支持丰富的数据结构,主要包括: 1. 字符串(String):简单键值对。 2. 哈希(Hash):键值对集合。 3. 列表(List):有序可重复元素。 4. 集合(Set):无序不重复元素。 5. 有序集合(Sorted Set):带分数的集合。

核心点

  • 数据结构多样,内存存储,高效操作。

1. 数据结构详解

(1) 字符串(String)

  • 底层实现
  • SDS(Simple Dynamic String):动态字符串,优于 C 字符串。
  • 特点
  • 存储文本、数字、字节流。
  • 支持增减操作(如 INCR)。
  • 命令
  • SET key value, GET key, INCR key
  • 时间复杂度
  • O(1)
  • 示例
SET name "Alice"
INCR count  # 自增
  • 场景
  • 缓存、计数器。

(2) 哈希(Hash)

  • 底层实现
  • 字典(dict):哈希表。
  • 小数据量用 ziplist(压缩列表)优化内存。
  • 特点
  • 键值对集合,类似 Map。
  • 字段独立操作。
  • 命令
  • HSET key field value, HGET key field, HGETALL key
  • 时间复杂度
  • O(1)(单字段)。
  • 示例
HSET user:1 name "Alice" age "25"
HGET user:1 name  # 返回 "Alice"
  • 场景
  • 对象存储(如用户信息)。

(3) 列表(List)

  • 底层实现
  • 双向链表(quicklist):Redis 3.2+,结合 ziplist 和链表。
  • 特点
  • 有序,可重复。
  • 支持两端操作。
  • 命令
  • LPUSH key value, RPOP key, LRANGE key 0 -1
  • 时间复杂度
  • 头尾操作:O(1)
  • 中间访问:O(n)
  • 示例
LPUSH list 1 2 3
RPOP list  # 返回 1
  • 场景
  • 队列、栈、时间线。

(4) 集合(Set)

  • 底层实现
  • 字典(dict):键存值,值为空。
  • 小集合用 intset(整数集合)优化。
  • 特点
  • 无序,不重复。
  • 支持交并差操作。
  • 命令
  • SADD key value, SMEMBERS key, SINTER key1 key2
  • 时间复杂度
  • 添加/查询:O(1)
  • 集合运算:O(n)
  • 示例
SADD set 1 2 3
SADD set 2
SMEMBERS set  # 返回 1 2 3
  • 场景
  • 去重、标签系统。

(5) 有序集合(Sorted Set)

  • 底层实现
  • 跳表(skiplist) + 字典(dict)
    • 跳表:排序。
    • 字典:快速查找。
  • 特点
  • 每个元素带分数,按分数排序。
  • 支持排名查询。
  • 命令
  • ZADD key score value, ZRANGE key 0 -1, ZRANK key value
  • 时间复杂度
  • 添加/查询:O(log n)
  • 范围查询:O(log n + k)
  • 示例
ZADD rank 90 "Alice" 85 "Bob"
ZRANGE rank 0 1  # 返回 "Bob" "Alice"
  • 场景
  • 排行榜、优先级队列。

2. 其他数据结构(扩展)

  • Bitmap
  • 字符串变种,按位操作。
  • SETBIT, BITCOUNT
  • 场景:统计活跃用户。
  • HyperLogLog
  • 概率统计基数。
  • PFADD, PFCOUNT
  • 场景:UV 计算。
  • Geo
  • 有序集合扩展,地理位置。
  • GEOADD, GEODIST
  • 场景:附近的人。

3. 底层优化

  • SDS:长度记录,O(1) 获取长度。
  • Ziplist:连续内存,小数据节省空间。
  • Quicklist:链表 + ziplist,平衡性能。
  • Intset:整数优化,小集合高效。
  • Skiplist:多层索引,快速排序。

4. 延伸与面试角度

  • 与传统数据库
  • Redis 内存操作,复杂度低。
  • 实际应用
  • String:Session 缓存。
  • Hash:购物车。
  • List:消息队列。
  • Set:好友列表。
  • ZSet:实时排名。
  • 面试点
  • 问“结构”时,提五种及复杂度。
  • 问“实现”时,提 SDS 或跳表。

总结

Redis 提供 String、Hash、List、Set、ZSet 五大核心数据结构,底层用 SDS、字典、跳表等实现,高效支持多种场景。面试时,可提命令示例或场景应用,展示理解深度。