Redis数据结构

Redis五种数据结构概览

类型 说明 重要度
String(字符串) 最基础类型,二进制安全,最大 512MB ⭐⭐⭐⭐⭐
Hash(哈希) map容器,适合存储对象 ⭐⭐⭐⭐
List(列表) 双向链表,支持两端操作 ⭐⭐⭐⭐
Set(集合) 无序唯一,支持交集/并集/差集 ⭐⭐⭐⭐
Sorted Set(有序集合) 带分数的唯一集合,支持排名 ⭐⭐⭐⭐⭐

Key 设计规范

规范 说明
不要过长 最好不超过1024字节,否则消耗内存且降低查找效率
不要过短 太短会降低可读性
统一命名规范 项目中建议统一前缀或分隔符

String(字符串)

  • 最基础的数据存储类型
  • 二进制安全,存入和获取数据相同
  • 最大容量:512MB

常用命令

赋值与取值

1
2
3
SET key value          # 设置值,存在则覆盖,返回 OK
GET key # 获取值,不存在返回 nil
GETSET key value # 先获取再设置(原子操作)

删除

1
DEL key                # 删除指定key

数值增减

1
2
3
4
INCR key               # 原子递增1,不存在则初始为0
DECR key # 原子递减1,不存在则初始为0
INCRBY key increment # 原子增加指定值
DECRBY key decrement # 原子减少指定值

扩展命令

1
2
APPEND key value       # 追加字符串到原值末尾
STRLEN key # 获取字符串长度

使用场景

场景 说明
缓存 最简单的KV缓存
计数器 INCR/DECR 原子操作
分布式锁 SETNX + EXPIRE
Session存储 用户会话信息

Hash(哈希)

  • 类似Java 的 Map,String Key + String Value
  • 适合存储对象信息(用户名、密码、年龄等)
  • 每个 Hash 可存储 4294967295 个键值对
  • 字段少时占用空间少

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 赋值
HSET key field value # 设置单个字段
HMSET key field value [field2 value2...] # 设置多个字段

# 取值
HGET key field # 获取单个字段
HMGET key field [field...] # 获取多个字段
HGETALL key # 获取所有字段

# 删除
HDEL key field [field...] # 删除一个或多个字段
DEL key # 删除整个hash

# 其他
HEXISTS key field # 判断字段是否存在
HINCRBY key field increment # 字段值增加指定值
HLEN key # 获取字段数量

使用场景

场景 说明
用户信息存储 用户ID为key,字段存储用户名、邮箱等
商品详情 商品ID为key,存储价格、库存、描述

List(列表)

  • 按插入顺序排序的字符串链表
  • 支持在头部(left)和尾部(right)添加元素
  • 最大元素数量:4294967295
  • 两端插入/删除效率最高(O(1))
  • 中间插入/删除效率低(O(n))

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 两端添加
LPUSH key value [value...] # 头部插入,返回元素个数
RPUSH key value [value...] # 尾部插入

# 查看列表
LRANGE key start stop # 获取范围元素(0起始,-1为尾部)

# 两端弹出
LPOP key # 弹出头部元素
RPOP key # 弹出尾部元素

# 获取长度
LLEN key # 返回列表元素数量

扩展命令

1
2
3
4
5
LINDEX key index                  # 按索引获取元素
LSET key index value # 按索引设置元素
LREM key count value # 删除元素(count>0从头,count<0从尾,count=0全部)
LTRIM key start stop # 修剪列表到指定范围
RPOPLPUSH source destination # 弹出尾部并压入另一列表头部

使用场景

场景 说明
消息队列 LPUSH生产 + RPOP消费
栈/队列 同向操作实现栈,反向实现队列
最新评论 LPUSH新评论 + LTRIM限制数量
消息可靠性 RPOPLPUSH主队列→备份队列,处理完再删除

Set(集合)

  • 没有排序的字符集合
  • 不允许重复元素
  • 操作时间复杂度:O(1)
  • 最大元素数量:4294967295
  • 支持服务端聚合运算(交集、并集、差集)

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 添加/删除
SADD key member [member...] # 添加成员
SREM key member [member...] # 删除成员

# 获取成员
SMEMBERS key # 获取所有成员
SISMEMBER key member # 判断是否属于集合(1存在,0不存在)

# 集合运算
SDIFF key1 key2 # 差集(属于A不属于B)
SINTER key1 key2 # 交集(属于A且属于B)
SUNION key1 key2 # 并集(属于A或属于B)

# 其他
SCARD key # 获取成员数量
SRANDMEMBER key [count] # 随机返回成员

使用场景

场景 说明
唯一IP统计 博客访问量,Set自动去重
共同好友 SINTER计算两个用户的共同关注
标签系统 文章标签去重、交集推荐
抽奖系统 SRANDMEMBER随机抽取

Sorted Set(有序集合)

  • 与Set 相似但每个成员有分数(score)关联
  • 根据分数从小到大排序
  • 成员唯一,分数可重复
  • 时间复杂度:O(log n)

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 添加元素
ZADD key score member [score2 member2...] # 返回新增元素个数

# 获取分数
ZSCORE key member # 返回指定成员的分数

# 获取数量
ZCARD key # 获取成员数量

# 删除元素
ZREM key member [member...] # 移除指定成员

# 范围查询
ZRANGE key start stop [WITHSCORES] # 按索引升序返回
ZREVRANGE key start stop [WITHSCORES] # 按索引降序返回

# 按分数范围删除
ZREMRANGEBYRANK key start stop # 按排名范围删除
ZREMRANGEBYSCORE key min max # 按分数范围删除

扩展命令

1
2
3
4
5
ZINCRBY key increment member              # 成员分数增加指定值
ZRANK key member # 返回成员排名(从0开始,升序)
ZREVRANK key member # 返回成员排名(降序)
ZCOUNT key min max # 统计分数在范围内的成员数
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] # 按分数降序+分页

使用场景

场景 说明
游戏排行榜 ZADD更新分数,ZRANGE获取TOP10
微博热搜 分数为热度,范围查询热帖
索引数据 按时间/分数排序的索引查询
延迟队列 分数设为过期时间戳

Keys 通用操作

常用命令

1
2
3
4
5
6
7
8
9
KEYS pattern                    # 匹配keys,*任意字符,?单个字符
DEL key1 key2... # 删除指定keys
EXISTS key # 判断key是否存在(1存在,0不存在)
EXPIRE key seconds # 设置过期时间(秒)
TTL key # 获取剩余 TTL(-1无过期,-2不存在)
TYPE key # 获取key的类型
MOVE key db # 将key迁移到其他数据库
FLUSHDB # 删除当前库所有key
FLUSHALL # 删除所有库所有key