欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談一下如何保證Redis緩存與數(shù)據(jù)庫的一致性

 更新時間:2023年03月29日 15:33:58   作者:SuZhan7710  
這篇文章主要介紹了一下如何保證Redis緩存與數(shù)據(jù)庫的一致性,今天這篇文章就帶你詳細了解一下四種同步策略,需要的朋友可以參考下

1、四種同步策略:

想要保證緩存與數(shù)據(jù)庫的雙寫一致,一共有4種方式,即4種同步策略:

  1. 先更新緩存,再更新數(shù)據(jù)庫;
  2. 先更新數(shù)據(jù)庫,再更新緩存;
  3. 先刪除緩存,再更新數(shù)據(jù)庫;
  4. 先更新數(shù)據(jù)庫,再刪除緩存。

從這4種同步策略中,我們需要作出比較的是:

更新緩存與刪除緩存哪種方式更合適?應(yīng)該先操作數(shù)據(jù)庫還是先操作緩存?

2、更新緩存還是刪除緩存

下面,我們來分析一下,應(yīng)該采用更新緩存還是刪除緩存的方式。

2.1 更新緩存

優(yōu)點每次數(shù)據(jù)變化都及時更新緩存,所以查詢時不容易出現(xiàn)未命中的情況。

缺點更新緩存的消耗比較大。如果數(shù)據(jù)需要經(jīng)過復雜的計算再寫入緩存,那么頻繁的更新緩存,就會影響服務(wù)器的性能。如果是寫入數(shù)據(jù)頻繁的業(yè)務(wù)場景,那么可能頻繁的更新緩存時,卻沒有業(yè)務(wù)讀取該數(shù)據(jù)。

2.2 刪除緩存

優(yōu)點操作簡單,無論更新操作是否復雜,都是將緩存中的數(shù)據(jù)直接刪除。

缺點刪除緩存后,下一次查詢緩存會出現(xiàn)未命中,這時需要重新讀取一次數(shù)據(jù)庫。從上面的比較來看,一般情況下,刪除緩存是更優(yōu)的方案。

3、先操作數(shù)據(jù)庫還是緩存

下面,我們再來分析一下,應(yīng)該先操作數(shù)據(jù)庫還是先操作緩存。
首先,我們將先刪除緩存與先更新數(shù)據(jù)庫,在出現(xiàn)失敗時進行一個對比:

3.1 先刪除緩存再更新數(shù)據(jù)庫

請?zhí)砑訄D片描述

如上圖,是先刪除緩存再更新數(shù)據(jù)庫,在出現(xiàn)失敗時可能出現(xiàn)的問題:

  • 線程A刪除緩存成功,線程A更新數(shù)據(jù)庫失??;
  • 線程B從緩存中讀取數(shù)據(jù);由于緩存被刪,進程B無法從緩存中得到數(shù)據(jù),進而從數(shù)據(jù)庫讀取數(shù)據(jù);此時數(shù)據(jù)庫中的數(shù)據(jù)更新失敗,線程B從數(shù)據(jù)庫成功獲取舊的數(shù)據(jù),然后將數(shù)據(jù)更新到了緩存。
  • 最終,緩存和數(shù)據(jù)庫的數(shù)據(jù)是一致的,但仍然是舊的數(shù)據(jù)

3.2 先更新數(shù)據(jù)庫再刪除緩存

請?zhí)砑訄D片描述

如上圖,是先更新數(shù)據(jù)庫再刪除緩存,在出現(xiàn)失敗時可能出現(xiàn)的問題:

  • 線程A更新數(shù)據(jù)庫成功,線程A刪除緩存失??;
  • 線程B讀取緩存成功,由于緩存刪除失敗,所以線程B讀取到的是緩存中舊的數(shù)據(jù)。
  • 最后線程A刪除緩存成功,有別的線程訪問緩存同樣的數(shù)據(jù),與數(shù)據(jù)庫中的數(shù)據(jù)是一樣。
  • 最終,緩存和數(shù)據(jù)庫的數(shù)據(jù)是一致的,但是會有一些線程讀到舊的數(shù)據(jù)。

經(jīng)過上面的比較,我們發(fā)現(xiàn)在出現(xiàn)失敗的時候,是無法明確分辨出先刪緩存和先更新數(shù)據(jù)庫哪個方式更好,以為它們都存在問題。后面我們會進一步對這兩種方式進行比較,但是在這里我們先探討一下,上述場景出現(xiàn)的問題,應(yīng)該如何解決呢?

