一、前言:为什么需要掌握"通用命令"?
Redis 提供了丰富的数据结构(String、Hash、List 等),每种都有专属命令。
但无论你操作哪种类型,都离不开一组跨类型的"通用命令"。
这些命令能帮你:
- 快速查看 key 是否存在
- 查询 key 的过期时间
- 删除或重命名 key
- 清空整个数据库
- 获取 key 的数据类型
掌握通用命令,是高效使用 Redis 的基础!
本文将为你系统梳理 10 个最常用的 Redis 通用命令,附带使用场景与避坑指南。
二、什么是"通用命令"?
通用命令(Generic Commands) 是指适用于所有 Redis 数据类型的操作命令,它们不关心 value 的具体结构,只作用于 key 本身。
无论你的 key 存的是字符串、哈希表还是有序集合,以下命令都能用!
三、十大核心通用命令详解
1️⃣ KEYS pattern ------ 模糊查询 key(慎用!)
bash
KEYS user:* # 查找所有以 "user:" 开头的 key
KEYS *order* # 包含 "order" 的 key
- 作用:按通配符查找 key
- 通配符 :
*:任意字符(如user:*)?:单个字符(如user:1?→ user:10, user:11)[abc]:匹配括号内任一字符
⚠️ 严重警告 :
生产环境禁止使用KEYS!它会遍历整个键空间 ,导致 Redis 阻塞(O(N) 时间复杂度)。
替代方案:使用
SCAN命令(非阻塞迭代)。
2️⃣ EXISTS key [key ...] ------ 判断 key 是否存在
bash
EXISTS user:1001 # 返回 1(存在)或 0(不存在)
EXISTS user:1001 order:2001 # 支持多个 key,返回存在的数量
- 用途:避免对不存在的 key 执行无效操作
- 性能:O(1),非常高效
✅ 推荐用法:在业务逻辑前先判断 key 是否存在
3️⃣ DEL key [key ...] ------ 删除一个或多个 key
bash
DEL user:1001
DEL user:1001 user:1002 order:2001
- 返回值:成功删除的 key 数量
- 注意:删除大 key(如百万元素的 List)会阻塞主线程!
💡 大 key 删除建议 :使用
UNLINK(异步删除,Redis 4.0+)
4️⃣ TYPE key ------ 查看 key 的数据类型
bash
TYPE user:1001
# 返回:string / hash / list / set / zset / stream 等
- 用途 :
- 调试时确认 key 类型
- 避免对错误类型执行命令(如对 String 执行
HGET)
✅ 实用技巧 :结合
EXISTS使用,确保 key 存在且类型正确
5️⃣ TTL key / PTTL key ------ 查询剩余生存时间
bash
TTL user:token:abc # 返回剩余秒数(-1=永不过期,-2=key不存在)
PTTL user:token:abc # 返回剩余毫秒数
- 典型场景 :
- 缓存预热
- 动态调整过期策略
- 监控 session 有效期
🔍 注意 :未设置过期时间的 key,
TTL返回-1
6️⃣ EXPIRE key seconds / PEXPIRE key milliseconds ------ 设置过期时间
bash
EXPIRE user:1001 3600 # 1 小时后过期
PEXPIRE order:2001 5000 # 5 秒后过期(毫秒)
- 用途:实现缓存自动失效、临时锁、验证码有效期等
- 返回值:1(设置成功)或 0(key 不存在)
💡 高级用法 :
SET key value EX 60可在设值时直接指定过期时间
7️⃣ RENAME key newkey / RENAMENX key newkey ------ 重命名 key
bash
RENAME old_key new_key # 直接重命名(会覆盖 new_key)
RENAMENX old_key new_key # 仅当 new_key 不存在时重命名
- 注意 :
RENAME是原子操作 - 风险:可能意外覆盖已有 key
✅ 安全建议 :优先使用
RENAMENX
8️⃣ FLUSHDB / FLUSHALL ------ 清空数据库(极度危险!)
bash
FLUSHDB # 清空当前数据库(默认 db0)
FLUSHALL # 清空所有数据库(db0 ~ db15)
- 用途:本地开发环境重置数据
- ⚠️ 生产环境绝对禁止!
🔐 安全建议:
在
redis.conf中重命名或禁用:
bashKEYS user:* # 查找所有以 "user:" 开头的 key KEYS *order* # 包含 "order" 的 key
9️⃣ SELECT index ------ 切换数据库(不推荐用于生产)
bash
> rename-command FLUSHALL ""
> rename-command FLUSHDB ""
>
- 说明 :Redis 默认提供 16 个逻辑数据库(0~15)
- 问题 :
- 无法跨库操作(如
MOVE性能差) - 集群模式不支持多 DB
- 无法跨库操作(如
- 最佳实践 :始终使用 db0 ,通过 key 命名空间隔离(如
user:1001,order:2001)
🔟 RANDOMKEY ------ 随机返回一个 key
bash
SELECT 0 # 使用 db0(默认)
SELECT 1 # 切换到 db1
- 用途 :
- 抽样调试
- 数据分析(配合
TYPE和TTL)
- 注意 :如果数据库为空,返回
(nil)
四、通用命令使用场景总结
| 场景 | 推荐命令 |
|---|---|
| 调试 key 是否存在 | EXISTS + TYPE |
| 查看过期时间 | TTL / PTTL |
| 安全删除 | DEL(小 key)或 UNLINK(大 key) |
| 本地开发清数据 | FLUSHDB(仅限本地!) |
| 缓存自动失效 | EXPIRE 或 SET key value EX N |
| 避免全量扫描 | 用 SCAN 替代 KEYS |
五、避坑指南:通用命令的常见误区
❌ 误区 1:在生产环境使用 KEYS *
后果 :Redis 主线程阻塞,服务雪崩!
正解 :使用SCAN命令分批迭代。
❌ 误区 2:频繁调用 TYPE 判断类型再操作
问题 :增加一次网络往返
正解:代码中明确 key 的类型,避免运行时判断。
❌ 误区 3:依赖多数据库(db1, db2...)
问题 :集群模式不支持,增加运维复杂度
正解:统一使用 db0,用 key 前缀区分业务。
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!