1. 程式人生 > 實用技巧 >Redis 三大快取

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。

過去的有些事情不一定要忘記

但一定要放下