redis快取和mysql資料一致性方案詳解

2022-10-09 08:24:12 字數 616 閱讀 3479

在高併發的業務場景下,資料庫訪問成為使用者併發最薄弱的環節,所以就需要redis做乙個緩衝操作,

讓請求先訪問到redis,而不是直接訪問mysql資料庫

讀取redis快取一般沒有什麼問題,但是一旦涉及到資料更新,更新資料庫和redis快取,

就容易出現快取redis和資料庫mysql間的資料一致性問題

不管是先寫庫,在刪除快取;還是先刪除快取,在寫庫,都有可能出現資料不一致的問題,比如

在寫庫前後都進行redis.del(key)操作,並且設定合理的超時時間

步驟:先刪除快取---寫入資料庫---休眠500ms---在刪除快取

休眠500ms的意思就是寫請求可以刪除讀請求造成的髒資料

設定快取過期時間

從理論上講,給快取設定過期時間,是保證最終一致性的解決方案,所有的寫操作都以資料庫為準

只要快取達到過期時間,則後面的讀請求自然會從資料庫中讀取資料然後填回快取

弊端:結合雙刪策略+快取超時時間,這樣最差的情況就是在超時時間內資料存在不一致,而且又增加了寫請求的耗時

讀取binlog後分析,利用訊息佇列,推送到各台的redis快取資料

可以採用阿里開源的canal框架訂閱mysql的binlog,來實現推送更新redis

redis快取和mysql資料庫同步

穿透 頻繁查詢乙個不存在的資料,由於快取不命中,每次都要查詢持久層。從而失去快取的意義。解決辦法 持久層查詢不到就快取空結果,查詢時先判斷快取中是否exists key 如果有直接返回空,沒有則查詢後返回,注意insert時需清除查詢的key,否則即便db中有值也查詢不到 當然也可以設定空快取的過期...

redis快取資料

快取資料的步驟 查詢快取,如果沒有資料,則查詢資料庫 查詢資料庫,如果資料不為空,將結果寫入快取 快取資料容易造成如下問題 快取穿透 快取擊穿 快取失效 快取穿透 什麼叫快取穿透?一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的v...

REDIS實現資料快取

注意 使用的map必須是string,string型別的,意味著如果使用map儲存user和userid,userid作為key,物件作為value,那麼物件在進入map之前需要使用fastjson進行object到json的轉換。tips jedis.sadd key value 建立乙個list...