并發(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)缺點:
請在更新緩存之前更新數(shù)據(jù)庫。
這樣做的問題是,當(dāng)同時有兩個更新數(shù)據(jù)的請求時,如果您不 不要使用分布式鎖,你不會 不能控制最后緩存的值是什么。就是并發(fā)寫的時候有問題。
請在更新數(shù)據(jù)庫之前刪除緩存。
這樣做的問題是,如果客戶端在刪除緩存后讀取數(shù)據(jù),它可能會讀取舊數(shù)據(jù)并將其設(shè)置在緩存中,導(dǎo)致緩存中的數(shù)據(jù)總是舊數(shù)據(jù)。
有兩種解決方案:
我使用 "雙重刪除 ",即刪除或刪除。刪除的最后一步是異步操作,這是為了防止舊值在客戶端讀取時被設(shè)置。
我用隊列。當(dāng)這個鍵不存在時,將它放入隊列中并順序執(zhí)行。你可以 直到數(shù)據(jù)庫更新后才能讀取數(shù)據(jù)。
總的來說比較麻煩。
請在刪除緩存之前更新數(shù)據(jù)庫。
這實際上是一個常見的方案,但許多人不 我不知道。我在這里介紹一下。It 我們稱之為緩存?zhèn)溆媚J剑峭鈬税l(fā)明的。如果首先更新數(shù)據(jù)庫,然后刪除緩存,那么將顯示更新次數(shù)。根據(jù)數(shù)據(jù)庫,以前有瞬時數(shù)據(jù)不是很及時。
同時,如果更新前緩存剛好失效,讀客戶端可能會讀取舊值,然后在寫客戶端刪除后重新設(shè)置舊值,這是非常巧合的。
有兩個前提條件:寫之前緩存無效,同時寫客戶端刪除操作之后舊數(shù)據(jù)放置——也就是讀比寫慢。一些寫操作也會鎖定表。
所以,這很難出現(xiàn),但如果出現(xiàn)了呢?使用雙重刪除?。?!記錄更新期間客戶端是否讀取數(shù)據(jù)庫,如果是,則在更新數(shù)據(jù)庫后執(zhí)行延遲刪除。