注意:要知道經常修改的資料表不適合使用redis,因為雙刪策略執行的結果是把redis中儲存的那條資料刪除了,以後的查詢就都會去查詢資料庫。所以redis使用的是讀遠遠大於改的資料快取。
1,首先要理解在併發環境下redis資料一致性的問題所在
在多執行緒併發情況下,假設有兩個資料庫修改請求,為保證資料庫與redis的資料一致性,
修改請求的實現中需要修改資料庫後,級聯修改redis中的資料。
請求一:1.1修改資料庫資料 1.2 修改redis資料
請求二:2.1修改資料庫資料 2.2 修改redis資料
併發情況下就會存在1.1 ---> 2.1 ---> 2.2 ---> 1.2的情況
(一定要理解執行緒併發執行多組原子操作執行順序是可能存在交叉現象的)
此時存在的問題就是:
1.1修改資料庫的資料最終儲存到了redis中,2.1在1.1之後也修改了資料庫資料。
此時出現了redis中資料和資料庫資料不一致的情況,在後面的查詢過程中就會長時間去先查redis,
從而出現查詢到的資料並不是資料庫中的真實資料的嚴重問題。
問題解決:
修改資料庫級聯修改redis資料改為 修改資料庫資料後級聯刪除redis資料
至於是先執行1.2的redis刪除,還是限制性2.2的redis刪除,無關緊要。
結果都是redis中資料已被刪除。之後的查詢就會由於redis中沒有資料而去查資料庫,
此時即不會存在查詢到的資料和資料庫的資料不一致的情況。
2,上面詳解了redis資料一致性的問題所在,並提供了單刪策略來解決問題
但此時依然存在比較嚴重的問題。
上面的單刪策略情況如下:
修改請求的實現中需要修改資料庫後,級聯刪除redis中的資料。
請求一:1.1修改資料庫資料 1.2 刪除redis資料
請求二:2.1修改資料庫資料 2.2 刪除redis資料
假設現在併發存在乙個查詢請求
請求三:3.1查詢redis中資料 3.2查詢資料庫資料 3.3 新查到的資料寫入redis
(一定要理解帶redis的查詢請求實現邏輯,先查redis,資料不存在查資料庫,
查到的資料寫入redis以便以後的查詢不去直接查資料庫)
此時併發情況下就會存在1.1 ---> 1.2 ---> 3.1 ---> 3.2 ---> 2.1 ---> 2.2 ---> 3.3的情況
此時存在的問題就是:
此時資料庫中的資料儲存的是2.1修改後的資料,而redis中儲存的資料是3.2中在1.1修改資料後的結果,
此時出現了redis中資料和資料庫資料不一致的情況,在後面的查詢過程中就會長時間去先查redis,
從而出現查詢到的資料並不是資料庫中的真實資料的嚴重問題。
3,上面刨析到了單刪策略來解決redis資料一致性存在的問題,下面我們來說雙刪策略
上面的單刪策略存在問題的情況如下:
請求一:1.1修改資料庫資料 1.2 刪除redis資料
請求二:2.1修改資料庫資料 2.2 刪除redis資料
請求三:3.1查詢redis中資料 3.2查詢資料庫資料 3.3 新查到的資料寫入redis
新增延時雙刪策略後的情況
請求一:1.1修改資料庫資料 1.2 刪除redis資料 1.3 延時3--5s再去刪除redis中資料
請求二:2.1修改資料庫資料 2.2 刪除redis資料 2.3 延時3--5s再去刪除redis中資料
請求三:3.1查詢redis中資料 3.2 查詢資料庫資料 3.3 新查到的資料寫入redis
雙刪策略為什麼能解決問題:
因為存在了延時時間,故1.3或2.3 一定是最後執行的一步操作(併發中的延時一定要理解)
延時的根本目的就是為了讓程式先把3.3執行完,再去刪除redis
4,如何實現延時3–5s的操作
比較好的: 專案整合quartz等定時任務框架,去實現延時3--5s再去執行最後一步任務
比較一般的: 建立執行緒池,執行緒池中拿乙個執行緒,執行緒體中延時3-5s再去執行最後一步任務(不能忘了啟動執行緒)
比較差的: 單獨建立乙個執行緒去實現延時執行
redis 資料一致性
方式2 資料庫和redis分別處理不同的資料型別 資料庫處理要求強一致實時性的資料,例如金融資料 交易資料 redis處理不要求強一致實時性的資料,例如 最熱貼排行榜 redis和mysql資料的同步,級別大致可以這樣做 讀 讀redis 沒有,讀mysql 把mysql資料寫回redis 寫 寫m...
資料一致性
資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...
資料一致性
丟失更新 未確定的相關性 不一致的分析和幻想讀 事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,比如這種修改涉及到表中的 全部資料行 同時,第二個事務也修改這個表中的...