中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據庫跟緩存的雙寫一致性怎么理解

發布時間:2021-12-08 09:21:06 來源:億速云 閱讀:175 作者:iii 欄目:云計算

這篇文章主要介紹“數據庫跟緩存的雙寫一致性怎么理解”,在日常操作中,相信很多人在數據庫跟緩存的雙寫一致性怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”數據庫跟緩存的雙寫一致性怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1 關于一致性

為加速系統性能一般都會引入緩存機制,比如 Redis。這種情況下當用戶數據時一般會按照如下流程:

數據庫跟緩存的雙寫一致性怎么理解  
讀流程

關于讀的流程大家是沒有異議的,但是對于數據的更新呢,如何操作才算合理呢?

 
  1. 先更新數據庫再更新緩存。

  2. 先刪緩存再更新數據庫。

  3. 先更新數據庫再刪緩存。

 

2 一致性解決方法

 

2.1 緩存TTL

簡單直接又暴力的方法,如果有些數據不重要,我們讀完一次數據到緩存后設置個TTL即可,等待超時后緩存自動從數據庫讀取下數據。

 

2.2  先更新數據庫 再更新緩存

假如我們有A、B兩個請求,A請求將age = 14,B請求將age = 12。我們看下正常執行跟非正常執行情況:

數據庫跟緩存的雙寫一致性怎么理解  
緩存舊數據

可發現如果出現網絡震蕩會導致緩存的數據是舊數據。因此這種方法不可取。并且如果是如下場景也不合適:

 
  1. 寫場景多而讀場景少的業務需求,此時緩存不是經常性的讀,卻被頻繁的更新。

  2. 如果緩存的數據是經過各種復雜計算后寫入的,那每次寫入緩存都要運算一次,此法不可取。

 

2.3 先刪緩存 再更新數據庫

假如A先請求更改數據,B請求讀數據,如果因為網絡導致發生如下情況也會造成緩存臟數據,如果此時緩存沒有設置TTL那會一直是臟數據。

數據庫跟緩存的雙寫一致性怎么理解  
緩存臟數據

上面這種情況如何解決呢?一般可以采用  延時雙刪策略,他的核心執行流程如下:
public  void write(String key,Object value){
    redis.delKey(key);
    db.updateValue(value);
    Thread.sleep(1000); // 再次刪除
    redis.delKey(key);
}

該思路落實到流程圖上如下所示:

數據庫跟緩存的雙寫一致性怎么理解  
延時雙刪策略

sleep的時間要根據業務數據邏輯耗時而定,反正目的是  確保讀請求結束,寫請求可以刪除讀請求造成的緩存臟數據

當然如果用的是主從寫讀架構,那處理思路跟上面類似,無非就是休眠時間再加上主從同步的時間即可。

數據庫跟緩存的雙寫一致性怎么理解  
主從模式二次刪除

可是其實第二次刪除還是有不妥的地方:  

 
  1. 二次刪除前面涉及到休眠,可能導致系統性能降低,可以采用異步的方式,再起一個線程來進行異步刪除。

  2. 如果二次刪除失敗了,還是會導致緩存臟數據存在的啊!

 

2.4 先更新數據庫 再刪緩存

針對緩存更新問題,老外提出了一個名為《Cache-Aside pattern》的緩存更新套路,該策略在Facebook中也廣泛使用,該策略指出:

  1. 失效:應用程序先從緩存取數據,沒有得到,則從數據庫中取數據,成功后,放到緩存中。

  2. 命中:應用程序從緩存中取數據,取到后返回。

  3. 更新:先把數據存到數據庫中,成功后,再讓緩存失效。

假如此時A、B兩個線程同時請求,正常來講不管你是讀寫分離還是單機版,讀一般比寫快。那刪除緩存一般是有效的。

數據庫跟緩存的雙寫一致性怎么理解  
先更新數據庫再刪除緩存

但是也有可能別的原因導致讀比寫還慢,導致我們刪了個  寂寞,雖然這種情況很少發生。  
 
數據庫跟緩存的雙寫一致性怎么理解  
讀比寫還慢時

該方案相比先刪除緩存再更新數據庫還是穩妥些的,但是也不是萬無一失的。不管是先刪緩存再更新數據庫還是先更新數據庫再刪緩存,  如果刪除緩存失敗了都會導致緩存跟數據不一致問題!    

2.5 消息隊列 確保消息刪除

通過消息隊列的確認消費機制來刪除緩存。

數據庫跟緩存的雙寫一致性怎么理解  
消息隊列機制確保刪除

缺點也很明顯:
  1. 對業務線代碼造成大量的侵入,引入了中間件。

  2. 消息的延遲刪除也會造成短暫的不一致。

 

2.6 專門程序+消息隊列 確保消息刪除

該方案啟動一個訂閱程序去訂閱數據庫的binlog,獲得需要操作的數據。在應用程序中,另起一段程序,獲得這個訂閱程序傳來的信息,進行刪除緩存操作。

數據庫跟緩存的雙寫一致性怎么理解  
專門程序刪除緩存

訂閱binlog程序在mysql中有現成的中間件叫  canal,可以完成訂閱binlog日志的功能。    

到此,關于“數據庫跟緩存的雙寫一致性怎么理解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武宣县| 奇台县| 大姚县| 上饶县| 广安市| 三原县| 康定县| 射洪县| 昆山市| 镇坪县| 宁化县| 石景山区| 博乐市| 泾川县| 饶河县| 湘西| 根河市| 兴业县| 亚东县| 多伦县| 偃师市| 县级市| 木里| 三河市| 原平市| 武邑县| 道真| 石渠县| 岱山县| 万全县| 疏勒县| 泽库县| 钟祥市| 霍林郭勒市| 女性| 台前县| 涿鹿县| 惠来县| 亳州市| 灵寿县| 萨迦县|