2012-06-01 46 views
5

在我當前的項目中,我將PostgreSQL作爲我的主DB,而Redis作爲一種從屬,例如,當某個用戶將另一個添加爲朋友時,首先將關係存儲在PostgreSQL中,然後Redis中的朋友列表將會被更新。當請求某個用戶的好友列表時,它將從Redis中取出,而不是從PostgreSQL中取出。我應該相信Redis的數據完整性嗎?

現在的問題是:當我更新Redis中的好友列表時,是否應該得到PostgreSQL的新副本,並用新副本替換Redis中的舊列表,或者是否應保留舊列表並僅將SADD用戶標識列表?後者當然最適合性能,但直觀上前者在保持數據完整性方面做得更好?如果使用像芹菜這樣的東西,第二種方法是否值得冒險?

回答

4

這與Redis無關。當您寫入兩個數據庫時,即使它們都單獨保證數據完整性,許多事情也會出錯。

爲了討論的緣故,請在您的問題中將Redis替換爲MySQL,然後問自己 - 數據完整性是否會受到影響?

你可能已經寫了Postgres,然後你的過程可以死而不寫入MySQL。或者也許有網絡中斷。或者也許MySQL停運了。在所有這些情況下,Postgres和MySQL將開始有所不同。

無論您替換整個記錄還是簡單地添加一行,都無關緊要。兩者都可能導致數據損壞。

如果您關心數據完整性,請將數據保存在一個權威系統中。否則,您需要一個two phase commit protocol

+1

+1 - 同意......並進一步指出/注意在這種情況下選擇使用redis作爲從服務器而不是主服務器對我來說似乎很奇怪。如果可伸縮性勝過這種情況下的一致性要求,爲什麼不使用redis作爲授權來源(如果單個服務器不處理負載,則設置垂直分片密鑰空間),然後複製到cassandra或其他水平可伸縮存儲中? – codemonkey

+0

@Sripathi,我完全知道你提到的問題,不管我選擇什麼方法,數據損壞都會以相同的速度發生,但是這是發生腐敗的唯一地方嗎?由於Redis不符合ACID標準,我想知道應該多長時間從主服務器重新構建數據,還是將其視爲ACID(當然是在這個特定的預案中)是可行的? – Jiaji

+0

@codemonkey事實上,我需要一致性,所以我選擇Postgres作爲master,因爲Redis數據可以從中重建,理論上發送給用戶的數據可以做成'幾乎'一致的。 – Jiaji

1

您應該評估一致性對您的應用程序的重要性,並從中獲取相關信息。如果你沒有提交,這聽起來不像任何人的哭聲。你可以有一個後臺進程,從PostgreSQL讀取數據並將其推回到Redis,最終清除任何不一致。或者,您可以查看從寫入主節點複製的讀取從屬PostgreSQL實例。這可以讓您更好地使用經過良好測試的同步技術來讀取可伸縮性。

+0

是的,我想在一致性和性能之間進行權衡這就是爲什麼我選擇Redis作爲奴隸。做一個不斷的數據迭代/重建似乎是安全的,但有點資源要求?事實上,Redis需要這麼多是我想知道的答案。 – Jiaji