Redis 五大核心数据结构详解
一、String(字符串)
特点:
- 最简单的数据类型,可存储文本、整数、浮点数
- 最大容量512MB
- 支持原子性操作(如INCR)
应用场景:
- 缓存HTML片段
- 计数器(文章阅读量)
- 分布式锁(SETNX)
常用命令:
# 增/改
SET user:1001 "Alice" # 设置值
MSET user:1001:age 25 user:1001:city Beijing # 批量设置
INCR article:1001:views # 自增计数器
# 查
GET user:1001 # 获取值
MGET user:1001:age user:1001:city # 批量获取
STRLEN user:1001 # 获取长度
# 删
DEL user:1001 # 删除键
二、List(列表)
特点:
- 双向链表结构
- 允许重复元素
- 插入时间复杂度O(1),索引访问O(n)
应用场景:
- 消息队列(LPUSH+BRPOP)
- 最新新闻排行(固定长度列表)
- 记录用户操作日志
常用命令:
# 增
LPUSH news:latest 1001 # 左插入
RPUSH user:1001:logs "login" # 右追加
LINSERT news:latest BEFORE 1001 1000 # 指定位置插入
# 查
LRANGE news:latest 0 9 # 获取前10条
LINDEX user:1001:logs 0 # 获取指定索引元素
LLEN news:latest # 获取长度
# 删
LPOP news:latest # 左删除
LTRIM news:latest 0 99 # 保留最新100条
三、Hash(哈希表)
特点:
- 键值对集合
- 适合存储对象
- 单个Hash最多存储2^32-1个字段
应用场景:
- 用户信息存储
- 商品属性存储
- 配置信息管理
常用命令:
# 增/改
HSET user:1001 name "Alice" # 设置字段
HMSET product:1001 price 299 stock 50 # 批量设置
# 查
HGET user:1001 name # 获取字段值
HMGET product:1001 price stock # 批量获取
HGETALL user:1001 # 获取所有字段
# 删
HDEL user:1001 age # 删除字段
DEL user:1001 # 删除整个Hash
四、Set(集合)
特点:
- 无序唯一元素集合
- 支持集合运算(交集/并集/差集)
- 最大元素数量2^32-1
应用场景:
- 标签系统(文章标签)
- 共同好友/关注
- 抽奖白名单
常用命令:
# 增
SADD article:1001:tags 科技 互联网 # 添加元素
# 查
SMEMBERS article:1001:tags # 获取所有元素
SISMEMBER article:1001:tags 科技 # 判断元素存在
SCARD article:1001:tags # 元素数量
# 删
SREM article:1001:tags 互联网 # 删除元素
SPOP lottery:users # 随机删除并返回
# 集合运算
SINTER user:1001:friends user:1002:friends # 共同好友
五、ZSet(有序集合)
特点:
- 元素关联score实现排序
- 元素唯一但score可重复
- 基于跳跃表+哈希表实现
应用场景:
- 实时排行榜
- 延迟队列(时间戳排序)
- 带权重的任务调度
常用命令:
# 增/改
ZADD leaderboard 1500 "PlayerA" # 添加元素
ZINCRBY leaderboard 300 "PlayerA" # 增加分数
# 查
ZRANGE leaderboard 0 9 WITHSCORES # 前10名
ZREVRANK leaderboard "PlayerA" # 获取逆序排名
ZCOUNT leaderboard 1000 2000 # 分数区间数量
# 删
ZREM leaderboard "PlayerB" # 删除元素
ZREMRANGEBYRANK leaderboard 0 -11 # 保留前10名
数据结构对比
类型 | 存储结构 | 时间复杂度 | 典型场景 |
---|---|---|---|
String | 简单文本 | O(1) 读写 | 缓存、计数器 |
List | 双向链表 | 头尾操作O(1) | 队列、最新列表 |
Hash | 哈希表 | 字段操作O(1) | 对象存储、配置管理 |
Set | 哈希表+数组 | 元素操作O(1) | 标签、去重集合 |
ZSet | 跳表+哈希表 | 插入O(logN) | 排行榜、优先级队列 |
最佳实践建议
-
String优化:
- 超过10KB的值考虑压缩存储
- 计数器使用INCR替代GET+SET
-
List使用技巧:
- 限制列表长度预防内存溢出
LTRIM chat:1001 0 999 # 保留最新1000条消息
-
Hash内存优化:
- 使用
HSCAN
替代HGETALL
遍历大Hash - 字段数控制在1000以内
- 使用
-
Set高级应用:
# 每日UV统计 SADD uv:20231001 1001 1002 PFCOUNT uv:20231001 # HyperLogLog优化
-
ZSet性能优化:
- 分数使用整数提升比较效率
- 定期清理过期数据
ZREMRANGEBYSCORE delay_queue 0 $(date +%s) # 清理已处理任务