Redis 通用命令

一、前言:什么是 Redis 通用命令?

Redis 提供了丰富的数据结构操作命令(如 HSETLPUSHZADD 等),但除此之外,还有一类不依赖具体数据类型 的命令------通用命令(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:

bash 复制代码
EXISTS 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


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. RENAMERENAMENX ------ 安全重命名

bash 复制代码
# 直接重命名(会覆盖目标 Key!)
RENAME temp_config final_config

# 仅当 final_config 不存在时才重命名(安全)
RENAMENX temp_config final_config

⚠️ 注意:RENAME 是原子操作,但会覆盖同名 Key,谨慎使用!


7. FLUSHDBFLUSHALL ------ 清空数据(极度危险!)

bash 复制代码
# 清空当前数据库(默认 DB 0)
FLUSHDB

# 清空所有 16 个数据库
FLUSHALL

🔒 生产环境绝对禁止直接执行!

如需清空,建议:

  1. 在配置中禁用:rename-command FLUSHDB ""
  2. 使用脚本 + 权限控制
  3. 通过 UNLINK + SCAN 逐步删除

四、通用命令使用最佳实践

✅ 推荐做法:

  1. 避免 KEYS * → 改用 SCAN
  2. 删除大 Key 用 UNLINK → 避免阻塞
  3. 所有缓存设 TTL → 防止内存爆炸
  4. Key 命名规范 → 如 业务:实体:id(便于 KEYS user:* 调试)
  5. 禁用危险命令 → 在 redis.conf 中重命名或屏蔽

❌ 高危操作清单:

操作 风险 替代方案
KEYS * 阻塞主线程 SCAN
FLUSHDB/ALL 数据全丢 脚本分批删除
DEL big_key 服务卡顿 UNLINK
无 TTL 的缓存 内存泄漏 SETEXEXPIRE

五、实战:用通用命令排查问题

场景:用户反馈"登录态失效快"

排查步骤

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 运维和调试的"瑞士军刀"!


六、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
IT邦德2 小时前
PostgreSQL 通过 mysql_fdw连通MySQL实战
数据库·mysql·postgresql
hanqunfeng2 小时前
(九)Redis 命令及数据类型 -- Set
数据库·redis·bootstrap
企业对冲系统官2 小时前
期货与期权一体化平台风险收益评估方法与模型实现
运维·服务器·开发语言·数据库·python·自动化
IT邦德2 小时前
PostgreSQL通过Oracle_FDW连通Oracle实战
数据库·postgresql·oracle
廋到被风吹走2 小时前
【数据库】【MySQL】分区表深度解析:架构设计与大数据归档实践
android·数据库·mysql
馨谙2 小时前
面试题----用户,组,su,su-,sudo,sudo-,nologin shell
java·前端·数据库
技术净胜2 小时前
Sharding-JDBC实现完整的分库分表步骤
数据库
哈哈老师啊2 小时前
Springboot企业办公信息化管理系统6z1v1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
编程大师哥2 小时前
如何在C++中使用Redis的事务功能?
开发语言·c++·redis