Redis学习之缓存穿透、缓存击穿和缓存雪崩详解
生活随笔
收集整理的這篇文章主要介紹了
Redis学习之缓存穿透、缓存击穿和缓存雪崩详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 緩存穿透
- 解決方案
- 緩存空對象
- 布隆過濾器
- 緩存擊穿
- 解決方案
- 對訪問數據庫的操作加鎖
- 提前緩存熱點數據,設置熱點數據永不過期
- 緩存雪崩
- 解決方案
- Redis高可用
- 限流降級
- 數據預熱
- 設置合理的過期時間
- 參考
緩存穿透
指的是對某個一定不存在的數據進行請求,該請求將會穿透緩存到達數據庫。
如:用戶查詢一個 id = -1 的商品信息,一般數據庫 id 值都是從 1 開始自增,很明顯這條信息是不在數據庫中,當沒有信息返回時,會一直向數據庫查詢,給當前數據庫的造成很大的訪問壓力。
解決方案
-
緩存空對象
緩存空對象是指一個請求發送過來,如果此時緩存中和數據庫都不存在這個請求所要查詢的相關信息,那么數據庫就會返回一個空對象,并將這個空對象和請求關聯起來存到緩存中,當下次還是這個請求過來的時候,這時緩存就會命中,就直接從緩存中返回這個空對象,這樣可以減少訪問數據庫的壓力,提高當前數據庫的訪問性能。
缺點:可能會緩存大量空對象,浪費內存,可以通過設置過期時間解決 -
布隆過濾器
布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量(位圖)和一系列隨機映射函數(哈希函數)。
布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤識別率和刪除困難。
布隆過濾器詳細介紹
使用流程:
(1)將數據庫所有的數據加載到布隆過濾器
(2)查布隆過濾器(如果未命中直接結束)
(3)查Redis緩存數據(如果未命中查詢數據庫 )
(4)查詢數據庫
緩存擊穿
緩存擊穿是指有某個經常被查詢的key在緩存過期后或一個未被緩存的key,突然接受到大量有關這個key的訪問請求,這樣會導致大并發請求直接穿透緩存,請求數據庫,瞬間對數據庫的訪問壓力增大。
緩存擊穿的原因:
- 一個“冷門”(未緩存)的key,突然被大量用戶請求訪問。
- 一個“熱門”key,在緩存中時間恰好過期,這時有大量用戶來進行訪問。
解決方案
-
對訪問數據庫的操作加鎖
當key要查詢數據庫的時候加上一把鎖,這時只能讓第一個請求進行查詢數據庫,然后把從數據庫中查詢到的值存儲到緩存中,對于剩下的相同的key,可以直接從緩存中獲取即可。
- 單機環境下:使用Lock、Synchronized 加鎖
- 分布式環境下使用分布式鎖,如:基于數據庫、基于Redis或者zookeeper 的分布式鎖。
-
提前緩存熱點數據,設置熱點數據永不過期
緩存雪崩
緩存雪崩是指在某一個時間段內,緩存集中過期失效,如果這個時間段內有大量請求,而查詢數據量巨大,所有的請求都會達到存儲層,存儲層的調用量會暴增,引起數據庫壓力過大甚至宕機。
緩存雪崩的原因:
- Redis宕機
- 大量熱點數據同時過期
解決方案
-
Redis高可用
搭建Redis集群(哨兵模式),減少Redis宕機的可能 -
限流降級
在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量,對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。 -
數據預熱
在正式部署之前,先把可能的數據先預先訪問一遍,這樣部分可能大量訪問的數據就會加載到緩存中。在即將發生大并發訪問前手動觸發加載緩存不同的key。 -
設置合理的過期時間
為了防止緩存在同一時間大面積過期導致的緩存雪崩,可以通過觀察用戶行為,合理設置緩存過期時間來實現;
參考
Redis的緩存了解嗎?
Cyc2018
總結
以上是生活随笔為你收集整理的Redis学习之缓存穿透、缓存击穿和缓存雪崩详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dv数码摄像机(dv数码摄像机永久删除软
- 下一篇: 上海电脑技术学校(上海计算机职业技术学校