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

面試常問:如何保證Redis緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

 更新時間:2021年09月27日 16:25:06   作者:不會編程的派大星  
在實際開發(fā)過程中,緩存的使用頻率是非常高的,只要使用緩存和數(shù)據(jù)庫存儲,就難免會出現(xiàn)雙寫時數(shù)據(jù)一致性的問題,那我們又該如何解決呢

首先,我們先來看看有哪幾種一致性的情況呢?

一、一致性

1、強一致性

如果你的項目對緩存的要求是強一致性的,那么請不要使用緩存。這種一致性級別是最符合用戶直覺的,它要求系統(tǒng)寫入什么,讀出來的也會是什么,用戶體驗好,但實現(xiàn)起來往往對系統(tǒng)的性能影響大。

2、弱一致性

這種一致性級別約束了系統(tǒng)在寫入成功后,不承諾立即可以讀到寫入的值,也不承諾多久之后數(shù)據(jù)能夠達到一致,但會盡可能地保證到某個時間級別(比如秒級別)后,數(shù)據(jù)能夠達到一致狀態(tài)。

3、最終一致性

最終一致性是弱一致性的一個特例,系統(tǒng)會保證在一定時間內(nèi),能夠達到一個數(shù)據(jù)一致的狀態(tài)。這里之所以將最終一致性單獨提出來,是因為它是弱一致性中非常推崇的一種一致性模型,也是業(yè)界在大型分布式系統(tǒng)的數(shù)據(jù)一致性上比較推崇的模型。一般情況下,高可用只確保最終一致性,不確保強一致性。

強一致性,讀請求和寫請求會串行化,串到一個內(nèi)存隊列里去,這樣會大大增加系統(tǒng)的處理效率,吞吐量也會大大降低。

二、redis緩存和mysql數(shù)據(jù)庫數(shù)據(jù)一致性解決

在這里插入圖片描述

這張圖,大多數(shù)人的很多業(yè)務(wù)操作都是根據(jù)這個圖來做緩存的。但是一旦設(shè)計到雙寫或者
數(shù)據(jù)庫和緩存更新等操作,就很容易出現(xiàn)數(shù)據(jù)一致性的問題。無論是先寫數(shù)據(jù)庫,在刪除緩存,還是先刪除緩存,在寫入數(shù)據(jù)庫,都會出現(xiàn)數(shù)據(jù)一致性的問題。列舉兩個小例子。

1、 先刪除了redis緩存,但是因為其他什么原因還沒來得及寫入數(shù)據(jù)庫,另外一個線程就來讀取,發(fā)現(xiàn)緩存為空,則去數(shù)據(jù)庫讀取到之前的數(shù)據(jù)并寫入緩存,此時緩存中為臟數(shù)據(jù)。

2、 如果先寫入了數(shù)據(jù)庫,但是在緩存被刪除前,寫入數(shù)據(jù)庫的線程因為其他原因被中斷了,沒有刪除掉緩存,就也會出現(xiàn)數(shù)據(jù)不一致的情況。

總的來說,寫和讀在多數(shù)情況下都是并發(fā)的,不能絕對保證先后順序,就會很容易出現(xiàn)緩存和數(shù)據(jù)庫數(shù)據(jù)不一致的情況,還怎么解決呢?

1、方案一:采用延時雙刪策略

基本思路: 在寫庫前后都進行刪除緩存操作,并且設(shè)置合理的超時時間
基本步驟: 先刪除緩存–再寫數(shù)據(jù)庫—休眠一段時間—再次刪除緩存
注:休眠的時間是根據(jù)自己的項目的讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時來確定的。這樣做主要是為了保證在寫請求之前確保讀請求結(jié)束,寫請求可以刪除讀請求造成的緩存臟數(shù)據(jù)。

該方案的弊端: 集合雙刪策略+緩存超時策略設(shè)置,這樣最差的結(jié)果就是在超時時間內(nèi)數(shù)據(jù)存在不一致,又增加了寫請求的耗時。

2、方案二:一步更新緩存(基于訂閱Binlog的同步機制)

基本思路: mysql Binlog增強訂閱消費+消息隊列+增量數(shù)據(jù)更新到redis—讀redis:熱數(shù)據(jù)基本上都在redis—寫mysql:增刪改都是操作mysql—更新redis數(shù)據(jù):mysql的數(shù)據(jù)操作Binlog,來更新redis

我們再來看看詳細的過程

1、Redis更新

1)、數(shù)據(jù)操作主要分為兩大塊:
一個是全量,將全部數(shù)據(jù)寫去redis;另一個就是增量(update、insert、delete),實時更新。

