2015-07-10 107 views
2

我想利用Redis的作爲從SQL Server檢索對象緩存,但我們有Web服務器的集羣和一致性是非常重要的。有沒有辦法在redis中緩存更新,以便在更新來自哪一行時,緩存會失效?在一個理想的世界中,我可以問redis的「widget-123」,如果我沒有得到它,我可以從sql server中加載「select * from widgets where id = 123」,創建該對象並將其存儲在redis中用於將來的請求,但如果修改了該行,SQL Server將能夠告訴redis使對應的密鑰無效,以便Web服務器知道獲取新實例。無效Redis的緩存時的SQL Server更新/觸發

是該功能可以使用觸發器或SQL經紀人

回答

1

如何在數據庫和代碼之間引入一個圖層。該圖層負責跟隨,並假設所有粗糙部分都經過此圖層。

  1. 你也許已經想通

請求 「的Widget-123」 - > |圖層(鍵存在)?從redis獲取:從db獲取並添加到redis | SQL Server

  1. 更新/刪除實體(id = 123) - > |圖層(鍵存在)?從redis驅逐| - > SQL Server。

這種方法可以給你一個很好的一致結果。但。

如果你仍然希望sql服務器應該推送細節,對不起,沒有客戶端(SQL不是通用的),可以告訴redis直接驅逐。但正如@Jeremy Bell所建議的那樣,您可以觸發一個可以寫入表格的觸發器,並且可以持續查詢此表格(通過石英類型)並推送所有ID的過期請求。但缺點是你可能得不到一個好的一致性,因爲在一個數據庫臨時表上的寫入和讀取可能是瓶頸,或者如果沒有照顧,甚至會出現問題(比賽或死鎖)。