Redis实战-缓存穿透、缓存雪崩、缓存击穿和缓存并发的区别和解决方案
正常處理流程
??客戶端請求正常的時候,先讀緩存,如果數據命中,則返回緩存的值;否則,把從存儲層中讀取出來的數據緩存至緩存,同時返回客戶端。但是,為了保證系統高可用和高性能,設計一個緩存系統時必須考慮的要素包括緩存穿透、緩存擊穿、緩存雪崩和緩存并發等。這里,小編給大家簡明扼要地綜述一下它們的基本概念和解決策略。
緩存穿透
??基本概念:客戶端訪問緩存和數據庫中都沒有的數據,如果系統不對其緩存,就出現了緩存穿透。流量大時會導致存儲層掛掉。
??簡述:緩存中不存在的數據洪水猛獸般襲來,訪問穿透到存儲層。
??解決方案:
緩存空對象。
對于未命中緩存和存儲層的數據,設置默認值和五分鐘左右的有效期(有效期根據業務需要設置)。
使用布隆過濾器。
緩存擊穿
??基本概念:一個緩存key是熱點數據,在不停的扛著大并發,但過期那一刻持續的大并發就穿破緩存,導致存儲層請求量瞬間飆高。
??解決方案:
使用互斥鎖。
在發現緩存失效的時候(判斷拿出來的值為空),不是立即去請求DB,而是成功添加互斥鎖后再請求DB并回設緩存;否則,就重試查詢緩存的方法。提前使用互斥鎖。
在value內部設置1個超時標簽(timeout1),當從cache讀取到timeout1發現它已經過期的時候,馬上延長timeout1并重新設置到cache,然后再從數據庫加載數據并設置到cache中。
??緩存擊穿和緩存雪崩的區別在于前者針對某一個key,緩存雪崩則是針對很多key。緩存key在某個時間點過期的時候,恰好有大量的并發請求過來,這些請求發現緩存過期就從后端DB加載數據并回設到緩存,這個時候大并發的請求可能會瞬間把后端DB壓垮。
緩存雪崩
??基本概念:緩存服務器某個節點宕機或斷網或者在某一個時間段大量緩存集體失效,請求全部轉發到DB,DB壓力驟增而引起雪崩。
??解決方案:
使緩存過期時間呈泊松分布。
開啟緩存過期事件監聽和異步更新策略。
監聽到緩存過期時,異步起一個線程去讀數據庫,更新緩存。
修改Redis配置文件,開啟過期事件監聽:使notify-keyspace-events的值為Ex。
緩存并發
??基本概念:多個redis的client同時set key引起的并發問題。其實redis自身就是單線程操作,多個client并發操作,按照先到先執行的原則,先到的先執行,其余的阻塞。當然,另外的解決方案是把set操作放在隊列中使其串行化,必須一個一個的執行。
Reference
https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc
總結
以上是生活随笔為你收集整理的Redis实战-缓存穿透、缓存雪崩、缓存击穿和缓存并发的区别和解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试题:Spring BeanFacto
- 下一篇: Java 验证电子邮箱是否合法