2017-01-23 54 views
0

在我的Rails应用程序中,我已经到了将嵌套的API JSON对象存储为我的Redis键值的阶段,例如。 “一个”。通过调用“A”的GET来访问整个对象。但是,如果我想要更改某个特定名称的值,我需要做什么?由于我将整个JSON对象存储为Redis值,我是否需要创建新模型并在模型中复制相同的值并通过Postgres实例进行更改?或者,有没有一种方法可以针对在Redis中存储为键“A”的值的JSON对象中的特定值?如果是这样,我将如何创建路线以允许前端开发人员更新rails应用程序之外的缓存?如何从Redis缓存中的缓存JSON API访问对象值?

回答

0

Redis本身不支持修改其值中的JSON文档;有一些experimental plugins这样做,但最有可能的,您将需要反序列化当前值(doc = redis.get('A')),修改它(doc['name'] = 'foo'),然后重新串行化并将其存储回Redis(redis.set('A', JSON.encode(doc)))。但是,如果您有兴趣使用这种大规模的JSON文档,或者查询数据库中的JSON文档的值,我强烈建议您使用NoSQL JSON文档存储区(例如MongoDB ),或者利用Postgres的新本地JSON支持。另外,关于“允许前端开发人员更新Rails堆栈之外的缓存”的意见有点令人担忧;如果您直接向前端公开对数据库的写入访问权限(无论是Redis,Mongo还是Postgres),则可能会使自己面临一系列安全问题。如果你想要这种能力,并且想要修改你建议的JSON文档,你可以使用Firebase来获得最好的效果 - 它被设计用于直接的客户端访问,原生使用JSON,并且有很多可用的支持和工具。

+0

晴准确的 - 你总是可以使用Lua中,以避免至少一些痛苦的。此外,该领域也有一些近期的发展 - 请查阅我的答案以了解更多详情。 –

+0

感谢您的输入Robert。如果我问,选择反序列化方法还是使用数据库(MongoDB/PG)有什么好处? –

+0

本地反序列化和重新序列化将要求您下载完整的JSON主体并将其上传到服务器,这会增加带宽和网络成本。所以如果你做了很多,这不是一个好的选择。尽管如此,@ItamarHaber在你仍然可以使用Redis做你想做的事情方面有很好的观点。 –

0

Redis本身不支持修改其值中的JSON文档;

正确地说@Robert Nubel,但你必须实现两个可行的替代品:

  1. 服务器端Lua脚本 - Redis的Lua的沙箱随cjson库。您可以使用它从嵌入式序列化的JSON字符串中提取/更新任何元素,而无需网络支配。您可以在https://github.com/RedisLabsModules/rejson/tree/master/benchmarks/lua

  2. 上找到一堆脚本,它们可以做到这些脚本Redis模块 - 上述引用的脚本是为Redis提供本机JSON数据类型的新开发的Redis模块(非必要)的一部分。该模块仍处于预览模式,但我相信它会在不久的将来成为GA并加入功能(披露 - 此处作者))。您可以在https://github.com/redislabsmodules/rejson找到ReJSON,对Redis的JSON数据类型,一定要检查comparative results vs. the Lua approach