成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis 和 MySQL 如何保證數(shù)據(jù)一致性?

數(shù)據(jù)庫(kù) MySQL
啟動(dòng)一個(gè)訂閱程序去訂閱數(shù)據(jù)庫(kù)的binlog,獲得需要操作的數(shù)據(jù)。在應(yīng)用程序中,另起一段程序,獲得這個(gè)訂閱程序傳來(lái)的信息,進(jìn)行刪除緩存操作。

我們都知道,在開(kāi)發(fā)過(guò)程中,很多時(shí)候都會(huì)用到我們的緩存,而緩存的種類(lèi)也是五花八門(mén)的,我們今天來(lái)了解的就是關(guān)于緩存中的一種,那就是 Redis。

Redis

redis是一個(gè)key-value存儲(chǔ)系統(tǒng)。

和Memcached類(lèi)似,它支持存儲(chǔ)的value類(lèi)型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類(lèi)型)。

這些數(shù)據(jù)類(lèi)型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。

在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。

區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。

今天我們不說(shuō)這個(gè) Redis 的主從同步,我們來(lái)說(shuō)說(shuō)我們最常使用 Redis 的時(shí)候,會(huì)導(dǎo)致的一些問(wèn)題。

Redis和 Mysql 如何保持一致

說(shuō)到這個(gè)一致性,了不起就得和大家說(shuō)道說(shuō)道了,為什么會(huì)出現(xiàn)這種情況呢?實(shí)際上就是和 Redis 的使用有很大的關(guān)系。

都知道,Redis 是一個(gè) NoSQL 的數(shù)據(jù)庫(kù),而且他還很快,所以很多數(shù)據(jù)都會(huì)從 Mysql 中把數(shù)據(jù)取出來(lái),然后放到我們的緩存中,然后下次讀取數(shù)據(jù)的時(shí)候,從 Redis 中直接去讀取,這個(gè)時(shí)候,我們就會(huì)出現(xiàn)問(wèn)題了。

什么問(wèn)題呢?

在高并發(fā)的業(yè)務(wù)場(chǎng)景下,數(shù)據(jù)庫(kù)大多數(shù)情況都是用戶(hù)并發(fā)訪問(wèn)最薄弱的環(huán)節(jié)。所以,就需要使用redis做一個(gè)緩沖操作,讓請(qǐng)求先訪問(wèn)到Redis,而不是直接訪問(wèn)MySQL等數(shù)據(jù)庫(kù)。

這個(gè)業(yè)務(wù)場(chǎng)景,主要是解決讀數(shù)據(jù)從Redis緩存,一般都是按照下圖的流程來(lái)進(jìn)行業(yè)務(wù)操作。

圖片

讀取緩存步驟一般沒(méi)有什么問(wèn)題,但是一旦涉及到數(shù)據(jù)更新:數(shù)據(jù)庫(kù)和緩存更新,就容易出現(xiàn)緩存Redis和數(shù)據(jù)庫(kù)MySQL間的數(shù)據(jù)一致性問(wèn)題。

不管是先寫(xiě) MySQL數(shù)據(jù)庫(kù),再刪除Redis緩存;還是先刪除緩存,再寫(xiě)庫(kù),都有可能出現(xiàn)數(shù)據(jù)不一致的情況。

舉一個(gè)例子:

1.如果刪除了緩存 Redis,還沒(méi)有來(lái)得及寫(xiě)庫(kù) MySQL,另一個(gè)線程就來(lái)讀取,發(fā)現(xiàn)緩存為空,則到數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),寫(xiě)入緩存,此時(shí)緩存中為臟數(shù)據(jù)。

2.如果先寫(xiě)了庫(kù),在刪除緩存前,寫(xiě)庫(kù)的線程宕機(jī)了,沒(méi)有刪除掉緩存,則也會(huì)出現(xiàn)數(shù)據(jù)不一致情況。

因?yàn)閷?xiě)和讀是并發(fā)的,沒(méi)法保證順序,就會(huì)出現(xiàn)緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致的問(wèn)題。

