这个错误是 Redis 返回的经典错误,意思是:你用错了数据类型。
简单说就是:你对一个 key 执行了它当前数据类型不支持的 Redis 命令。
🧠 举个例子(看一眼就明白)
假设你执行了:
bash
SET mykey "hello"
这时 mykey 的数据类型是 String。
然后你执行:
bash
LPUSH mykey "world"
因为 LPUSH 只能用在 List 类型上,但 mykey 是 String,Redis 就会直接报错:
text
WRONGTYPE Operation against a key holding the wrong kind of value
🔍 为什么会出现这个错误?
根本原因只有一个:你在开发过程中,对同一个 key 使用了不同类型的数据操作,导致类型冲突。
常见场景:
| 缓存误用 | 某个 key 原本存了字符串,后面又当成 Hash / List 操作 |
| 业务演化 | 业务升级时改变了数据结构,但未清理旧 key |
| 多模块共用 key | 不同服务或模块共用了同一个 key,但用了不同的数据类型 |
| 手动操作失误 | 在 Redis CLI 中手动执行了错误命令 |
🛠 怎么解决?
第一步:查看 key 的当前类型
bash
TYPE mykey
或者看详细信息:
bash
DEBUG OBJECT mykey
第二步:根据类型决定处理方式
| 错误 key(数据已废弃) | 直接删除:DEL mykey,然后重新写入正确类型 |
| 关键 key(不可删除) | 用正确类型命令读取,修改代码使其与当前类型一致 |
| 需要保留数据但类型错误 | 使用正确的命令读取并转换后重新存储 |
📌 实战排查流程(Java 场景)
1. 查看当前类型
bash
redis-cli
> TYPE user:1001
> hash
2. 如果是 Hash,却用了 String 命令(比如 GET),需要改成 HGET 或 HMGET
bash
> HGETALL user:1001
3. 在 Java 代码中,确保 Redis 操作类型匹配
java
// ❌ 错误:类型不匹配
stringRedisTemplate.opsForValue().get("user:1001");
// ✅ 正确:如果是 Hash 类型
hashOperations.entries("user:1001");
⚠️ 如何避免这个问题?
统一 key 的命名规范:为不同类型加前缀,比如:
-
str:user:1001 (字符串)
-
hash:user:1001 (哈希)
-
list:queue:xxx (列表)
使用 SET 命令时带上类型标记
编写防御性代码:用 TYPE 命令检查类型后再操作,或者捕获异常
建立 Redis 数据字典:维护 key 的命名规范和数据类型文档
使用 Redis JSON 或结构化存储:如果可能,统一使用 Hash 或 JSON 格式,减少类型混杂
✅ 一句话总结
这个错误是 Redis 在提醒你:这个 key 里存的不是你以为的那个类型。用 TYPE 看一眼,再决定是删除重建、还是改用正确的命令。
如果你能告诉我:
-
报错的 key 名称
-
你执行的 命令
-
当前这个 key 预期存储的是什么类型数据


