目錄
一、引言
二、介紹
1.為什么Mysql的速度慢呢?
2.緩存更新策略
1.定期生成
2.實時生成
3.redis的內存淘汰機制
4.注意事項
1.緩存預熱
2.緩存穿透
3.緩存擊穿
4.緩存雪崩
三、總結
一、引言
? 本篇文章將介紹Redis其中一個重要的作用,作為緩存。
二、介紹
Redis中的數據主要是存儲在內存中,讀取速度比硬盤快得多。
Redis一般是作為Mysql的緩存
1.為什么Mysql的速度慢呢?
1.數據存儲在硬盤上,磁盤的IO速度并不快,尤其是隨機訪問
2.查詢有時候沒有走索引,直接全表掃描了,速度下降
3.如果是復雜的查詢,比如聯合查詢,需要進行笛卡爾積的操作,速度會更慢
2.緩存更新策略
1.定期生成
會把訪問的數據以日志的形式記錄下來
統計這一段時間這些數據使用的頻率,然后將這些數據設置為熱點數據,放入Redis中
之后規定一定的時間自己去生成這些熱點數據
缺點:不能及時的更新,如果某個不是熱點數據的數據忽然變成了熱點數據,不能及時更新到redis中
2.實時生成
先去redis中查,查到了就返回。如果沒有查到就去mysql中查到,然后寫入到redis中
但是這樣redis會越寫越多,怎么解決呢?
3.redis的內存淘汰機制
1.寫滿了之后就不允許寫入了(不適合于實時更新)
2.沒有過期時間:淘汰使用頻率最低的,隨機淘汰
3.有過期時間:淘汰使用頻率最低的,隨機淘汰,淘汰時間即將過期的
淘汰存在最久的(FIFO),淘汰使用頻率最低的(LFU),淘汰最近一次使用時間最久的(LRU),隨機淘汰(RANDOM)
4.注意事項
1.緩存預熱
項目剛啟動的時候,先將部分沒有訪問的數據放入到redis中
2.緩存穿透
查詢的某個key,在redis中不存在,在mysql中也沒有,大量的請求都到達mysql了,會使得mysql宕機。
解決方式:1.進行參數檢查? 2.當一個key查找數據庫中不存在時,把一個空對象或者默認值保存在緩存中,之后再訪問這個數據,從緩存中獲取(存在的問題:緩存中有更多的key了,占用空間,數據不一致問題)。3.布隆過濾器:會保存數據是否存在,如果判斷數據不在,就不會訪問存儲層。
3.緩存擊穿
某個時期一個熱點key突然過期了,導致大量請求打到mysql上,導致mysql掛掉
解決方式:1.對熱點key永不過期
2.服務降級:關閉一些不是特別重要的功能
4.緩存雪崩
由于短時間內,大規模的key失效了,緩存命中率大幅下降,mysql的壓力迅速上升,甚至于宕機
解決方式:1.加強監控報警,加強redis集群可用性的保證
2.設置過期時間的時候添加一個隨機的因子/不設置過期時間
三、總結
? 本篇文章簡單介紹了Redis作為緩存的作用以及常見出現故障的情況,感謝觀看!