1.分布式
1.集中式
傳統(tǒng)的計(jì)算模型通常是集中式的,所有的計(jì)算任務(wù)和數(shù)據(jù)處理都由單一的計(jì)算機(jī)或服務(wù)器完成。然而,隨著數(shù)據(jù)量和計(jì)算需求的增加,集中式系統(tǒng)可能會(huì)面臨性能瓶頸和可靠性問(wèn)題。
故而引出了分布式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
2.分布式
分布式是一種利用多臺(tái)計(jì)算機(jī)協(xié)同工作來(lái)完成任務(wù)的計(jì)算模型。
分布式系統(tǒng)的目標(biāo)是通過(guò)將任務(wù)和數(shù)據(jù)分割成小塊,將計(jì)算任務(wù)分發(fā)到不同的計(jì)算節(jié)點(diǎn)上,充分利用多臺(tái)計(jì)算機(jī)的處理能力,以應(yīng)對(duì)大規(guī)模的計(jì)算需求,以提高性能、可擴(kuò)展性和容錯(cuò)性。
分布式系統(tǒng)的一些問(wèn)題:數(shù)據(jù)一致性、通信延遲、故障處理等。為了解決這些問(wèn)題,需要使用各種技術(shù)和算法,如分布式數(shù)據(jù)庫(kù)、消息隊(duì)列、負(fù)載均衡、分布式存儲(chǔ)等。
2.分布式緩存
例如:redis緩存
分布式緩存是用于存儲(chǔ)和管理數(shù)據(jù)以提高性能和響應(yīng)速度的一種技術(shù)。
通常用于加速應(yīng)用程序的數(shù)據(jù)訪問(wèn),減輕后端數(shù)據(jù)庫(kù)或其他數(shù)據(jù)存儲(chǔ)系統(tǒng)的負(fù)載。
在分布式緩存中,數(shù)據(jù)被存儲(chǔ)在位于應(yīng)用程序和數(shù)據(jù)存儲(chǔ)系統(tǒng)之間的一個(gè)或多個(gè)緩存節(jié)點(diǎn)中。這些節(jié)點(diǎn)可以位于不同的服務(wù)器或計(jì)算機(jī)上,形成一個(gè)分布式的緩存網(wǎng)絡(luò)。當(dāng)應(yīng)用程序需要訪問(wèn)數(shù)據(jù)時(shí),它首先會(huì)查詢緩存,如果緩存中存在數(shù)據(jù),就可以快速獲取而不必訪問(wèn)原始數(shù)據(jù)存儲(chǔ)系統(tǒng)。
需要注意的問(wèn)題:
-
緩存穿透
-
緩存擊穿
-
緩存雪崩
-
數(shù)據(jù)一致性
1.緩存穿透
指查詢一個(gè)數(shù)據(jù)庫(kù)中一定不存在的數(shù)據(jù),由于緩存是不命中,將去查詢數(shù)據(jù)庫(kù),但是數(shù)據(jù)庫(kù)也無(wú)此記錄
解決方案:
1.緩存null
當(dāng)數(shù)據(jù)庫(kù)中查不到數(shù)據(jù)的時(shí)候,緩存一個(gè)空對(duì)象,然后給這個(gè)空對(duì)象的緩存設(shè)置一個(gè)過(guò)期時(shí)間,這樣下次再查詢?cè)摂?shù)據(jù)的時(shí)候,就可以直接從緩存中拿到,從而達(dá)到了減小數(shù)據(jù)庫(kù)壓力的目的
存在缺點(diǎn):
-
需要緩存層提供更多的內(nèi)存空間來(lái)緩存這些空對(duì)象,當(dāng)這種空對(duì)象很多的時(shí)候,就會(huì)浪費(fèi)更多的內(nèi)存;
-
會(huì)導(dǎo)致緩存層和存儲(chǔ)層的數(shù)據(jù)不一致,即使在緩存空對(duì)象時(shí)給它設(shè)置了一個(gè)很短的過(guò)期時(shí)間,那也會(huì)導(dǎo)致這一段時(shí)間內(nèi)的數(shù)據(jù)不一致問(wèn)題。
2.使用布隆過(guò)濾器
布隆過(guò)濾器:
布隆過(guò)濾器,就是一種數(shù)據(jù)結(jié)構(gòu),它是由一個(gè)長(zhǎng)度為m bit的位數(shù)組與n個(gè)hash函數(shù)組成的數(shù)據(jù)結(jié)構(gòu),位數(shù)組中每個(gè)元素的初始值都是0。在初始化布隆過(guò)濾器時(shí),會(huì)先將所有key進(jìn)行n次hash運(yùn)算,這樣就可以得到n個(gè)位置,然后將這n個(gè)位置上的元素改為1。這樣,就相當(dāng)于把所有的key保存到了布隆過(guò)濾器中了。
布隆過(guò)濾器就相當(dāng)于一個(gè)位于客戶端與緩存層中間的攔截器一樣,負(fù)責(zé)判斷key是否在集合中存在
存在缺點(diǎn):
有誤判的可能(位數(shù)組長(zhǎng)度越大,誤判率越低): 例如:
有三個(gè)key,經(jīng)hash運(yùn)算后
key1: 1 、2 、4
key2: 2 、5 、6
key3: 4、 5 、6 由于4、5、6都以存在已置為1,布隆過(guò)濾器就認(rèn)為key3在庫(kù)中存在
2.緩存擊穿
對(duì)于設(shè)置了過(guò)期時(shí)間的key(一個(gè)key),緩存在某個(gè)時(shí)間點(diǎn)過(guò)期了,在該熱點(diǎn)數(shù)據(jù)重新載入緩存之前,恰好這時(shí)間點(diǎn)對(duì)這個(gè)Key有大量的并發(fā)請(qǐng)求過(guò)來(lái),這些請(qǐng)求發(fā)現(xiàn)緩存過(guò)期一般都會(huì)從后端 DB 加載數(shù)據(jù)并回設(shè)到緩存,這個(gè)時(shí)候大并發(fā)的請(qǐng)求可能會(huì)瞬間把 DB 壓垮。
解決方案:
1.永遠(yuǎn)不過(guò)期
-
不對(duì)這個(gè)key設(shè)置過(guò)期時(shí)間
-
正常給key設(shè)置過(guò)期時(shí)間,同時(shí)在后臺(tái)同時(shí)啟一個(gè)定時(shí)任務(wù)去定時(shí)地更新這個(gè)緩存
2.使用分布式鎖
同一時(shí)刻只能有一個(gè)查詢請(qǐng)求重新加載熱點(diǎn)數(shù)據(jù)到緩存中。
這樣,其他的線程只需等待該線程運(yùn)行完畢,即可重新從Redis中獲取數(shù)據(jù)
整體的思想:獲取鎖的時(shí)候向Redis中插入數(shù)據(jù),釋放鎖的時(shí)候從Redis中刪除數(shù)據(jù)。
使用的命令: setnx
詳細(xì)往下看↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
3.緩存雪崩
當(dāng)緩存中有大量的key在同一時(shí)刻過(guò)期,或者Redis直接宕機(jī)了,導(dǎo)致大量的查詢請(qǐng)求全部到達(dá)數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)查詢壓力驟增,甚至直接掛掉
解決方案:
1.添加過(guò)期隨機(jī)數(shù),使key均勻失效
將key的過(guò)期時(shí)間后面加上一個(gè)隨機(jī)數(shù),這個(gè)隨機(jī)數(shù)值的范圍可以根據(jù)自己的業(yè)務(wù)情況自行設(shè)定,這樣可以讓key均勻的失效,避免大批量的同時(shí)失效。
4.數(shù)據(jù)一致性問(wèn)題
因?yàn)閿?shù)據(jù)庫(kù)與緩存是不同的組件,操作必須有先后順序,無(wú)法像數(shù)據(jù)庫(kù)的事務(wù)一樣滿足ACID的特性,所以就會(huì)出現(xiàn)數(shù)據(jù)在緩存中與在數(shù)據(jù)
庫(kù)中不一致的問(wèn)題。
在更新的時(shí)候,操作緩存和數(shù)據(jù)庫(kù)無(wú)疑就是以下四種可能之一:
1.雙寫(xiě)模式:
-
先更新緩存,再更新數(shù)據(jù)庫(kù)
-
先更新數(shù)據(jù)庫(kù),再更新緩存
2.失效模式:
-
先刪除緩存,再更新數(shù)據(jù)庫(kù)
-
先更新數(shù)據(jù)庫(kù),再刪除緩存
1.先更新緩存,在更新數(shù)據(jù)庫(kù)
如果我成功更新了緩存,但是在執(zhí)行更新數(shù)據(jù)庫(kù)的那一步,服務(wù)器突然宕機(jī)了,那么此時(shí),我的緩存中是最新的數(shù)據(jù),而數(shù)據(jù)庫(kù)中是舊的數(shù)據(jù)。
2.先更新數(shù)據(jù)庫(kù),在更新緩存
如果我成功更新了數(shù)據(jù)庫(kù),但是在執(zhí)行更新緩存的那一步,服務(wù)器突然宕機(jī)了,那么此時(shí),我的緩存中就是老數(shù)據(jù),而數(shù)據(jù)庫(kù)中是新的數(shù)據(jù)。
3.先刪除緩存,在更新數(shù)據(jù)庫(kù)
非高并發(fā)情況下可保證數(shù)據(jù)一致性:
若刪除緩存成功,更新數(shù)據(jù)庫(kù)失敗,下次操作會(huì)去數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù),并將最新數(shù)據(jù)寫(xiě)入緩存
讀寫(xiě)發(fā)情況下會(huì)出現(xiàn)數(shù)據(jù)不一致問(wèn)題:
4.先更新數(shù)據(jù)庫(kù),在刪除緩存
1.更新數(shù)據(jù)庫(kù)成功了,而刪除緩存失敗
數(shù)據(jù)庫(kù)中就會(huì)是新數(shù)據(jù),而緩存中是舊數(shù)據(jù),數(shù)據(jù)就出現(xiàn)了不一致情況:
2.更新數(shù)據(jù)庫(kù)成功了,刪除緩存也執(zhí)行成功
還是會(huì)造成數(shù)據(jù)的不一致性
但是此處達(dá)成這個(gè)數(shù)據(jù)不一致性的條件明顯會(huì)比起其他的方式更為困難 :
-
時(shí)刻1:讀請(qǐng)求的時(shí)候,緩存正好過(guò)期
-
時(shí)刻2:讀請(qǐng)求在寫(xiě)請(qǐng)求更新數(shù)據(jù)庫(kù)之前查詢數(shù)據(jù)庫(kù),
-
時(shí)刻3:寫(xiě)請(qǐng)求,在更新數(shù)據(jù)庫(kù)之后,要在讀請(qǐng)求成功寫(xiě)入緩存前,先執(zhí)行刪除緩存操作。
這通常是很難做到的,因?yàn)樵谡嬲牟l(fā)開(kāi)發(fā)中,更新數(shù)據(jù)庫(kù)是需要加鎖的,不然沒(méi)一點(diǎn)安全性
5.延遲雙刪
先進(jìn)行緩存清除,在更新數(shù)據(jù)庫(kù),最后(延遲N秒確保數(shù)據(jù)庫(kù)已更新)再執(zhí)行緩存清除。進(jìn)行兩次刪除,且中間需要延遲一段時(shí)間
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-727517.html
上述方案在極端情況下,如果第三步刪除失敗仍然可能導(dǎo)致數(shù)據(jù)一致性問(wèn)題,解決方案有:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-727517.html
?????引入MQ重試機(jī)制,基于數(shù)據(jù)庫(kù)binlog的方式增量解析、訂閱和消費(fèi)
到了這里,關(guān)于一文拿捏分布式、分布式緩存及其問(wèn)題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!