缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性
緩存淘汰
為什么需要緩存淘汰?你需要緩存30G的數據,但是Redis本身只能使用10G的內存,那你就得做個取舍了,畢竟魚與熊掌不可兼得。為了利益最大化肯定要保留最重要的10個G。
Redis本身提供了6中緩存淘汰策略,以下屬性表示允許使用的最大內存
| 1 | server.maxmemory |
當使用的內存超過限制內存時,Redis會根據配置的以下6中淘汰策略選擇數據淘汰
volatile-lru:從已設置過期時間的數據集中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集中任意選擇數據淘汰
allkeys-lru:從數據集中挑選最近最少使用的數據淘汰
allkeys-random:從數據集中任意選擇數據淘汰
no-enviction:內存不足時添加數據會報錯(沒人用這個吧?)
其他相關配置:
| 1 2 3 4 | 指定數據淘汰算法 maxmemory-policy allkeys-lru LRU和最小TTL算法的樣本個數 maxmemory-samples 5 |
緩存穿透
大量的請求瞬時涌入系統,而這個數據在Redis中不存在,從而所有的請求都落到了數據庫上從而把數據庫打死。造成這種情況的原因如下:
系統設計不合理,緩存數據更新不及時
爬蟲等惡意***
解決方案:
如果key在數據庫中也不存在,那么就寫一個空值到Redis中,并設置一個過期時間,避免一直占用內存
查詢緩存之前使用布隆過濾器攔截
緩存擊穿
緩存擊穿,就是常說的熱點key問題,當一個正有非常巨大的訪問量訪問的key 在失效的瞬間,大量的請求擊穿了緩存,直接落到了數據庫上,然后所有從數據獲取到數據的線程又都并發的想要把數據緩存到redis中。
解決方案:
使用互斥鎖,同一時刻只允許一個線程去構建緩存,其他線程等待構建完畢后去緩存取
定時更新,假如緩存過期時間為60分鐘,則單獨設置一個線程每59分鐘去負責更新緩存
緩存雪崩
由于Redis是基于內存的應用,可以很容易做到高性能、高并發從而起到保護數據庫的作用。如果緩存意外掛了、所有的請求落到了數據上就形成了緩存雪崩。
解決方案:
事前:使用主從復制+哨兵或者Redis集群。Redis主從復制、Redis的哨兵機制、Redis集群環境搭建
事中:本地緩存結合限流和降級。基于注解的分布式限流組件
事后:開啟持久化配置,實現快速緩存的快速恢復。 Redis 的持久化機制
數據庫緩存雙寫一致性
當一個數據需要更新時因為不可能做到同時更新數據庫和緩存、那么此時讀取數據的時候就一定會發生數據不一致問題,而數據不一致問題在金融交易領域的系統中是肯定不允許的。
解決方案:
讀的時候,先讀緩存,緩存沒有的話,就讀數據庫,然后取出數據后放入緩存,同時返回響應。
更新的時候,先更新數據庫,然后再刪除緩存。
參考自公眾號:石杉的架構筆記
推薦閱讀
SpringCloud學習系列匯總
多線程面試必備基礎知識匯總
Java集合源碼分析匯總-JDK1.8
Linux常用命令速查-匯總篇
博客所有文章首發于公眾號《Java學習錄》轉載請保留
掃碼關注公眾號即可領取2000GJava學習資源
轉載于:https://blog.51cto.com/12980017/2386383
總結
以上是生活随笔為你收集整理的缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搞一个兼容浏览器的事件函数
- 下一篇: python 压力测试小 demo