旧版本Redis无原生JSON指令时如何按id获取存储的序列化JSON数据
旧版本Redis序列化JSON存储后按id字段查询的解决方案
你之前执行GET id:123无返回的核心原因是你并未以id:123为键存储数据,你的id字段存在序列化后的JSON字符串值内部,原生Redis默认不支持对字符串值的内容做字段级查询匹配,可采用以下方案解决:
方案1:自建二级索引(生产环境最优方案)
这是性能最高、资源消耗最低的实现方式,写入数据时同步维护索引KV即可:
- 写入主数据的同时,新增一条id到主数据键的映射索引,建议用事务包裹保证一致性,示例操作:
MULTI SET user:{你的业务主键} "{\"id\":\"123\",\"person\":\"Joe\"}" SET index:user:id:123 user:{你的业务主键} EXEC
- 查询时先查索引拿到主数据键,再查主数据即可:
// 第一步获取主数据键 GET index:user:id:123 // 第二步用返回的主数据键查询完整内容 GET user:{你的业务主键}
方案2:全量扫描匹配(仅适合小数据量应急场景)
如果已经存在存量数据无法补建索引,且数据总量很小,可以用扫描方式查询,禁止在生产大数据量场景使用:
- 使用
SCAN命令遍历所有相关键(不要使用KEYS命令,会导致Redis实例阻塞),对每个返回的键取值后在应用层解析JSON匹配id字段,示例流程:
- 扫描符合前缀的键:
SCAN 0 MATCH user:* COUNT 100 - 对每一个返回的键执行
GET <键名>,解析JSON字符串的id字段和目标值比对,匹配成功即为目标键。
可选优化:改用Hash结构存储
如果后续需要频繁查询单个字段,可将原JSON的字段拆分为Hash结构存储,无需每次解析完整JSON:
HSET user:1001 id 123 person Joe
按id查询依然需要配合上述二级索引方案使用,查询单个字段时可直接用HGET user:1001 person取值。
内容的提问来源于stack exchange,提问作者lakeIn231
相关产品推荐
相关产品推荐

