一、前言:什么是 Redis 通用命令?
Redis 提供了丰富的数据结构操作命令(如 HSET、LPUSH、ZADD 等),但除此之外,还有一类不依赖具体数据类型 的命令------通用命令(Generic Commands)。
这些命令适用于所有类型的 Key,用于:
- 查询 Key 是否存在
- 查看 Key 的类型或过期时间
- 删除、重命名、移动 Key
- 清空数据库等管理操作
掌握通用命令,是安全、高效使用 Redis 的基础。本文将系统介绍最常用的 10+ 个通用命令,并附上实战示例与避坑指南。
二、常用 Redis 通用命令速览
| 命令 | 作用 | 时间复杂度 |
|---|---|---|
KEYS pattern |
查找所有匹配的 Key | O(N) ⚠️ |
EXISTS key [key ...] |
判断 Key 是否存在 | O(1) |
TYPE key |
返回 Key 的数据类型 | O(1) |
DEL key [key ...] |
删除一个或多个 Key | O(N) |
UNLINK key [key ...] |
异步删除 Key(推荐) | O(1) |
RENAME old_key new_key |
重命名 Key | O(1) |
RENAMENX old_key new_key |
仅当 new_key 不存在时重命名 | O(1) |
TTL key |
查看 Key 剩余生存时间(秒) | O(1) |
PTTL key |
查看剩余时间(毫秒) | O(1) |
EXPIRE key seconds |
设置 Key 过期时间 | O(1) |
PERSIST key |
移除 Key 的过期时间 | O(1) |
FLUSHDB |
清空当前数据库 | O(N) ⚠️ |
FLUSHALL |
清空所有数据库 | O(N) ⚠️ |
✅ 所有命令均支持单 Key 或多 Key 操作(部分命令)。
三、核心命令详解与实战示例
1. KEYS pattern ------ 模糊查询 Key(慎用!)
bash
# 查找所有以 "user:" 开头的 Key
KEYS user:*
# 查找所有 Key(危险!)
KEYS *
⚠️ 严重警告:
KEYS *会阻塞 Redis 主线程,在生产环境可能导致服务雪崩!- 替代方案 :使用
SCAN命令(非阻塞、分批遍历)
✅ 安全做法(开发/测试环境可用):
bash
# 使用 SCAN 替代 KEYS
SCAN 0 MATCH user:* COUNT 100
2. EXISTS key ------ 判断 Key 是否存在
bash
EXISTS user:1001
# 返回 1(存在)或 0(不存在)
💡 支持多 Key:
bashEXISTS user:1001 order:2024 session:abc # 返回存在的 Key 数量
典型场景:
- 缓存穿透防护(先查是否存在,再决定是否查 DB)
- 分布式锁状态检查
3. TYPE key ------ 查看 Key 的数据类型
bash
SET name "Redis"
HSET user:1001 age 28
TYPE name # 返回 string
TYPE user:1001 # 返回 hash
✅ 用途:调试时快速确认 Key 类型,避免用错命令(如对 String 执行
HGET)
4. DEL vs UNLINK ------ 删除 Key 的正确姿势
bash
# 同步删除(会阻塞)
DEL big_list_key
# 异步删除(推荐!)
UNLINK big_list_key
🔍 区别:
DEL:立即释放内存,大 Key 会导致主线程卡顿UNLINK:仅删除 Key 的引用,内存回收交由后台线程处理,不阻塞
✅ 生产建议 :优先使用 UNLINK,尤其是删除 List/Set/ZSet 等大对象时。
5. TTL / PTTL / EXPIRE ------ 管理 Key 的生命周期
bash
# 设置过期时间(1小时后自动删除)
SETEX token:abc 3600 "user_data"
# 查看剩余时间(秒)
TTL token:abc
# 返回 3590(表示还剩 3590 秒)
# 查看剩余时间(毫秒)
PTTL token:abc
# 移除过期时间,变为永久 Key
PERSIST token:abc
💡 最佳实践 :
所有缓存 Key 都应设置 TTL,防止内存泄漏!
6. RENAME 与 RENAMENX ------ 安全重命名
bash
# 直接重命名(会覆盖目标 Key!)
RENAME temp_config final_config
# 仅当 final_config 不存在时才重命名(安全)
RENAMENX temp_config final_config
⚠️ 注意:
RENAME是原子操作,但会覆盖同名 Key,谨慎使用!
7. FLUSHDB 与 FLUSHALL ------ 清空数据(极度危险!)
bash
# 清空当前数据库(默认 DB 0)
FLUSHDB
# 清空所有 16 个数据库
FLUSHALL
🔒 生产环境绝对禁止直接执行!
如需清空,建议:
- 在配置中禁用:
rename-command FLUSHDB ""- 使用脚本 + 权限控制
- 通过
UNLINK+SCAN逐步删除
四、通用命令使用最佳实践
✅ 推荐做法:
- 避免
KEYS *→ 改用SCAN - 删除大 Key 用
UNLINK→ 避免阻塞 - 所有缓存设 TTL → 防止内存爆炸
- Key 命名规范 → 如
业务:实体:id(便于KEYS user:*调试) - 禁用危险命令 → 在
redis.conf中重命名或屏蔽
❌ 高危操作清单:
| 操作 | 风险 | 替代方案 |
|---|---|---|
KEYS * |
阻塞主线程 | SCAN |
FLUSHDB/ALL |
数据全丢 | 脚本分批删除 |
DEL big_key |
服务卡顿 | UNLINK |
| 无 TTL 的缓存 | 内存泄漏 | SETEX 或 EXPIRE |
五、实战:用通用命令排查问题
场景:用户反馈"登录态失效快"
排查步骤:
bash
# 1. 查找 session Key
KEYS session:*
# 2. 检查是否存在
EXISTS session:abc123
# 3. 查看类型
TYPE session:abc123
# 4. 检查过期时间
TTL session:abc123 # 发现只有 300 秒!
# 5. 修正:延长过期时间
EXPIRE session:abc123 86400 # 设为 24 小时
🛠️ 通用命令是 Redis 运维和调试的"瑞士军刀"!
六、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!