其實(shí)解決方案也有不是少,今天了不起來(lái)給大家分析一下 Redis 和 Mysql 保證數(shù)據(jù)一致性的實(shí)現(xiàn)方案。

緩存和數(shù)據(jù)庫(kù)一致性解決方案

延時(shí)雙刪策略

延時(shí)雙刪策略步驟如下:

  • 1.先刪除緩存
  • 2.再寫(xiě)數(shù)據(jù)庫(kù)
  • 3.休眠N毫秒
  • 4.再次刪除緩存

其實(shí)我們可以來(lái)想一下,如果有三個(gè)線程,分別是 線程1 ,線程2,線程3,三個(gè)線程,

其中,線程1先刪除緩存;

線程2讀取緩存為null,同步db數(shù)據(jù)到緩存中;

線程1更新db中的數(shù)據(jù);

線程3查詢(xún)緩存中數(shù)據(jù)是舊數(shù)據(jù);

這樣的話(huà),就會(huì)出現(xiàn) Mysql 和 Redis 中的數(shù)據(jù)不一致,這時(shí)候采用延遲雙刪策略,去保證數(shù)據(jù)的一致性,

這時(shí)候就有人問(wèn)了,為什么要休眠一段時(shí)間,然后再執(zhí)行呢?

假象一下,如果沒(méi)有第三步操作時(shí),有很大概率,在兩次刪除Redis操作執(zhí)行完畢之后,數(shù)據(jù)庫(kù)的數(shù)據(jù)還沒(méi)有更新,此時(shí)若有請(qǐng)求訪問(wèn)數(shù)據(jù),便會(huì)出現(xiàn)我們一開(kāi)始提到的數(shù)據(jù)不一致的問(wèn)題。

為什么還要再次刪除緩存呢?

如果我們沒(méi)有第二次刪除操作,此時(shí)有請(qǐng)求訪問(wèn)數(shù)據(jù),有可能是訪問(wèn)的之前未做修改的 Redis 數(shù)據(jù),刪除操作執(zhí)行后,Redis為空,有請(qǐng)求進(jìn)來(lái)時(shí),便會(huì)去訪問(wèn)數(shù)據(jù)庫(kù),此時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)已是更新后的數(shù)據(jù),保證了數(shù)據(jù)的一致性。

因?yàn)楦杏X(jué)這種延遲雙刪除可靠性并沒(méi)有那么高,因?yàn)槲覀儾⒉荒鼙WC刪除 Redis 成功,也不能保證數(shù)據(jù)庫(kù)更新也是成功的,也就是我們所說(shuō)的原子性,兩個(gè)組合起來(lái)只是在理想情況下。

比如雙刪失敗我們應(yīng)該怎么處理呢?

1、設(shè)置緩存過(guò)期時(shí)間

從理論上來(lái)說(shuō),給緩存設(shè)置過(guò)期時(shí)間,是保證最終一致性的解決方案。所有的寫(xiě)操作以數(shù)據(jù)庫(kù)為準(zhǔn),只要到達(dá)緩存過(guò)期時(shí)間,則后面的讀請(qǐng)求自然會(huì)從數(shù)據(jù)庫(kù)中讀取新值然后回填緩存。

結(jié)合雙刪策略+緩存超時(shí)設(shè)置,這樣最差的情況就是在超時(shí)時(shí)間內(nèi)數(shù)據(jù)存在不一致。

2、重試方案

重試方案有兩種實(shí)現(xiàn),一種在業(yè)務(wù)層做,另外一種實(shí)現(xiàn)中間件負(fù)責(zé)處理。

然而,該方案有一個(gè)缺點(diǎn),對(duì)業(yè)務(wù)線代碼造成大量的侵入。

流程如下:

1.更新數(shù)據(jù)庫(kù)數(shù)據(jù);

2.緩存因?yàn)榉N種問(wèn)題刪除失敗;

3.將消費(fèi)消息,獲得需要?jiǎng)h除的key;

4.自己消費(fèi)消息,獲得需要?jiǎng)h除的key;

5.重試刪除操作,直到成功。

