*Redis KEY 命令

KEY 是 Redis 中与键(key)管理相关的命令分类,包括键的查找、删除、过期、重命名、迁移等操作。


*语法

KEY 类命令包含以下常用命令:

KEYS pattern
DEL key [key ...]
UNLINK key [key ...]
EXISTS key [key ...]
EXPIRE key seconds [NX | XX | GT | LT]
PEXPIRE key milliseconds [NX | XX | GT | LT]
EXPIRETIME key
PEXPIRETIME key
TTL key
PTTL key
PERSIST key
RENAME key newkey
RENAMENX key newkey
TYPE key
RANDOMKEY
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
MOVE key db
MIGRATE host port key destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]]
DUMP key
RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
RESTORE-ASKING key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
OBJECT ENCODING key
OBJECT FREQ key
OBJECT IDLETIME key
OBJECT REFCOUNT key
TOUCH key [key ...]
WAIT numreplicas timeout
WAITAOF numlocal numreplicas timeout

*参数说明

参数 类型 必填 说明
key String 是 键名
pattern String 是 模式匹配字符串,支持 * ? []
seconds Integer 是 过期时间(秒)
milliseconds Integer 是 过期时间(毫秒)
cursor Integer 是 SCAN 游标
newkey String 是 新键名
db Integer 是 数据库索引
host String 是 目标主机
port Integer 是 目标端口
timeout Integer 是 超时时间(毫秒)
serialized-value String 是 DUMP 序列化的值

*返回值

  • KEYS: 匹配的键名数组
  • DEL/UNLINK: 删除的键数量(Integer)
  • EXISTS: 存在的键数量(Integer)
  • EXPIRE/PEXPIRE: 1 成功,0 失败
  • TTL/PTTL: 剩余秒数/毫秒数,-1 无过期,-2 不存在
  • PERSIST: 1 成功,0 失败或键不存在
  • RENAME: OK
  • RENAMENX: 1 成功,0 目标已存在
  • TYPE: 键类型(String/Hash/List/Set/ZSet/Stream/None)
  • RANDOMKEY: 随机键名或 Nil
  • SCAN: 新游标和键名数组
  • SORT: 排序结果数组或存储的元素数量
  • MOVE: 1 成功,0 失败
  • MIGRATE: OK
  • DUMP: 序列化的值(String)
  • RESTORE/RESTORE-ASKING: OK
  • OBJECT ENCODING: 编码类型(String)
  • OBJECT FREQ: 访问频率(Integer)
  • OBJECT IDLETIME: 空闲时间(秒,Integer)
  • OBJECT REFCOUNT: 引用计数(Integer)
  • TOUCH: 被 touch 的键数量(Integer)
  • WAIT: 确认同步的副本数量(Integer)
  • WAITAOF: 确认写入 AOF 的副本数量(Integer)

*时间复杂度

  • KEYS: O(N),N 为数据库键总数,生产环境禁用
  • DEL/UNLINK: O(N),N 为删除的键数量
  • EXISTS/EXPIRE/TTL/TYPE: O(1) - SCAN: O(1) 每步 + O(N) 匹配
  • SORT: O(N+M*log(M)),N 为列表/集合大小,M 为返回元素数
  • MIGRATE: O(1) 传输,O(N) 删除源键
  • DUMP/RESTORE: O(N),N 为序列化值大小
  • WAIT/WAITAOF: O(1) ---

*示例

*查找键

> KEYS user:*
1) "user:1001"
2) "user:1002"
> SCAN 0 MATCH user:* COUNT 10
1) "17"
2) 1) "user:1001"
   2) "user:1002"

*过期管理

> EXPIRE session:123 3600
(integer) 1
> TTL session:123
(integer) 3599
> PERSIST session:123
(integer) 1

*键迁移

> DUMP mykey
"\x00\x05hello\x06\x00\x8f-\x83\xeb\x0c\xba\x89\xee"
> RESTORE newkey 0 "\x00\x05hello\x06\x00\x8f-\x83\xeb\x0c\xba\x89\xee"
OK

*对象信息

> OBJECT ENCODING mykey
"embstr"
> OBJECT IDLETIME mykey
(integer) 120
> OBJECT REFCOUNT mykey
(integer) 1

*同步确认

> WAIT 1 5000
(integer) 1
> WAITAOF 1 1 5000
(integer) 1

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 检查参数
ERR no such key 键不存在 确认键名正确
ERR source and destination objects are the same RENAME 新旧名相同 使用不同名称
ERR keys in request don't hash to the same slot 集群中键不在同一槽 确保键哈希到同一槽

*最佳实践

  • 生产环境禁用 KEYS,使用 SCAN 替代遍历
  • 删除大 key 使用 UNLINK 而非 DEL,避免阻塞
  • 设置过期时间防止缓存永不过期
  • MIGRATE 用于集群间键迁移或数据迁移
  • DUMP/RESTORE 用于备份和恢复单个键
  • 使用 OBJECT 命令分析内存使用和编码优化
  • WAIT 用于确保数据同步到指定副本数
  • WAITAOF 用于确保数据写入 AOF(Redis 7.2+)

*FAQ

Q1: KEYS 和 SCAN 有什么区别? A: KEYS 阻塞服务器,生产环境禁用;SCAN 非阻塞,安全遍历。

Q2: DEL 和 UNLINK 有什么区别? A: DEL 同步删除,阻塞;UNLINK 异步后台删除,立即返回。

Q3: 如何取消键的过期时间? A: 使用 PERSIST key。

Q4: RENAME 会覆盖已存在的目标键吗? A: 会,使用 RENAMENX 可避免覆盖。

Q5: WAIT 和 WAITAOF 有什么区别? A: WAIT 等待副本确认复制;WAITAOF 等待本地和副本的 AOF 持久化确认。