自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

村頭老大爺都能聽(tīng)的懂的延遲雙刪策略

開(kāi)發(fā) 前端
在業(yè)務(wù)程序運(yùn)行時(shí),統(tǒng)計(jì)業(yè)務(wù)邏輯執(zhí)行讀數(shù)據(jù)和寫緩存的操作時(shí)間,以此為基礎(chǔ)來(lái)進(jìn)行估算。因?yàn)檫@個(gè)方案會(huì)在第一次刪除緩存值后,延遲一段時(shí)間再次進(jìn)行刪除,所以稱為“延遲雙刪”。

哈嘍,大家好,我是指北君。今天來(lái)給大家介紹一下MySQL與Redis延遲雙刪策略

背景

在當(dāng)前環(huán)境下,通常我們會(huì)首選redis緩存來(lái)減輕我們數(shù)據(jù)庫(kù)訪問(wèn)壓力。但是也會(huì)遇到以下這種情況:大量用戶來(lái)訪問(wèn)我們系統(tǒng),首先會(huì)去查詢緩存, 如果緩存中沒(méi)有數(shù)據(jù),則去查詢數(shù)據(jù)庫(kù),然后更新數(shù)據(jù)到緩存中,并且如果數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生了改變則需要同步到redis中,同步過(guò)程中需要保證 MySQL與redis數(shù)據(jù)一致性問(wèn)題,在這個(gè)同步過(guò)程中出現(xiàn)短暫的數(shù)據(jù)延遲也是正?,F(xiàn)象,但是最終需要保證mysql與緩存中的一致性。

//我們通常使用redis的邏輯
//通常我們是先查詢r(jià)eids
String value = RedisUtils.get(key);
if (!StringUtils.isEmpty(value)){
return value;
}
//從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)
value = getValueForDb(key);
if (!StringUtils.isEmpty(value)){
RedisUtils.set(key,value);
return value;
}

1、什么是延遲雙刪?

延遲雙刪策略是分布式系統(tǒng)中數(shù)據(jù)庫(kù)存儲(chǔ)和緩存數(shù)據(jù)保持一致性的常用策略,但它不是強(qiáng)一致。其實(shí)不管哪種方案,都避免不了Redis存在臟數(shù)據(jù)的問(wèn)題,只能減輕這個(gè)問(wèn)題,要想徹底解決,得要用到同步鎖和對(duì)應(yīng)的業(yè)務(wù)邏輯層面解決。

2、為什么要進(jìn)行延遲雙刪?

一般我們?cè)诟聰?shù)據(jù)庫(kù)數(shù)據(jù)時(shí),需要同步redis中緩存的數(shù)據(jù) 所以我們一般會(huì)給出兩種方案:

  • 第一種方案:先執(zhí)行update操作,再執(zhí)行緩存清除。
  • 第二種方案:先執(zhí)行緩存清除,再執(zhí)行update操作。

但是這兩種方案在并發(fā)請(qǐng)求中容易出現(xiàn)以下問(wèn)題

圖片

  • 第一種方案弊端:當(dāng)請(qǐng)求1去執(zhí)行數(shù)據(jù)庫(kù)更新操作之后,還沒(méi)執(zhí)行緩存清除時(shí),請(qǐng)求2就進(jìn)來(lái)了查詢了緩存,此時(shí)緩存中數(shù)據(jù)還是舊數(shù)據(jù),還沒(méi)來(lái)得機(jī)刪除導(dǎo)致數(shù)據(jù)出現(xiàn)問(wèn)題,但是當(dāng)t1執(zhí)行緩存刪除操作之后,后面的請(qǐng)求查詢不到緩存,再到數(shù)據(jù)中查詢,然后更新到緩存中,這種影響是比較小的
  1. t1線程 先更新db;
  2. t2線程查詢命中緩存 返回舊的數(shù)據(jù);
  3. 假設(shè)t1線程更新完db,預(yù)計(jì)5毫秒刪除完緩存key 在5毫秒內(nèi)  其他線程查詢緩存結(jié)果還是為舊的數(shù)據(jù),但是 5毫秒后查詢緩存結(jié)果是為空,在從新將db最新的結(jié)果同步到Redis中。
  4. 一個(gè)項(xiàng)目中出現(xiàn)延遲是非常正常的,所以該情況發(fā)生的延遲對(duì)業(yè)務(wù)的影響其實(shí)很小。但是如果發(fā)生了,刪除緩存失敗呢?

