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


六、结语

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

相关推荐
r i c k2 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦16 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德1 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
期待のcode2 小时前
Redis的主从复制与集群
运维·服务器·redis
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存