注:本篇为苍穹外卖学习笔记
Redis 集合、有序集合与通用命令详解
本文将深入讲解 Redis 中 集合(Set)、有序集合(Sorted Set) 以及 通用操作命令,通过实际案例演示它们的核心用法。
一、集合(Set)操作命令
集合存储唯一、无序的元素,支持高效的集合运算(交集、并集等)。
核心命令与示例
# 添加/删除元素
sadd tags "python" "java" # 添加元素,返回成功插入数量(如 2)
srem tags "java" # 删除元素,返回删除数量(如 1)
# 查询操作
smembers tags # 返回所有元素(如 ["python"])
sismember tags "python" # 检查元素是否存在,返回 1(存在)或 0
# 集合运算
sadd group1 "a" "b" "c"
sadd group2 "b" "c" "d"
sinter group1 group2 # 交集,返回 ["b", "c"]
sunion group1 group2 # 并集,返回 ["a","b","c","d"]
sdiff group1 group2 # 差集(group1有而group2无),返回 ["a"]
# 随机操作
spop tags # 随机移除并返回一个元素(如 "python")
scard tags # 返回集合元素总数
应用场景:
- 标签系统(文章标签、商品分类)
- 好友关系(共同关注、可能认识的人)
- 唯一数据去重(抽奖用户ID存储)
二、有序集合(Sorted Set)操作命令
有序集合存储唯一元素,每个元素关联一个 score
(分数),按分数排序。
核心命令与示例
# 添加元素(格式:zadd 键 score1 成员1 score2 成员2)
zadd leaderboard 95 "userA" 80 "userB"
zadd leaderboard 90 "userC" # 更新userC分数(若存在则覆盖)
# 范围查询
zrange leaderboard 0 -1 # 按分数升序返回所有成员 ["userB", "userC", "userA"]
zrevrange leaderboard 0 -1 # 降序返回 ["userA", "userC", "userB"]
zrangebyscore leaderboard 85 100 # 返回分数在 [85,100] 的成员 ["userC", "userA"]
# 排名与分数操作
zrank leaderboard "userA" # 返回升序排名(从0开始),此处返回 2
zrevrank leaderboard "userA" # 降序排名,返回 0(第一名)
zscore leaderboard "userB" # 返回分数 80
# 删除操作
zrem leaderboard "userB" # 移除指定成员
zremrangebyrank leaderboard 0 0 # 删除升序排名第0的元素(最低分)
应用场景:
- 实时排行榜(游戏积分、热搜榜单)
- 延时队列(用分数存执行时间戳)
- 优先级任务调度(按权重调度任务)
三、通用操作命令
适用于所有 Redis 数据类型的常用命令。
核心命令与示例
# 键管理
keys user:* # 匹配所有以 user: 开头的键(生产环境慎用)
del user:1001 # 删除键,返回删除数量(如 1)
exists user:1001 # 判断键是否存在,返回 0 或 1
expire cache:data 3600 # 设置3600秒后过期
ttl cache:data # 查看剩余生存时间(秒),-1为永久,-2为已过期
# 数据类型查询
type user:1001 # 返回键的类型(如 hash/set/zset 等)
# 批量操作
scan 0 match user:* count 10 # 分页迭代查询键(安全替代 keys 命令)
# 数据库操作
select 1 # 切换到1号数据库(默认0-15)
flushdb # 清空当前数据库
flushall # 清空所有数据库(高危操作!)
注意事项:
KEYS
可能阻塞服务,生产环境推荐使用SCAN
FLUSHALL
会删除所有数据,需谨慎使用
四、数据结构对比速查
结构类型 | 核心特性 | 典型场景 |
---|---|---|
Set | 唯一元素、集合运算 | 标签系统、共同好友 |
Sorted Set | 有序元素、分数排序 | 排行榜、优先级任务 |
通用命令 | 跨类型操作 | 键管理、数据清理 |
通过合理运用这些命令,可以高效解决去重、排序、系统管理等常见需求。建议通过 Redis 官方提供的 redis-cli 工具进行实践练习。