1.不斷重試----如果是在http協(xié)議接口中 會(huì)導(dǎo)致接口響應(yīng)變慢 調(diào)用該接口 會(huì)發(fā)生響應(yīng)超時(shí) 2.或者通過(guò)mq異步的形式同步

圖片

  • 第二種方案弊端:當(dāng)請(qǐng)求1執(zhí)行清除緩存后,還未執(zhí)行數(shù)據(jù)更新操作的時(shí),請(qǐng)求2進(jìn)來(lái)查詢到數(shù)據(jù)庫(kù)的舊數(shù)據(jù),并寫入了redis,這就導(dǎo)致了數(shù)據(jù)庫(kù)與redis數(shù)據(jù)不一致問(wèn)題。
  1. t1線程先刪除緩存;
  2. t2線程讀取緩存為null,同步db數(shù)據(jù)到緩存中;
  3. t1線程更新db中的數(shù)據(jù);
  4. t3線程查詢緩存中數(shù)據(jù)是舊數(shù)據(jù);

3、對(duì)于方案處理都有弊端,那么我們需要使用延遲雙刪策略

先進(jìn)行緩存清除,再執(zhí)行update,最后(延遲N秒)再執(zhí)行緩存清除。進(jìn)行兩次刪除,且中間需要延遲一段時(shí)間

    RedisUtils.del(key);// 先刪除緩存
updateDB(user);// 更新db中的數(shù)據(jù)
Thread.sleep(N);// 延遲一段時(shí)間,在刪除該緩存key
RedisUtils.del(key);// 先刪除緩存

4、需要注意的點(diǎn)

上述中(延遲N秒)的時(shí)間要大于一次寫操作的時(shí)間。原因:如果延遲時(shí)間小于寫入redis的時(shí)間,會(huì)導(dǎo)致請(qǐng)求1清除了緩存,但是請(qǐng)求2緩存還未寫入的尷尬。。。

5、延遲的時(shí)間如何確定?

在業(yè)務(wù)程序運(yùn)行時(shí),統(tǒng)計(jì)業(yè)務(wù)邏輯執(zhí)行讀數(shù)據(jù)和寫緩存的操作時(shí)間,以此為基礎(chǔ)來(lái)進(jìn)行估算。因?yàn)檫@個(gè)方案會(huì)在第一次刪除緩存值后,延遲一段時(shí)間再次進(jìn)行刪除,所以稱為“延遲雙刪”。

小結(jié)

延遲雙刪策略只是一種同步數(shù)據(jù)庫(kù)與緩存的手段,在系統(tǒng)并發(fā)量不高的情況下可以使用這種方式解決,如果是并發(fā)量高的情況下我們也可以另尋其他解決方案 如:[數(shù)據(jù)庫(kù)和緩存一致性解決方案canal]


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

2020-05-08 08:50:26

Java垃圾JVM

2019-01-18 20:36:40

Python佩奇turtle

2024-11-11 10:34:55

2021-03-18 11:45:49

人工智能機(jī)器學(xué)習(xí)算法

2020-05-19 14:00:09

人工智能機(jī)器學(xué)習(xí)AI

2021-06-29 11:40:51

Python郵件命令

2022-08-16 21:01:56

runAsyncreload數(shù)據(jù)

2015-10-16 09:19:12

2017-12-20 10:08:53

2022-06-06 08:02:21

ahooks架構(gòu)hooks

2018-04-23 11:02:56

2020-09-18 10:00:04

騰訊AI語(yǔ)音

2024-05-08 16:37:17

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

2021-03-09 15:04:43

推薦算法LR

2009-12-04 09:49:55

華為愛(ài)立信

2010-08-06 13:37:18

思科路由器雙地址雙出口

2021-08-19 20:57:21

設(shè)計(jì)模式策略

2021-03-19 06:08:09

智慧城市物聯(lián)網(wǎng)城市服務(wù)

2022-02-23 12:01:41

內(nèi)部威脅數(shù)據(jù)泄露
點(diǎn)贊
收藏

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