實際上,無論上面我們采用哪種方式去同步緩存與數(shù)據(jù)庫,在第二步出現(xiàn)失敗的時候,都建議采用重試機制解決,上面兩幅圖中已經(jīng)畫了。

下面我們再將先刪緩存與先更新數(shù)據(jù)庫,在沒有出現(xiàn)失敗時進行對比:

請?zhí)砑訄D片描述

如上圖,是先刪除緩存再更新數(shù)據(jù)庫,在沒有出現(xiàn)失敗時可能出現(xiàn)的問題:

  • 線程A刪除緩存成功;
  • 線程B讀取緩存失?。?/li>
  • 線程B讀取數(shù)據(jù)庫成功,得到舊的數(shù)據(jù);
  • 線程B將舊的數(shù)據(jù)成功地更新到了緩存;
  • 線程A將新的數(shù)據(jù)成功地更新到數(shù)據(jù)庫。

可見,進程A的兩步操作均成功,但由于存在并發(fā),在這兩步之間,進程B訪問了緩存。最終結(jié)果是,緩存中存儲了舊的數(shù)據(jù),而數(shù)據(jù)庫中存儲了新的數(shù)據(jù),二者數(shù)據(jù)不一致。

請?zhí)砑訄D片描述

如上圖,是先更新數(shù)據(jù)庫再刪除緩存,在沒有出現(xiàn)失敗時可能出現(xiàn)的問題:

  • 線程A更新數(shù)據(jù)庫成功;
  • 線程B讀取緩存成功;
  • 線程A刪除緩存成功。

可見,最終緩存與數(shù)據(jù)庫的數(shù)據(jù)是一致的,并且都是最新的數(shù)據(jù)。但線程B在這個過程里讀到了舊的數(shù)據(jù),可能還有其他線程也像線程B一樣,在這兩步之間讀到了緩存中舊的數(shù)據(jù),但因為這兩步的執(zhí)行速度會比較快,所以影響不大。對于這兩步之后,其他進程再讀取緩存數(shù)據(jù)的時候,就不會出現(xiàn)類似于進程B的問題了。

最終結(jié)論:

經(jīng)過對比你會發(fā)現(xiàn),先更新數(shù)據(jù)庫、再刪除緩存是影響更小的方案。如果第二步出現(xiàn)失敗的情況,則可以采用重試機制解決問題。

4、延時雙刪

上面我們提到,如果是先刪緩存、再更新數(shù)據(jù)庫,在沒有出現(xiàn)失敗時可能會導致數(shù)據(jù)的不一致。如果在實際的應(yīng)用中,出于某些考慮我們需要選擇這種方式,那有辦法解決這個問題嗎?答案是有的,那就是采用延時雙刪的策略,延時雙刪的基本思路如下

  1. 刪除緩存;
  2. 更新數(shù)據(jù)庫;
  3. sleep N毫秒;
  4. 再次刪除緩存。
	public void write(String key, Object data) {
        Redis.delKey(key);
        db.updateData(data);
        Thread.sleep(1000);
        Redis.delKey(key);
    }

阻塞一段時間之后,再次刪除緩存,就可以把這個過程中緩存中不一致的數(shù)據(jù)刪除掉。而具體的時間,要評估你這項業(yè)務(wù)的大致時間,按照這個時間來設(shè)定即可。

4.1 采用讀寫分離的架構(gòu)怎么辦?

如果數(shù)據(jù)庫采用的是讀寫分離的架構(gòu),那么又會出現(xiàn)新的問題,如下圖:

在這里插入圖片描述

此時來了兩個請求,請求 A(更新操作) 和請求 B(查詢操作)

  1. 請求 A 更新操作,刪除了 Redis;
  2. 請求主庫進?更新操作,主庫與從庫進行同步數(shù)據(jù)的操作;
  3. 請 B 查詢操作,發(fā)現(xiàn) Redis 中沒有數(shù)據(jù);
  4. 去從庫中拿去數(shù)據(jù);
  5. 此時同步數(shù)據(jù)還未完成,拿到的數(shù)據(jù)是舊數(shù)據(jù);

此時的解決辦法就是如果是對 Redis 進行填充數(shù)據(jù)的查詢數(shù)據(jù)庫操作,那么就強制將其指向主庫進?查詢。

刪除失敗了怎么辦?

如果刪除依然失敗,則可以增加重試的次數(shù),但是這個次數(shù)要有限制,當超出一定的次數(shù)時,要采取報錯、記日志、發(fā)郵件提醒等措施。

