AWS ElasticCache Redis无JSON.MERGE时的JSON合并替代方案咨询
可行替代方案
针对AWS ElasticCache不支持JSON.MERGE的情况,有以下几个实际可行的方案:
1. 拆分JSON为细粒度键值对
把原JSON的各个层级字段拆成独立的Redis键,比如:
- 原
nm字段对应键cache:main:nm,值为null - 原
Count字段对应键cache:main:Count,值为10 - 原
srvData.bsc对应键cache:main:srvData:bsc,值为10000 - 原
srvData.blk.c对应键cache:main:srvData:blk:c,值为32
更新时直接对目标键执行SET操作,读取时用MGET批量获取所有相关键,再在客户端组装成完整JSON。如果需要原子更新多个字段,用Redis事务包裹多个SET命令即可。
这种方式完全避免了JSON合并的开销,单字段更新性能拉满,适合频繁更新部分字段的场景。
2. 用Redis Hash存储层级字段
把整个JSON结构转成Redis Hash,用下划线或冒号分隔层级作为Hash的字段名,比如:
HSET cache:main nm null Count 10 srvData_bsc 10000 srvData_blk_c 32 srvData_blk_pps_players "[30]"
更新时直接用HSET修改对应字段,读取时用HGETALL获取所有字段,再在客户端组装成JSON。
Hash的单个字段更新是原子操作,性能优异,而且不需要维护大量独立键,比细粒度键值对更易管理。
3. 解析待合并JSON,批量执行JSON.SET路径更新
既然ElasticCache支持JSON.SET,可以在客户端解析待合并的JSON,遍历所有叶子节点,生成对应的JSON.SET命令(指定更新路径),然后用Redis管道(Pipeline)批量执行。比如:
- 针对
srvData.bsc=10000,执行JSON.SET cache:main $.srvData.bsc 10000 - 针对
srvData.blk.c=32,执行JSON.SET cache:main $.srvData.blk.c 32 - 针对
srvData.blk.pps.players=[30],执行JSON.SET cache:main $.srvData.blk.pps.players "[30]"
如果需要保证这些更新的原子性,可以把所有JSON.SET命令打包成一个LUA脚本执行(LUA脚本在Redis中是原子执行的)。这种方式不需要修改现有缓存结构,只是多了客户端的JSON解析步骤,但性能远优于先GET再合并再SET的方案。
内容的提问来源于stack exchange,提问作者AG-Satbir
相关产品推荐
相关产品推荐

