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


六、结语

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

相关推荐
小饼干在学嘎瓦10 小时前
本地缓存和分布式缓存如何选择?
分布式·缓存
提笔了无痕10 小时前
RAG存储策略中.md格式的切片与存储怎么处理
数据库·ai·rag
陳土10 小时前
DuckDB精读——基于Getting started with DuckDB
数据库·oracle
凯瑟琳.奥古斯特11 小时前
数据库原理选择题精选
数据库·python·职场和发展
曹牧11 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
朝阳58112 小时前
MongoDB 副本集从零搭建到生产可用
数据库·mongodb
雨辰AI12 小时前
SpringBoot3 整合达梦 DM9 超详细入门实战|从零搭建可直接上线
数据库·微服务·架构·政务
我是一颗柠檬12 小时前
【MySQL全面教学】MySQL性能优化实战Day13(2026年)
数据库·后端·sql·mysql·性能优化·database
AI人工智能+电脑小能手13 小时前
【大白话说Java面试题 第84题】【Mysql篇】第14题:为什么用 InnoDB 存储引擎的表建议用整型的自增主键?
java·开发语言·数据库·mysql·面试
张彦峰ZYF13 小时前
检索增强生成(RAG)系统的基础:全面深入矢量数据库
数据库·大模型·rag