2)、讀取binlog后分析 ,利用消息隊列,推送更新各臺的redis緩存數(shù)據(jù)。
這樣一旦MySQL中產(chǎn)生了新的寫入、更新、刪除等操作,就可以把binlog相關(guān)的消息推送至Redis,Redis再根據(jù)binlog中的記錄,對Redis進行更新。
其實這種機制,很類似MySQL的主從備份機制,因為MySQL的主備也是通過binlog來實現(xiàn)的數(shù)據(jù)一致性。

這里可以結(jié)合使用canal(阿里的一款開源框架),通過該框架可以對MySQL的binlog進行訂閱,而canal正是模仿了mysql的slave數(shù)據(jù)庫的備份請求,使得Redis的數(shù)據(jù)更新達到了相同的效果。

當然,這里的消息推送工具你也可以采用別的第三方:kafka、rabbitMQ等來實現(xiàn)推送更新Redis。

歡迎小伙伴們留言討論!

以上就是面試官常問:如何保證Redis緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性的詳細內(nèi)容,更多關(guān)于Redis緩存和數(shù)據(jù)庫數(shù)據(jù)一致的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis解決跨域存取Session問題

    Redis解決跨域存取Session問題

    本文主要介紹了Redis解決跨域存取Session問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Redis數(shù)據(jù)一致性問題的三種解決方案

    Redis數(shù)據(jù)一致性問題的三種解決方案

    Redis(Remote?Dictionary?Server?),是一個高性能的基于Key-Value結(jié)構(gòu)存儲的NoSQL開源數(shù)據(jù)庫,大部分公司采用Redis來實現(xiàn)分布式緩存,用來提高數(shù)據(jù)查詢效率,本文就給大家介紹三種Redis數(shù)據(jù)一致性問題的解決方案,需要的朋友可以參考下
    2023-07-07
  • 利用Supervisor管理Redis進程的方法教程

    利用Supervisor管理Redis進程的方法教程

    Supervisor 是可以在類 UNIX 系統(tǒng)中進行管理和監(jiān)控各種進程的小型系統(tǒng)。它自帶了客戶端和服務(wù)端工具,下面這篇文章主要給大家介紹了關(guān)于利用Supervisor管理Redis進程的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 爬蟲技術(shù)之分布式爬蟲架構(gòu)的講解

    爬蟲技術(shù)之分布式爬蟲架構(gòu)的講解

    今天小編就為大家分享一篇關(guān)于爬蟲技術(shù)之分布式爬蟲架構(gòu)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Redis的持久化方式

    Redis的持久化方式

    Redis提供了兩種主要的持久化方式:RDB和AOF,RDB通過定時快照的方式保存數(shù)據(jù)狀態(tài),而AOF記錄每個寫操作以便于重啟時重放,兩者可以結(jié)合使用,且在重啟時AOF文件會被優(yōu)先用于數(shù)據(jù)恢復(fù),RDB快照具有速度快、節(jié)省磁盤空間的優(yōu)點,但可能會丟失最近的數(shù)據(jù)
    2024-10-10
  • Ubuntu22.04 LTS 上安裝Redis的過程

    Ubuntu22.04 LTS 上安裝Redis的過程

    Redis是一種開源的內(nèi)存數(shù)據(jù)存儲,可以用作數(shù)據(jù)庫、緩存和消息代理等,本文將會介紹兩種不同的安裝方式,包括從源代碼編譯安裝以及通過apt包管理器安裝,需要的朋友參考下吧
    2023-11-11
  • Redis如何在項目中合理使用經(jīng)驗分享

    Redis如何在項目中合理使用經(jīng)驗分享

    這篇文章主要給大家介紹了關(guān)于Redis如何在項目中合理使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • 基于redis實現(xiàn)的點贊功能設(shè)計思路詳解

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

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

    Redis過期Key刪除策略和內(nèi)存淘汰策略的實現(xiàn)

    當內(nèi)存使用達到上限,就無法存儲更多數(shù)據(jù)了,為了解決這個問題,Redis內(nèi)部會有兩套內(nèi)存回收的策略,過期Key刪除策略和內(nèi)存淘汰策略,本文就來詳細的介紹一下這兩種方法,感興趣的可以了解一下
    2024-02-02
  • Redis去重的3種不同方法匯總

    Redis去重的3種不同方法匯總

    Redis是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Redis去重的3種不同方法,需要的朋友可以參考下
    2021-11-11

最新評論