在我的Rails应用程序中,我已经进入了将嵌套的API JSON对象存储为我的Redis键的值的阶段,例如。 " A&#34 ;.通过调用" A"的GET来访问整个对象。但是,如果我想更改对象的某个名称的值,我还需要做什么?由于我将整个JSON对象存储为Redis值,我是否需要创建一个新模型并在模型中复制相同的值并通过例如Postgres进行更改?或者有没有办法在JSON对象中定位一个特定值,该值存储为键的值" A"在Redis?如果是这样,我将如何创建路由以允许前端开发人员更新rails应用程序之外的缓存?
答案 0 :(得分: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,并且有很多提供支持和工具。
答案 1 :(得分:0)
Redis本身不支持在其值中修改JSON文档;
正确地说@Robert Nubel,但你确实有两个可行的替代方案来实现这个目标:
服务器端Lua脚本 - Redis' Lua沙箱随cjson
库一起提供。您可以使用它从嵌入的序列化JSON字符串中提取/更新任何元素,而不会产生网络问题。您可以在https://github.com/RedisLabsModules/rejson/tree/master/benchmarks/lua
Redis模块 - 上面提到的脚本是新开发的Redis模块的一个(非必要)部分,它为Redis提供本机JSON数据类型。该模块仍处于预览模式,但我相信它将成为GA并在不久的将来添加功能(披露 - 作者在这里;))。您可以在https://github.com/redislabsmodules/rejson找到Redis的JSON数据类型ReJSON,并务必查看comparative results vs. the Lua approach