Redis中实现Python风格嵌套字典结构失败,咨询原因及正确实现方式
Redis中实现Python风格嵌套字典结构失败,咨询原因及正确实现方式
嗨,我来帮你拆解下问题出在哪,以及怎么搞定你想要的嵌套结构存储~
为什么你的代码不工作?
主要是两个核心问题:
- Redis
hset的用法错了
你写的r.hset(f"{group}", json.dumps(mapping))不符合hset的参数规则:hset要么是hset(哈希键, 字段名, 字段值)的单字段设置,要么是传入一个{字段名: 字段值}的字典做批量设置。你现在只传了一个序列化后的JSON字符串,Redis会把它当成字段名,但没有对应的值,存储的结构完全不是你预期的样子。 - 存储结构不符合预期
你想把1、2、3作为哈希表的独立字段,每个字段对应{key: item}这样的小字典,但原代码是把整个mapping打包成一个大字符串存成了一个(错误的)字段,后续用hmget取['1','2','3']自然拿不到数据。
正确的实现方式
因为Redis本身不支持哈希表的字段值直接是另一个哈希表,所以我们需要用JSON序列化把嵌套字典转成字符串存储,读取时再反序列化回来。
1. 正确存储数据
import json import redis # 先初始化你的Redis连接(根据实际情况配置参数) r = redis.Redis(host='localhost', port=6379, db=0) mapping = {} for i, (key, item) in enumerate(sorted(total_activs.items()), start=1): # 把每个小字典序列化成JSON字符串,作为哈希表字段的值 mapping[str(i)] = json.dumps({key: item}) # 用批量设置的方式,把mapping里的键值对作为哈希表的字段和值 r.hset(f"{group}", mapping=mapping)
2. 正确读取并使用数据
# 读取指定字段 top_raw = r.hmget(f"{group}", ['1', '2', '3']) # 过滤不存在的字段(返回None的情况),并反序列化成Python字典 top_dicts = [json.loads(item) for item in top_raw if item is not None] print(top_dicts) # 输出: [{key_1: my_first_item}, {key_2: my_second_item}, ...] # 访问第一个元素的内容(如果需要动态获取key的话) first_key = next(iter(top_dicts[0].keys())) print(top_dicts[0][first_key]) # 输出: my_first_item
这样就能实现你想要的:把类似{1: {key1: item1}, 2: {key2: item2}}的结构存在Redis哈希表中,后续可以读取指定字段并操作嵌套字典。
备注:内容来源于stack exchange,提问作者Yuniversia
相关产品推荐
相关产品推荐

