1、不一致產生的原因?
我們在是使用redis過程中,通常會這樣做,先讀取快取,如果快取不存在,則讀取資料庫。
不管是先寫庫,再刪除快取;還是先刪除快取,再寫庫,都有可能出現資料不一致的情況。
因為寫和讀是併發的,沒法保證順序,如果刪除了快取,還沒有來得及寫庫,另乙個執行緒就來讀取,發現快取為空,則去資料庫中讀取資料寫入快取,此時快取中為髒資料。如果先寫了庫,在刪除快取前,寫庫的執行緒宕機了,沒有刪除掉快取,則也會出現資料不一致情況。
如果是redis集群,或者主從模式,寫主讀從,由於redis複製存在一定的時間延遲,也有可能導致資料不一致。
2、優化思路
(1)讀操作優先讀取redis,不存在的話就去訪問mysql,並把讀到的資料寫回redis中;
(2)寫操作的話,直接寫mysql,成功後再寫入redis,替換掉原來的舊資料(可以在mysql端定義crud觸發器,在觸發crud操作後寫資料到redis,也可以在redis端解析binlog,再做相應的操作)
(3)設定合理的超時時間,即經過超時時間,自動將redis中相應的資料刪除。這樣最差的情況是在超時時間內,記憶體存在不一致。當然這種策略要考慮redis和資料庫主從同步的耗時,所以在第二次刪除前最好休眠一定的時間,比如500毫秒,這樣無疑又增加了寫請求的耗時。
Redis和資料庫之間的資料一致性問題
redis和資料庫之間資料不一致的問題。在高併發場景下,同時有讀和寫的的操作,不管是先刪除快取,再寫資料庫,還是先寫庫,再刪快取,都有可能出現資料不一致的情況。1.如果先刪除快取,在寫資料庫之前,有個讀資料的執行緒發現快取為空,就去讀取資料庫,讀到的是髒資料,拿髒資料更新redis快取,導致了red...
如何保證Redis快取和資料庫的雙寫一致性?
在資料庫 快取模式下,當資料庫中的資料需要更新時,快取裡的資料怎麼處理?如何保證快取和資料庫中資料的一致性?常用的解決方案有兩種 其他渣渣的方案這裡不討論 1 先刪除快取,再更新資料庫 2 先更新資料庫,再刪除快取 下面我們就來看一下這兩種方案,看看它們是怎麼保證資料一致性的?理想的流程是這樣的 先...
oracle裡例項和資料庫之間的關係
1 每個database 可包含多個instance 每個instance可包含多個tablespace和user等 授予user讀寫tablespace的許可權 每個tablespace可包含多個dbf檔案 常用的table或view等都儲存在tablespace裡。2 要oracle使用 先安裝...