5、利用消息隊列進行刪除的補償

先更新數(shù)據(jù)庫,后刪除緩存這?種情況也會出現(xiàn)問題,比如更新數(shù)據(jù)庫成功了,但是在刪除緩存的階段出錯了沒有刪除成功,那么此時再讀取緩存的時候每次都是錯誤的數(shù)據(jù)了。

請?zhí)砑訄D片描述

此時解決方案就是利用消息隊列進行刪除的補償。具體的業(yè)務(wù)邏輯?語?描述如下:

  1. 請求 線程A 先對數(shù)據(jù)庫進行更新操作;
  2. 在對 Redis 進行刪除操作的時候發(fā)現(xiàn)報錯,刪除失敗;
  3. 此時將Redis 的 key 作為消息體發(fā)送到消息隊列中;
  4. 系統(tǒng)接收到消息隊列發(fā)送的消息后再次對 Redis 進行刪除操作;

但是這個方案會有?個缺點就是會對業(yè)務(wù)代碼造成大量的侵入,深深的耦合在?起,所以這時會有?個優(yōu)化的方法,我們知道對 Mysql 數(shù)據(jù)庫更新操作后再 binlog 日志中我們都能夠找到相應(yīng)的操作,那么我們可以訂閱 Mysql 數(shù)據(jù)庫的 binlog 日志對緩存進行操作。

請?zhí)砑訄D片描述

到此這篇關(guān)于淺談一下如何保證Redis緩存與數(shù)據(jù)庫的一致性的文章就介紹到這了,更多相關(guān)Redis緩存與數(shù)據(jù)庫的一致性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis實現(xiàn)分布式的方法總結(jié)

    redis實現(xiàn)分布式的方法總結(jié)

    在本篇文章中小編給大家整理了關(guān)于redis分布式怎么做的具體內(nèi)容以及知識點總結(jié),有興趣的朋友們參考下。
    2019-06-06
  • 為Redis設(shè)置密碼的三種方法

    為Redis設(shè)置密碼的三種方法

    Redis 是一個高性能的鍵值對數(shù)據(jù)庫,廣泛應(yīng)用于緩存、消息隊列等場景,為了保障 Redis 服務(wù)的安全性,設(shè)置密碼認證是非常重要的一步,所以本文給大家介紹了為Redis設(shè)置密碼的三種方法,需要的朋友可以參考下
    2024-11-11
  • Redis如何統(tǒng)計用戶訪問量

    Redis如何統(tǒng)計用戶訪問量

    這篇文章主要介紹了Redis如何統(tǒng)計用戶訪問量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

    基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

    點贊是我們現(xiàn)在經(jīng)常見到的一個效果,如朋友圈、微博都有點贊的效果,下面這篇文章主要跟大家分享了基于redis實現(xiàn)的點贊功能設(shè)計思路的相關(guān)資料,文中介紹的非常詳細,對大家實現(xiàn)點贊功能具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Redis實現(xiàn)數(shù)據(jù)的交集、并集、補集的示例

    Redis實現(xiàn)數(shù)據(jù)的交集、并集、補集的示例

    本文主要介紹了Redis實現(xiàn)數(shù)據(jù)的交集、并集、補集的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • redis淘汰策略的幾種實現(xiàn)

    redis淘汰策略的幾種實現(xiàn)

    redis內(nèi)存數(shù)據(jù)數(shù)據(jù)集大小升到一定大的時候,就會實行數(shù)據(jù)淘汰策略,本文主要介紹了redis淘汰策略的幾種實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Redis全局ID生成器的實現(xiàn)

    Redis全局ID生成器的實現(xiàn)

    全局ID生成器,是一種在分布式系統(tǒng)下用來生成全局唯一ID的工具,本文主要介紹了Redis全局ID生成器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Rocky9部署redis的實現(xiàn)示例

    Rocky9部署redis的實現(xiàn)示例

    本文主要介紹了Rocky9部署redis的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • Linux中Redis安裝部署的操作步驟

    Linux中Redis安裝部署的操作步驟

    公司一直在使用redis集群,尋思著自己也部署一套練練手,下面這篇文章主要給大家介紹了關(guān)于Linux中Redis安裝部署的操作步驟,需要的朋友可以參考下
    2022-04-04
  • Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程

    Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程

    大家好,本篇文章主要講的是Linux系統(tǒng)下安裝Redis數(shù)據(jù)庫過程,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論