Redis数据结构
Redis五种数据结构概览
| 类型 | 说明 | 重要度 |
|---|---|---|
| String(字符串) | 最基础类型,二进制安全,最大 512MB | ⭐⭐⭐⭐⭐ |
| Hash(哈希) | map容器,适合存储对象 | ⭐⭐⭐⭐ |
| List(列表) | 双向链表,支持两端操作 | ⭐⭐⭐⭐ |
| Set(集合) | 无序唯一,支持交集/并集/差集 | ⭐⭐⭐⭐ |
| Sorted Set(有序集合) | 带分数的唯一集合,支持排名 | ⭐⭐⭐⭐⭐ |
Key 设计规范
| 规范 | 说明 |
|---|---|
| 不要过长 | 最好不超过1024字节,否则消耗内存且降低查找效率 |
| 不要过短 | 太短会降低可读性 |
| 统一命名规范 | 项目中建议统一前缀或分隔符 |
String(字符串)
- 最基础的数据存储类型
- 二进制安全,存入和获取数据相同
- 最大容量:512MB
常用命令
赋值与取值
1 | SET key value # 设置值,存在则覆盖,返回 OK |
删除
1 | DEL key # 删除指定key |
数值增减
1 | INCR key # 原子递增1,不存在则初始为0 |
扩展命令
1 | APPEND key value # 追加字符串到原值末尾 |
使用场景
| 场景 | 说明 |
|---|---|
| 缓存 | 最简单的KV缓存 |
| 计数器 | INCR/DECR 原子操作 |
| 分布式锁 | SETNX + EXPIRE |
| Session存储 | 用户会话信息 |
Hash(哈希)
- 类似Java 的 Map,String Key + String Value
- 适合存储对象信息(用户名、密码、年龄等)
- 每个 Hash 可存储 4294967295 个键值对
- 字段少时占用空间少
常用命令
1 | # 赋值 |
使用场景
| 场景 | 说明 |
|---|---|
| 用户信息存储 | 用户ID为key,字段存储用户名、邮箱等 |
| 商品详情 | 商品ID为key,存储价格、库存、描述 |
List(列表)
- 按插入顺序排序的字符串链表
- 支持在头部(left)和尾部(right)添加元素
- 最大元素数量:4294967295
- 两端插入/删除效率最高(O(1))
- 中间插入/删除效率低(O(n))
常用命令
1 | # 两端添加 |
扩展命令
1 | LINDEX key index # 按索引获取元素 |
使用场景
| 场景 | 说明 |
|---|---|
| 消息队列 | LPUSH生产 + RPOP消费 |
| 栈/队列 | 同向操作实现栈,反向实现队列 |
| 最新评论 | LPUSH新评论 + LTRIM限制数量 |
| 消息可靠性 | RPOPLPUSH主队列→备份队列,处理完再删除 |
Set(集合)
- 没有排序的字符集合
- 不允许重复元素
- 操作时间复杂度:O(1)
- 最大元素数量:4294967295
- 支持服务端聚合运算(交集、并集、差集)
常用命令
1 | # 添加/删除 |
使用场景
| 场景 | 说明 |
|---|---|
| 唯一IP统计 | 博客访问量,Set自动去重 |
| 共同好友 | SINTER计算两个用户的共同关注 |
| 标签系统 | 文章标签去重、交集推荐 |
| 抽奖系统 | SRANDMEMBER随机抽取 |
Sorted Set(有序集合)
- 与Set 相似但每个成员有分数(score)关联
- 根据分数从小到大排序
- 成员唯一,分数可重复
- 时间复杂度:O(log n)
常用命令
1 | # 添加元素 |
扩展命令
1 | ZINCRBY key increment member # 成员分数增加指定值 |
使用场景
| 场景 | 说明 |
|---|---|
| 游戏排行榜 | ZADD更新分数,ZRANGE获取TOP10 |
| 微博热搜 | 分数为热度,范围查询热帖 |
| 索引数据 | 按时间/分数排序的索引查询 |
| 延迟队列 | 分数设为过期时间戳 |
Keys 通用操作
常用命令
1 | KEYS pattern # 匹配keys,*任意字符,?单个字符 |