← 中文资源

简体中文版本

Redis WRONGTYPE — 键持有的类型不符

通过检查键类型、使用匹配的命令,并按数据结构为键命名空间,修复 Redis WRONGTYPE。

阅读英文原文

症状

本篇指南处理“Redis WRONGTYPE — 键持有的类型不符”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • WRONGTYPE 操作针对的键持有错误类型的值
  • 命令对新键可用,对既有键失败
  • 部署改变键的存储方式后出现该错误

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

redis-cli TYPE cache:user:1

返回的类型(string、hash、list、set、zset)指明哪些命令可用。

步骤 2

redis-cli SET k v; redis-cli HSET k f v

第二条命令报 WRONGTYPE,证明该键是字符串而非 hash。

常见诱因(按出现频率排序):

  • 先存为字符串键,随后用 hash/list 命令操作(或反之)
  • 不同功能共用键名,却存储不同结构
  • 代码变更后旧键仍保留原类型

根因

Redis 键只有一种类型,在首次写入时确定。用其他类型的命令操作会抛 WRONGTYPE,这常揭示键名冲突或部署间的存储格式变更。

修复

使用与键类型匹配的命令,按结构为键加命名空间(user:1:profile 为 hash、user:1:token 为字符串),并在格式变更时迁移或删除陈旧键。

注意:对类型不符的键执行 DEL 会销毁数据;迁移时删除前应确认该键可安全移除。

# inspect before operating
redis-cli TYPE user:1:profile      # -> hash
redis-cli HGETALL user:1:profile

# namespace by structure to avoid collisions
redis-cli HSET user:1:profile name alice
redis-cli SET  user:1:token  abc123   # different key, string type

# migrate by writing the new type under the right key, then delete the old

验证

用正确类型重跑命令并确认成功;验证 TYPE 报告预期结构。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。