日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

09丨缓存异常:如何解决缓存和数据库的数据不一致问题

發(fā)布時(shí)間:2024/10/6 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 09丨缓存异常:如何解决缓存和数据库的数据不一致问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致是如何發(fā)生的?

??首先,我們得清楚“數(shù)據(jù)的一致性”具體是啥意思。其實(shí),這里的“一致性”包含了兩種情況:

  • 緩存中有數(shù)據(jù),那么,緩存的數(shù)據(jù)值需要和數(shù)據(jù)庫(kù)中的值相同;
  • 緩存中本身沒(méi)有數(shù)據(jù),那么,數(shù)據(jù)庫(kù)中的值必須是最新值。

??對(duì)于讀寫(xiě)緩存來(lái)說(shuō),如果要對(duì)數(shù)據(jù)進(jìn)行增刪改,就需要在緩存中進(jìn)行,同時(shí)還要根據(jù)采取的寫(xiě)回策略,決定是否同步寫(xiě)回到數(shù)據(jù)庫(kù)中。
同步直寫(xiě)策略:寫(xiě)緩存時(shí),也同步寫(xiě)數(shù)據(jù)庫(kù),緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致;

  • 異步寫(xiě)回策略:寫(xiě)緩存時(shí)不同步寫(xiě)數(shù)據(jù)庫(kù),等到數(shù)據(jù)從緩存中淘汰時(shí),再寫(xiě)回?cái)?shù)據(jù)庫(kù)。使用這種策略時(shí),
  • 如果數(shù)據(jù)還沒(méi)有寫(xiě)回?cái)?shù)據(jù)庫(kù),緩存就發(fā)生了故障,那么,此時(shí),數(shù)據(jù)庫(kù)就沒(méi)有最新的數(shù)據(jù)了。

2. 如何解決數(shù)據(jù)不一致問(wèn)題?

??重試機(jī)制具體來(lái)說(shuō),可以把要?jiǎng)h除的緩存值或者是要更新的數(shù)據(jù)庫(kù)值暫存到消息隊(duì)列中(例如使用Kafka 消息隊(duì)列)。當(dāng)應(yīng)用沒(méi)有能夠成功地刪除緩存值或者是更新數(shù)據(jù)庫(kù)值時(shí),可以從消息隊(duì)列中重新讀取這些值,然后再次進(jìn)行刪除或更新。

??當(dāng)有大量并發(fā)請(qǐng)求時(shí),應(yīng)用還是有可能讀到不一致,按照不同的刪除和更新順序,分成兩種情況來(lái)看。在這兩種情況下,我們的解決方法也有所不同。
情況一:先刪除緩存,再更新數(shù)據(jù)庫(kù)。
??假設(shè)線程 A 刪除緩存值后,還沒(méi)有來(lái)得及更新數(shù)據(jù)庫(kù)(比如說(shuō)有網(wǎng)絡(luò)延遲),線程 B 就開(kāi)始讀取數(shù)據(jù)了,那么這個(gè)時(shí)候,線程 B 會(huì)發(fā)現(xiàn)緩存缺失,就只能去數(shù)據(jù)庫(kù)讀取。這會(huì)帶來(lái)兩個(gè)問(wèn)題:

  • 線程 B 讀取到了舊值;
  • 線程 B 是在緩存缺失的情況下讀取的數(shù)據(jù)庫(kù),所以,它還會(huì)把舊值寫(xiě)入緩存,這可能會(huì)導(dǎo)致其他線程從緩存中讀到舊值。

    在線程 A 更新完數(shù)據(jù)庫(kù)值以后,我們可以讓它先 sleep 一小段時(shí)間,再進(jìn)行一次緩存刪除操作。
    情況二:先更新數(shù)據(jù)庫(kù)值,再刪除緩存值。
    ??如果線程 A 刪除了數(shù)據(jù)庫(kù)中的值,但還沒(méi)來(lái)得及刪除緩存值,線程 B 就開(kāi)始讀取數(shù)據(jù)了,那么此時(shí),線程 B 查詢緩存時(shí),發(fā)現(xiàn)緩存命中,就會(huì)直接從緩存中讀取舊值。不過(guò),在這種情況下,如果其他線程并發(fā)讀緩存的請(qǐng)求不多,那么,就不會(huì)有很多請(qǐng)求讀取到舊值。而且,線程 A 一般也會(huì)很快刪除緩存值,這樣一來(lái),其他線程再次讀取時(shí),就會(huì)發(fā)生緩存缺失,進(jìn)而從數(shù)據(jù)庫(kù)中讀取最新值。所以,這種情況對(duì)業(yè)務(wù)的影響較小。

    ??對(duì)于讀寫(xiě)緩存來(lái)說(shuō),如果我們采用同步寫(xiě)回策略,那么可以保證緩存和數(shù)據(jù)庫(kù)中的數(shù)據(jù)一致。只讀緩存的情況比較復(fù)雜,我總結(jié)了一張表,以便于你更加清晰地了解數(shù)據(jù)不一致的問(wèn)題原因、現(xiàn)象和應(yīng)對(duì)方案。

3. 如何解決緩存雪崩、擊穿、穿透

總結(jié)

以上是生活随笔為你收集整理的09丨缓存异常:如何解决缓存和数据库的数据不一致问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。