缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性
緩存淘汰
為什么需要緩存淘汰?你需要緩存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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搞一个兼容浏览器的事件函数
- 下一篇: [转]mysql优化——show pro