如何在Redis中存储数组对象并便捷查询指定键的祖先数据?
Redis存储与查询方案(针对给定JSON结构)
一、Redis存储方案
根据你的数据结构,推荐两种实用的存储方式,按需选择:
1. 使用Redis Hash结构(全版本兼容)
把整个数据集放在一个Hash里,R10、R11这类标识作为Hash的field,对应的value是该field下所有ancestors数据的JSON序列化字符串。
存储命令示例:
# 存储R10的数据 HSET your_dataset_key R10 '[{"ancestors": ["121", "122", "123"]}, {"ancestors": ["221", "222", "223"]}]' # 存储R11的数据 HSET your_dataset_key R11 '[{"ancestors": ["1121", "1122", "1123"]}, {"ancestors": ["1221", "1222", "1223"]}]' # 存储R12的数据 HSET your_dataset_key R12 '[{"ancestors": ["2121", "2122", "2123"]}, {"ancestors": ["2221", "2222", "2223"]}]'
这种方式的好处是能批量管理所有Rxx数据,单个field对应一组完整数据,查询和更新都很直接。
2. 使用Redis JSON模块(Redis 6.2+版本推荐)
如果你的Redis版本支持JSON模块,直接把整个JSON对象存入Redis的JSON类型键,保留原结构,后续可以用JSONPath直接查询指定字段,灵活性更高。
存储命令示例:
# 存入完整JSON结构 JSON.SET your_json_key $ '{"R10": [{"ancestors": ["121", "122", "123"]}, {"ancestors": ["221", "222", "223"]}], "R11": [{"ancestors": ["1121", "1122", "1123"]}, {"ancestors": ["1221", "1222", "1223"]}], "R12": [{"ancestors": ["2121", "2122", "2123"]}, {"ancestors": ["2221", "2222", "2223"]}]}'
这种方式能完全保留原数据结构,不需要额外序列化/反序列化,适合需要复杂查询的场景。
二、获取R10和R11的ancestors数据
针对上面两种存储方式,分别给出查询方法:
1. 基于Hash结构的查询
- 获取单个Rxx的ancestors数据:
HGET your_dataset_key R10
拿到结果后在应用层解析成对象,即可提取每个元素的ancestors数组。
- 批量获取R10和R11的数据:
HMGET your_dataset_key R10 R11
返回结果是两个序列化后的JSON字符串,对应R10和R11的完整数据。
2. 基于JSON模块的查询
- 获取R10的ancestors数据:
JSON.GET your_json_key $.R10
直接返回R10对应的数组结构,包含所有ancestors对象。
- 批量获取R10和R11的ancestors数据:
JSON.GET your_json_key $.R10 $.R11
返回包含R10和R11数据的JSON数组,无需额外解析外层结构。
- 如果只想提取所有ancestors的纯数组(忽略外层对象),可以用这个JSONPath路径:
# 获取R10下所有ancestors数组 JSON.GET your_json_key $.R10[*].ancestors
返回结果直接是[["121","122","123"],["221","222","223"]]这种结构,更简洁。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