而這個(gè)放在業(yè)務(wù)層去處理的話(huà),侵入太高,所以一般是不太推薦使用來(lái)解決這個(gè)問(wèn)題。

但是呢,還有一個(gè)就是使用中間件來(lái)進(jìn)行處理。

啟動(dòng)一個(gè)訂閱程序去訂閱數(shù)據(jù)庫(kù)的binlog,獲得需要操作的數(shù)據(jù)。在應(yīng)用程序中,另起一段程序,獲得這個(gè)訂閱程序傳來(lái)的信息,進(jìn)行刪除緩存操作。

流程如下:

1.更新數(shù)據(jù)庫(kù)數(shù)據(jù);

2.數(shù)據(jù)庫(kù)會(huì)將操作信息寫(xiě)入binlog日志當(dāng)中;

3.訂閱程序提取出所需要的數(shù)據(jù)以及key;

4.另起一段非業(yè)務(wù)代碼,獲得該信息;

5.嘗試刪除緩存操作,發(fā)現(xiàn)刪除失敗;

6.將這些信息發(fā)送至消息隊(duì)列;

7.重新從消息隊(duì)列中獲得該數(shù)據(jù),重試操作。

關(guān)于延遲雙刪除策略,你學(xué)會(huì)了么?

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2021-12-14 07:15:57

MySQLRedis數(shù)據(jù)

2022-02-17 21:04:27

數(shù)據(jù)庫(kù)MysqlRedis

2024-08-20 16:13:52

2024-12-26 15:01:29

2023-09-07 08:11:24

Redis管道機(jī)制

2025-03-27 08:20:54

2022-09-15 10:37:46

MySQLRedis數(shù)據(jù)一致性

2024-01-22 08:52:00

AQS雙異步數(shù)據(jù)一致性

2021-10-14 10:00:46

MYSQL開(kāi)發(fā)數(shù)據(jù)

2024-07-04 12:36:50

2023-09-24 14:35:43

Redis數(shù)據(jù)庫(kù)

2023-09-15 14:24:54

ByteHouseClickHouse開(kāi)源

2018-08-14 10:39:04

數(shù)據(jù)錯(cuò)誤DIX

2023-06-29 08:00:59

redis數(shù)據(jù)MySQL

2025-04-27 08:52:21

Redis數(shù)據(jù)庫(kù)緩存

2022-08-23 07:46:45

數(shù)據(jù)一致性數(shù)據(jù)庫(kù)

2022-12-05 08:24:32

mongodb數(shù)據(jù)庫(kù)數(shù)據(jù)

2022-10-19 12:22:53

并發(fā)扣款一致性

2023-12-11 12:27:31

并發(fā)Zookeeper數(shù)據(jù)

2019-08-30 12:46:10

并發(fā)扣款查詢(xún)SQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 天天爱天天操 | 久久精品亚洲欧美日韩精品中文字幕 | 欧美日韩最新 | 日本激情视频中文字幕 | 亚洲网站在线观看 | 激情 婷婷| 一级片免费视频 | 97精品一区二区 | 亚洲精品99999 | 国精品一区 | 91麻豆精品国产91久久久更新资源速度超快 | 91成人精品 | 一区欧美 | 亚洲三级免费看 | 亚洲444kkkk在线观看最新 | 日韩欧美二区 | 天天插天天操 | 不卡在线视频 | 免费成人高清在线视频 | 在线第一页 | 久久综合一区 | 一区二区三区四区在线视频 | 91porn成人精品 | 色网在线看 | 国产女人叫床高潮大片免费 | 中文字幕在线人 | 国产精品久久久久久久久久妇女 | 欧美精品在线一区二区三区 | 久久精品色欧美aⅴ一区二区 | 精品乱人伦一区二区三区 | 久久国产成人精品国产成人亚洲 | 一区二区三区四区免费在线观看 | 免费一区 | 一区二区三区高清 | 亚洲美女网站 | 老牛影视av一区二区在线观看 | 免费成人高清在线视频 | 亚洲成人在线网 | 人人干视频在线 | 亚洲欧美日韩电影 | 欧美日韩在线免费观看 |