在我的Rails应用程序中,我已经到了将嵌套的API JSON对象存储为我的Redis键值的阶段,例如。 “一个”。通过调用“A”的GET来访问整个对象。但是,如果我想要更改某个特定名称的值,我需要做什么?由于我将整个JSON对象存储为Redis值,我是否需要创建新模型并在模型中复制相同的值并通过Postgres实例进行更改?或者,有没有一种方法可以针对在Redis中存储为键“A”的值的JSON对象中的特定值?如果是这样,我将如何创建路线以允许前端开发人员更新rails应用程序之外的缓存?如何从Redis缓存中的缓存JSON API访问对象值?
回答
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,并且有很多可用的支持和工具。
Redis本身不支持修改其值中的JSON文档;
正确地说@Robert Nubel,但你必须实现两个可行的替代品:
服务器端Lua脚本 - Redis的Lua的沙箱随
cjson
库。您可以使用它从嵌入式序列化的JSON字符串中提取/更新任何元素,而无需网络支配。您可以在https://github.com/RedisLabsModules/rejson/tree/master/benchmarks/lua上找到一堆脚本,它们可以做到这些脚本Redis模块 - 上述引用的脚本是为Redis提供本机JSON数据类型的新开发的Redis模块(非必要)的一部分。该模块仍处于预览模式,但我相信它会在不久的将来成为GA并加入功能(披露 - 此处作者))。您可以在https://github.com/redislabsmodules/rejson找到ReJSON,对Redis的JSON数据类型,一定要检查comparative results vs. the Lua approach
- 1. 访问缓存从缓存中缓存对象
- 2. Django:order_by API json值或缓存对象
- 3. Django Redis缓存值
- 4. Redis缓存结构
- 5. 可缓存对象缓存
- 6. Yii2 redis缓存在文件缓存中
- 7. 缓存访问
- 8. Asp.Net缓存,修改缓存中的对象,并更改缓存的值
- 9. 谷歌App Engine的内存缓存+如何从缓存中
- 10. Zend_View的缓存(Redis的)
- 11. Keycloak - Infinispan Redis缓存存储
- 12. 了解网页缓存(Redis)
- 13. Redis缓存结构用例
- 14. 排序redis缓存
- 15. Redis作为RDBMS的缓存
- 16. Django 1.9在Redis中缓存
- 17. Azure的Redis缓存错误
- 18. 用Symfony2缓存API缓存
- 19. Azure Redis缓存中的数据丢失
- 20. 什么是Azure Redis缓存?
- 21. C++ - 缓存对象
- 22. ASP.NET缓存对象
- 23. Jquery对象缓存
- 24. 缓存UserControl对象
- 25. 春季Redis的问题:从Redis的缓存GetAllCacheNames不与RedisCacheManager
- 26. 如何使用JavaScript访问缓存对象?
- 27. Azure Redis缓存序列化
- 28. ASP.NET UnauthorizedAccessException从缓存中访问项目
- 29. 在Application_AuthenticateRequest中缓存对象
- 30. 如何缓存渲染:json
晴准确的 - 你总是可以使用Lua中,以避免至少一些痛苦的。此外,该领域也有一些近期的发展 - 请查阅我的答案以了解更多详情。 –
感谢您的输入Robert。如果我问,选择反序列化方法还是使用数据库(MongoDB/PG)有什么好处? –
本地反序列化和重新序列化将要求您下载完整的JSON主体并将其上传到服务器,这会增加带宽和网络成本。所以如果你做了很多,这不是一个好的选择。尽管如此,@ItamarHaber在你仍然可以使用Redis做你想做的事情方面有很好的观点。 –