
Redis 的 WRONGTYPE 错误源于对非字符串类型键误用 GET 命令;正确做法是先用 TYPE 判断数据类型,再选用对应命令(如 LRANGE、HGETALL、SMEMBERS 等)获取值。
redis 的 `wrongtype` 错误源于对非字符串类型键误用 `get` 命令;正确做法是先用 `type` 判断数据类型,再选用对应命令(如 `lrange`、`hgetall`、`smembers` 等)获取值。
Redis 并非仅支持字符串型数据,而是提供了五种核心数据类型:string(字符串)、list(列表)、set(集合)、hash(哈希)、zset(有序集合)。当你调用 redis.get(key) 时,Redis 仅允许该 key 对应的 value 类型为 string;若实际是 list(如 asgi:group:348 这类 Django Channels 默认使用的组广播键),则会抛出 redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value。
✅ 正确的通用排查流程如下:
-
确认键类型:使用
redis.type(key)获取类型(返回字节字符串,如b'list'); -
根据类型选择读取方法:
-
string→redis.get(key) -
list→redis.lrange(key, 0, -1)(获取全部元素) -
hash→redis.hgetall(key) -
set→redis.smembers(key) -
zset→redis.zrange(key, 0, -1, withscores=True)
-
? 示例代码(健壮性读取):
import redis
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
for key in r.keys():
key_str = key.decode('utf-8') # 转为可读字符串
key_type = r.type(key).decode('utf-8')
print(f"Key: {key_str} | Type: {key_type}")
try:
if key_type == 'string':
val = r.get(key)
elif key_type == 'list':
val = r.lrange(key, 0, -1)
elif key_type == 'hash':
val = r.hgetall(key)
elif key_type == 'set':
val = r.smembers(key)
elif key_type == 'zset':
val = r.zrange(key, 0, -1, withscores=True)
else:
val = f"<unsupported type:>"
print(f" Value: {val}")
except Exception as e:
print(f" Error reading {key_str}: {e}")</unsupported>
⚠️ 注意事项:
-
keys *在生产环境慎用(时间复杂度 O(N),可能阻塞 Redis),建议改用scan渐进式遍历; - 所有
redis-py返回值默认为bytes,需显式.decode()转换为str(尤其在 Python 3 中); - ASGI 组键(如
asgi:group:*)通常为list类型,用于暂存待广播的消息,因此必须用lrange或rpop/lpop操作,而非get。
? 总结:Redis 是类型敏感的存储系统,“先查 TYPE,再选命令” 是避免 WRONGTYPE 的黄金法则。将类型判断逻辑封装为工具函数,可显著提升代码健壮性与可维护性。











