Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从Redis缓存中缓存的JSON API访问对象值?_Ruby On Rails_Ruby_Api_Caching_Redis - Fatal编程技术网

Ruby on rails 如何从Redis缓存中缓存的JSON API访问对象值?

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

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

Redis本机不支持在其值内修改JSON文档;这样做有一些方法,但最有可能的是,您需要反序列化当前值(
doc=redis.get('A')
),修改它(
doc['name']='foo'
),然后重新序列化并将其存储回redis(
redis.set('A',JSON.encode(doc))

但是,如果您有兴趣大规模使用JSON文档,或者在数据库中查询JSON文档的值,我强烈建议您使用NoSQL JSON文档存储(例如MongoDB),或者利用Postgres新的ish原生JSON支持

此外,您关于“允许前端开发人员更新Rails堆栈之外的缓存”的评论也有点令人担忧;如果您将对数据库(无论是Redis、Mongo还是Postgres)的写访问权直接暴露在前端,那么您就有可能面临一系列安全问题。如果您需要这种功能,并且希望像您建议的那样修改JSON文档,您可能会发现最好使用--它是为直接客户端访问而设计的,本机使用JSON,并且有很多可用的支持和工具


Redis本机不支持在其值内修改JSON文档

罗伯特·努贝尔说得对,但要实现这一点,你有两个可行的选择:

  • 服务器端Lua脚本-Redis的Lua沙盒随库提供。您可以使用它从嵌入的序列化JSON字符串中提取/更新任何元素,而无需网络惩罚。你可以在网站上找到很多这样做的脚本

  • Redis模块——上述脚本是新开发的Redis模块的一部分(非必要),该模块为Redis提供了原生JSON数据类型。该模块仍处于预览模式,但我相信它将在不久的将来成为GA,并添加了一些功能(discoverage-author here;))。您可以在中找到Redis的JSON数据类型ReJSON,并确保检查


  • 基本上是准确的-你可以使用Lua来避免至少一些痛苦。此外,这方面最近也有一些进展——请查看我的答案以了解更多细节。谢谢你的意见。如果我可能会问,选择反序列化方法或使用数据库(MongoDB/PG)有什么好处?本地反序列化和重新序列化需要您从服务器下载并上传完整的JSON正文,这会增加带宽和网络成本。所以如果你做了很多,那不是一个好的选择@不过,ItamarHaber在如何继续使用Redis来做你想做的事情方面有很好的观点。当你写“你可能会暴露自己面临一系列安全问题”时。你主要谈论的是什么样的安全问题?你有可能让恶意用户操纵你的数据库超出你的允许范围。例如,如果您的Redis服务器正在存储post数据,并且您通过带有静态凭据的Javascript公开连接,则用户可以执行Javascript来更改不是他们自己的post。您需要将每个用户、每个会话的凭据(即令牌)传递给浏览器,并使用某种方法确保令牌只允许用户修改自己的文档。将此类逻辑移动到API中通常更容易。