Redis 数据结构及应用场景总结
Redis 数据结构及应用场景总结
Redis 支持多种数据结构,每种结构都有其独特的用途和适用场景。以下是 Redis 核心数据结构及其关键特性的总结:
1. String(字符串)
- 底层实现:简单动态字符串(SDS,Simple Dynamic String),支持二进制安全。
- 用途:
- 缓存文本、数值、二进制数据(如图片)。
- 计数器(
INCR
/DECR
)。 - 分布式锁(
SETNX
)。
- 示例命令:
1
2
3SET key value
GET key
INCR counter
2. List(列表)
- 底层实现:
- 早期:
ziplist
(压缩列表,内存紧凑)和linkedlist
(双向链表)。 - Redis 3.2+:统一为
quicklist
(链表 + ziplist 的混合结构)。
- 早期:
- 用途:
- 消息队列(
LPUSH
+BRPOP
)。 - 最新消息列表(按插入顺序存储)。
- 消息队列(
- 示例命令:
1
2
3LPUSH list value
RPOP list
LRANGE list 0 -1
3. Hash(哈希表)
- 底层实现:
ziplist
(字段较少时)或hashtable
(默认)。
- 用途:
- 存储对象(如用户信息,键对应多个字段)。
- 避免序列化开销(可单独修改字段)。
- 示例命令:
1
2HSET user:1 name "Alice"
HGET user:1 name
4. Set(集合)
- 底层实现:
intset
(元素为整数且数量较少时)或hashtable
(元素为字符串)。
- 用途:
- 去重存储(如标签、用户关注列表)。
- 集合运算(
SINTER
交集,SUNION
并集)。
- 示例命令:
1
2SADD tags "redis"
SMEMBERS tags
5. Sorted Set(有序集合)
- 底层实现:
ziplist
(元素较少时)或跳表(skiplist)
+hashtable
(支持快速范围查询和单键查找)。
- 用途:
- 排行榜(按分数排序)。
- 范围查询(如时间区间内的数据)。
- 示例命令:
1
2ZADD leaderboard 100 "user1"
ZRANGE leaderboard 0 10 WITHSCORES
6. 高级数据结构
6.1 Bitmaps
- 本质:基于 String 的位操作。
- 用途:
- 布尔统计(如用户每日签到)。
1
2SETBIT sign:user:2023 10 1 # 记录第10天签到
BITCOUNT sign:user:2023 # 统计总签到次数
6.2 HyperLogLog
- 用途:基数统计(如 UV 统计,误差约 0.81%)。
1
2PFADD uv:2023 "user1"
PFCOUNT uv:2023
6.3 Geospatial(地理空间)
- 底层实现:基于 Sorted Set 的 GeoHash 编码。
- 用途:地理位置查询(如附近的人)。
1
2GEOADD cities 116.40 39.90 "Beijing"
GEORADIUS cities 116 39 100 km
6.4 Stream
- 用途:消息队列(支持消费者组、消息持久化)。
1
2XADD mystream * field1 value1
XREAD COUNT 10 STREAMS mystream 0
7. 底层优化机制
- 编码转换:根据数据规模和类型自动切换底层结构(如 Hash 从
ziplist
转hashtable
)。 - 内存效率:优先使用紧凑结构(如
ziplist
)减少碎片。
选择数据结构的建议
- 高频更新:优先选择时间复杂度低的结构(如 Hash 代替多个 String)。
- 范围查询:使用 Sorted Set 或 List。
- 去重统计:Set 或 HyperLogLog(根据精度需求)。
Redis 数据结构及应用场景总结
https://liuyuhe666.github.io/2025/04/28/Redis-数据结构及应用场景总结/