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

歡迎訪問 生活随笔!

生活随笔

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

数据库

缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

發(fā)布時間:2025/3/15 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

緩存淘汰

為什么需要緩存淘汰?你需要緩存30G的數(shù)據(jù),但是Redis本身只能使用10G的內(nèi)存,那你就得做個取舍了,畢竟魚與熊掌不可兼得。為了利益最大化肯定要保留最重要的10個G。

Redis本身提供了6中緩存淘汰策略,以下屬性表示允許使用的最大內(nèi)存

1
server.maxmemory

當(dāng)使用的內(nèi)存超過限制內(nèi)存時,Redis會根據(jù)配置的以下6中淘汰策略選擇數(shù)據(jù)淘汰

  • volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰

  • volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集挑選將要過期的數(shù)據(jù)淘汰

  • volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰

  • allkeys-lru:從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰

  • allkeys-random:從數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰

  • no-enviction:內(nèi)存不足時添加數(shù)據(jù)會報(bào)錯(沒人用這個吧?)
    其他相關(guān)配置:

1
2
3
4
#指定數(shù)據(jù)淘汰算法
maxmemory-policy allkeys-lru
#LRU和最小TTL算法的樣本個數(shù)
maxmemory-samples 5

緩存穿透

大量的請求瞬時涌入系統(tǒng),而這個數(shù)據(jù)在Redis中不存在,從而所有的請求都落到了數(shù)據(jù)庫上從而把數(shù)據(jù)庫打死。造成這種情況的原因如下:

  • 系統(tǒng)設(shè)計(jì)不合理,緩存數(shù)據(jù)更新不及時

  • 爬蟲等惡意***

解決方案:

  • 如果key在數(shù)據(jù)庫中也不存在,那么就寫一個空值到Redis中,并設(shè)置一個過期時間,避免一直占用內(nèi)存

  • 查詢緩存之前使用布隆過濾器攔截

緩存擊穿

緩存擊穿,就是常說的熱點(diǎn)key問題,當(dāng)一個正有非常巨大的訪問量訪問的key 在失效的瞬間,大量的請求擊穿了緩存,直接落到了數(shù)據(jù)庫上,然后所有從數(shù)據(jù)獲取到數(shù)據(jù)的線程又都并發(fā)的想要把數(shù)據(jù)緩存到redis中。

解決方案:

  • 使用互斥鎖,同一時刻只允許一個線程去構(gòu)建緩存,其他線程等待構(gòu)建完畢后去緩存取

  • 定時更新,假如緩存過期時間為60分鐘,則單獨(dú)設(shè)置一個線程每59分鐘去負(fù)責(zé)更新緩存

緩存雪崩

由于Redis是基于內(nèi)存的應(yīng)用,可以很容易做到高性能、高并發(fā)從而起到保護(hù)數(shù)據(jù)庫的作用。如果緩存意外掛了、所有的請求落到了數(shù)據(jù)上就形成了緩存雪崩。

解決方案:

  • 事前:使用主從復(fù)制+哨兵或者Redis集群。Redis主從復(fù)制、Redis的哨兵機(jī)制、Redis集群環(huán)境搭建

  • 事中:本地緩存結(jié)合限流和降級。基于注解的分布式限流組件

  • 事后:開啟持久化配置,實(shí)現(xiàn)快速緩存的快速恢復(fù)。 Redis 的持久化機(jī)制

數(shù)據(jù)庫緩存雙寫一致性

當(dāng)一個數(shù)據(jù)需要更新時因?yàn)椴豢赡茏龅酵瑫r更新數(shù)據(jù)庫和緩存、那么此時讀取數(shù)據(jù)的時候就一定會發(fā)生數(shù)據(jù)不一致問題,而數(shù)據(jù)不一致問題在金融交易領(lǐng)域的系統(tǒng)中是肯定不允許的。

解決方案:

  • 讀的時候,先讀緩存,緩存沒有的話,就讀數(shù)據(jù)庫,然后取出數(shù)據(jù)后放入緩存,同時返回響應(yīng)。

  • 更新的時候,先更新數(shù)據(jù)庫,然后再刪除緩存。

參考自公眾號:石杉的架構(gòu)筆記

推薦閱讀

  • SpringCloud學(xué)習(xí)系列匯總

  • 多線程面試必備基礎(chǔ)知識匯總

  • Java集合源碼分析匯總-JDK1.8

  • Linux常用命令速查-匯總篇

  • 博客所有文章首發(fā)于公眾號《Java學(xué)習(xí)錄》轉(zhuǎn)載請保留
    掃碼關(guān)注公眾號即可領(lǐng)取2000GJava學(xué)習(xí)資源


    轉(zhuǎn)載于:https://blog.51cto.com/12980017/2386383

    總結(jié)

    以上是生活随笔為你收集整理的缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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