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


六、结语

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

相关推荐
Elastic 中国社区官方博客几秒前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.4 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐9 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999911 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学43 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
fengxin_rou1 小时前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
fengxin_rou1 小时前
黑马点评实战篇|第二篇:商户查询缓存
缓存