
Redis 键可能存储字符串、列表、集合、哈希或有序集合等不同数据类型,直接调用 get() 会因类型不匹配报 WRONGTYPE 错误;正确做法是先用 type() 判断类型,再选用对应命令读取。
redis 键可能存储字符串、列表、集合、哈希或有序集合等不同数据类型,直接调用 `get()` 会因类型不匹配报 `wrongtype` 错误;正确做法是先用 `type()` 判断类型,再选用对应命令读取。
在 Redis 中,GET 命令仅适用于 字符串类型(string) 的键。当你对非字符串类型的键(如由 ASGI 框架创建的 asgi:group:* 键,通常为 Redis 列表或哈希)执行 GET 时,Redis 会明确拒绝并抛出 redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value。
✅ 正确做法:先判断类型,再选择读取方式
使用 redis.Redis.type(key) 可安全探测键的实际类型,返回值为字节字符串(如 b'string'、b'list'、b'hash'、b'set'、b'zset')。据此分支处理:
import redis
pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
r = redis.Redis(connection_pool=pool)
for key in r.keys():
key_name = key.decode('utf-8') # 转为可读字符串
key_type = r.type(key).decode('utf-8')
print(f"Key: {key_name} → Type: {key_type}")
try:
if key_type == 'string':
value = r.get(key)
print(f" Value: {value}")
elif key_type == 'list':
value = r.lrange(key, 0, -1) # 获取全部元素
print(f" List elements: {value}")
elif key_type == 'hash':
value = r.hgetall(key)
print(f" Hash fields & values: {value}")
elif key_type == 'set':
value = r.smembers(key)
print(f" Set members: {value}")
elif key_type == 'zset':
value = r.zrange(key, 0, -1, withscores=True)
print(f" Sorted set (scored): {value}")
else:
print(f" Unsupported type: {key_type}")
except Exception as e:
print(f" Error reading {key_name}: {e}")
⚠️ 注意事项
-
keys(*)在生产环境慎用:它会遍历全库,可能导致阻塞;建议改用scan()渐进式遍历; - 所有 Redis 返回的键/字段名默认为
bytes,需.decode('utf-8')转换为字符串以便阅读和调试; - ASGI 相关键(如
asgi:group:*)通常由 Channels 等框架内部管理,其结构为 Redis 列表(用于消息队列)或哈希(用于元数据),不应直接修改或删除,仅作诊断用途; - 若只需查看键值概览,可结合
redis-cli快速验证:redis-cli TYPE "asgi:group:348" redis-cli LRANGE "asgi:group:348" 0 -1 # 若为 list
掌握类型感知的访问逻辑,不仅能规避 WRONGTYPE 错误,更是安全、可靠操作 Redis 多类型数据的基础实践。











