2016-03-30 31 views
4

我將一些數據緩存在redis中,如果它存在,則從redis讀取數據,否則從數據庫讀取數據並將數據寫入redis。如何更新數據庫後更新redis?

我發現有幾種方式更新數據庫。例如後更新的Redis:

  1. 一套鑰匙在Redis的更新DATEBASE後過期立即
  2. 更新Redis的。
  3. 將數據放入MQ並使用消費者更新redis。

我有點困惑,不知道如何選擇。

您能否告訴我每種方式的優點和缺點,最好告訴我其他更新redis的方式或推薦一些關於此問題的博客。

+1

您應該格式化您的問題,以便其他人可以輕鬆讀取它們。檢查我如何解決你的問題的身體,並在下次這樣做... –

+0

謝謝。下次我會注意。 –

+0

沒問題;)這只是以這種方式發佈問題,你很難得到答案! –

回答

4

實際的數據存儲和緩存應該使用你已經在你的問題中描述的第三種方法進行同步。

當您將數據添加到您的權威商店(即您的SQL數據庫)時,您需要將此數據排入某個服務總線或消息隊列,並讓某些異步服務使用某種後臺進程完成整個同步。

你不想陷入這種情況下(不使用服務總線和異步服務時):

  • 讓你的請求或處理慢,因爲用戶需要等到數據都存儲在你的數據庫和緩存。
  • 在高速緩存過程中有失敗的風險,並且無法擁有重試策略(通常是服務總線或某些消息隊列中的內置功能)。此外,此故障最終可能會導致部分緩存損壞或完全緩存損壞,您將無法自動輕鬆地安排某些任務來解決此問題。

關於使用Redis密鑰過期,這是一個好主意。由於Redis可以使用其內置機制過期密鑰,因此您不應該在整個後臺過程中實現密鑰過期。如果存在密鑰是因爲它仍然有效。

順便說一下,你不會總是在這種情況下(如果一個密鑰沒有過期,這意味着它不應該被覆蓋)。它可能取決於你的實際域名。

+0

非常感謝,這很有幫助:) –

+0

嗨,我有另外一個問題,如果我更新redis失敗或MQ故障,它會導致髒讀,我想知道如何處理髒讀?謝謝 –

+0

嘗試使用持久MQ與確認。 1.在redis失敗的情況下,不會對MQ發出迴應,因此它會自動重試。 2.在MQ故障的情況下,當MQ重新啓動時它會嘗試,因爲它是持久的(有點慢) – Raghavendra