并發(fā)編程中的一致性 在大數(shù)據(jù)高并發(fā)環(huán)境下應(yīng)該怎么保證庫存或者下單同步?
在大數(shù)據(jù)高并發(fā)環(huán)境下應(yīng)該怎么保證庫存或者下單同步?在互聯(lián)網(wǎng)開發(fā)中,如果在大數(shù)據(jù)、高并發(fā)的環(huán)境下,很多人下單,如何保證庫存的抵扣永遠(yuǎn)正確?將庫存加載到緩存中,如rDB讀寫分離情況下,如何解決緩存和數(shù)據(jù)庫
在大數(shù)據(jù)高并發(fā)環(huán)境下應(yīng)該怎么保證庫存或者下單同步?
在互聯(lián)網(wǎng)開發(fā)中,如果在大數(shù)據(jù)、高并發(fā)的環(huán)境下,很多人下單,如何保證庫存的抵扣永遠(yuǎn)正確?
將庫存加載到緩存中,如r
DB讀寫分離情況下,如何解決緩存和數(shù)據(jù)庫不一致性問題?
說明:連續(xù)寫數(shù)據(jù)庫和緩存,但是在操作過程中,存在并發(fā),數(shù)據(jù)不一致。
通常,高速緩存和數(shù)據(jù)庫按以下順序更新:
l先更新數(shù)據(jù)庫,再更新緩存。
l先刪除緩存,再更新數(shù)據(jù)庫。
l首先更新數(shù)據(jù)庫,然后刪除緩存。
看看這三種的優(yōu)缺點(diǎn):
請(qǐng)?jiān)诟戮彺嬷案聰?shù)據(jù)庫。
這樣做的問題是,當(dāng)同時(shí)有兩個(gè)更新數(shù)據(jù)的請(qǐng)求時(shí),如果您不 不要使用分布式鎖,你不會(huì) 不能控制最后緩存的值是什么。就是并發(fā)寫的時(shí)候有問題。
請(qǐng)?jiān)诟聰?shù)據(jù)庫之前刪除緩存。
這樣做的問題是,如果客戶端在刪除緩存后讀取數(shù)據(jù),它可能會(huì)讀取舊數(shù)據(jù)并將其設(shè)置在緩存中,導(dǎo)致緩存中的數(shù)據(jù)總是舊數(shù)據(jù)。
有兩種解決方案:
我使用 "雙重刪除 ",即刪除或刪除。刪除的最后一步是異步操作,這是為了防止舊值在客戶端讀取時(shí)被設(shè)置。
我用隊(duì)列。當(dāng)這個(gè)鍵不存在時(shí),將它放入隊(duì)列中并順序執(zhí)行。你可以 直到數(shù)據(jù)庫更新后才能讀取數(shù)據(jù)。
總的來說比較麻煩。
請(qǐng)?jiān)趧h除緩存之前更新數(shù)據(jù)庫。
這實(shí)際上是一個(gè)常見的方案,但許多人不 我不知道。我在這里介紹一下。It 我們稱之為緩存?zhèn)溆媚J?,是外國人發(fā)明的。如果首先更新數(shù)據(jù)庫,然后刪除緩存,那么將顯示更新次數(shù)。根據(jù)數(shù)據(jù)庫,以前有瞬時(shí)數(shù)據(jù)不是很及時(shí)。
同時(shí),如果更新前緩存剛好失效,讀客戶端可能會(huì)讀取舊值,然后在寫客戶端刪除后重新設(shè)置舊值,這是非常巧合的。
有兩個(gè)前提條件:寫之前緩存無效,同時(shí)寫客戶端刪除操作之后舊數(shù)據(jù)放置——也就是讀比寫慢。一些寫操作也會(huì)鎖定表。
所以,這很難出現(xiàn),但如果出現(xiàn)了呢?使用雙重刪除?。。∮涗浉缕陂g客戶端是否讀取數(shù)據(jù)庫,如果是,則在更新數(shù)據(jù)庫后執(zhí)行延遲刪除。