2017-01-23 55 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