Redis 三大快取
Redis 三大快取
過去的有些事情不一定要忘記,但一定要放下。
背景:Redis 三大快取:快取穿透、快取擊穿、快取雪崩,是Redis 面試必須要掌握的東西。
一、快取穿透
1.概念簡述
快取穿透是指當用戶在查詢一條資料時,而此時資料庫和快取卻沒有關於這條資料的任何記錄;而該資料若在快取中沒找到則會向資料庫請求獲取資料,Redis 拿不到資料時,就會一直查詢資料庫,這樣會對資料庫的訪問造成很大的壓力。
2.案例
使用者查詢一個 id = -1 的商品資訊,但是資料庫 id 自增是從 1 開始的,很明顯這條資訊是不在資料庫中,當沒有資訊返回時,Redis 會一直向資料庫查詢,給當前資料庫訪問造成很大的壓力。
3.解決方案
A、從快取出發,給快取設定一個 如果當前資料庫不存在 的資訊,把它快取為一個空物件,返回給使用者;
B、快取空物件的解決方案程式碼簡單,但效果不是很好;可以考慮使用Redis 提供的布隆過濾器。
Redis 布隆過濾器程式碼:
1 package com.ausclouds.bdbsec.tjt;
2
3 import com.google.common.hash.BloomFilter;
4 import com.google.common.hash.Funnels;
5
6 import java.nio.charset.Charset;
7
8 /**
9 * Redis 布隆過濾器
10 * 引入依賴:
11 * <dependency>
12 * <groupId>com.google.guava</groupId>
13 * <artifactId>guava</artifactId>
14 * <version>22.0</version>
15 * </dependency>
16 */
17 public class BloomFilterDemon {
18
19 // initial_size: 表示預計放入的元素數量,當實際數量超出這個數值時,誤判率會上升
20 private static long initial_size = 1000000;
21
22 // error_rate: 錯誤率
23 private static double error_rate = 0.0001;
24
25 public static void main(String[] args) {
26 BloomFilter<String> bloomFilter =
27 BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), initial_size, error_rate);
28 bloomFilter.put("what");
29 boolean isContain = bloomFilter.mightContain("what");
30
31 }
32
33
34 }
View Code~拍一拍小輪胎
快取空物件流程圖
二、快取擊穿
1.概念簡述
快取擊穿是指有某個key 經常被查詢,或者某個key 不經常被訪問,而這個時候,若該key 在快取的過期時間失效或者是個冷門key 的時候,突然有大量關於這個key 的訪問請求,這樣就會導致大併發請求直接穿透快取,請求資料庫,瞬間增大了資料庫的訪問壓力。
2.案例
(1)一個“冷門”key,突然被大量使用者請求訪問;
(2)一個“熱門”key,在快取中時間恰好過期,這時有大量使用者來進行訪問。
快取擊穿案例圖
3.解決方案
對於快取擊穿問題,常用的解決方案是加鎖;對於key 過期問題,當key 要查詢資料庫的時候加上鎖,保證只能讓第一個請求進行查詢資料庫操作,然後把從資料庫中查詢到的值儲存到快取中,對於剩下的相同的key,則可直接從快取中獲取。
快取擊穿解決方案圖
三、快取雪崩
1.概念簡述
快取雪崩是指在某一個時間段內,快取集中過期失效,若這個時間段內有大量請求,並且查詢資料量巨大,所有的請求都會查詢資料庫,使資料庫的呼叫瞬間量劇增,引起資料庫壓力過大甚至宕機。(Redis 突然宕機或大部分資料失效)
2.案例
某寶雙十一購物節,在 23:00-24:00 舉行商品促銷活動。開發人員是這麼設計的:在 23:00 把商家促銷的商品放到快取中,並通過redis 的expire 設定了過期時間為1小時;這個時間段許多使用者在訪問這些商品資訊,但是剛好到了24:00點的時候,恰好還有許多使用者在訪問這些商品,此時對這些商品的訪問都會轉到資料庫上,導致資料庫壓力突然劇增,甚至直接宕機。
3.解決方案
A、限流降級
在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取和寫快取的執行緒數量,對某個key 同一時刻只允許一個執行緒執行查詢設計和寫快取操作。
B、Redis 高可用
可能會出現Redis 掛掉的情況,多增加幾臺Redis 例項(一主多從),即使一臺掛掉之後其他的還可以繼續工作。
C、不同過期時間
設定不同的過期時間,讓快取失效的時間儘量均勻,避免同一時間大量快取失效。
D、資料預加熱
資料加熱的含義就是在正式部署之前,先把可能用到的資料預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中;一般可以在即將發生大併發訪問前手動觸發載入快取不同的key。
過去的有些事情不一定要忘記
但一定要放下