Spring Boot使用Redis常用場景
一、概述:Redis 是什么?為什么要用它?
Redis(Remote Dictionary Server)是一個內存中的數據存儲系統(類似一個“超級大字典”),它能存各種類型的數據(字符串、列表、哈希等),而且讀寫速度極快(因為數據存在內存里)。
簡單說,Redis 就像電腦的“緩存抽屜”:當你的程序需要頻繁讀取或修改某些數據時(比如用戶登錄信息、商品銷量),直接從 Redis 里拿,比從硬盤的數據庫(如 MySQL)里拿快 10 倍甚至 更多倍!
二、Redis 支持的數據類型(5種最常用)
Redis 能存很多種“結構”的數據,就像不同形狀的盒子,裝不同的東西:
類型 | 特點 | 舉例場景 |
---|---|---|
字符串(String) | 最基礎類型,存文本或數字(比如 “張三” 或 “100”) | 存用戶手機號、商品庫存數量 |
哈希(Hash) | 類似“小字典”,存鍵值對的集合(比如 {“name”:“張三”, “age”:18}) | 存用戶詳細信息、商品屬性 |
列表(List) | 有序的字符串列表(類似數組,可從左/右添加元素) | 存朋友圈動態列表、日志隊列 |
集合(Set) | 無序、不重復的字符串集合(類似數學里的集合) | 存用戶點贊的商品ID(去重) |
有序集合(ZSet) | 類似集合,但每個元素有“分數”(按分數排序) | 存排行榜(比如積分排名) |
三、Redis 的常見使用場景
Redis 能解決很多實際問題,最常用的 4 種場景:
- 緩存(最常用!):把高頻訪問的數據(比如商品詳情、首頁廣告)存到 Redis,減少數據庫查詢次數。
- 計數器:用 Redis 的
INCR
命令(類似 +1 操作)統計文章閱讀量、視頻播放量,比數據庫的+1
快很多。 - 會話共享:多個服務器(比如 A 服務器和 B 服務器)共享用戶登錄狀態(存 Redis 里,不用每個服務器單獨存)。
- 分布式鎖:在秒殺活動中,用 Redis 保證同一時間只有 1 個請求能修改庫存(防止超賣)。
四、實際業務舉例:商品詳情頁緩存
需求:用戶訪問商品詳情頁時,先從 Redis 查緩存;如果沒有,再查數據庫,并把結果存到 Redis(避免頻繁查數據庫)。
實現步驟
- 用戶訪問商品詳情頁(比如商品ID是 1001);
- 程序先查 Redis 是否有
product:1001
的緩存; - 如果有,直接返回緩存數據;
- 如果沒有,查 MySQL 數據庫,拿到商品詳情;
- 把商品詳情存到 Redis(設 30 分鐘過期),再返回給用戶。
@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper; // 操作數據庫的類(假設已定義)@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public Product getProductDetail(Long productId) {String key = "product:" + productId;// 1. 先查 Redis 緩存Product product = (Product) redisTemplate.opsForValue().get(key);if (product != null) {return product; // 緩存有數據,直接返回}// 2. 緩存沒有,查數據庫product = productMapper.selectById(productId); // 3. 把數據庫結果存到 Redis(設 30 分鐘過期)if (product != null) {redisTemplate.opsForValue().set(key, product, 30, TimeUnit.MINUTES);}return product;}
}
五、總結:使用 Redis 的注意事項
- 緩存過期時間:一定要給緩存設過期時間(比如 30 分鐘),否則 Redis 內存會被占滿!
- 避免緩存擊穿:高并發時,如果某個熱點緩存突然過期(比如秒殺商品),會導致大量請求同時查數據庫。可以用“分布式鎖”(比如 Redis 的
setIfAbsent
命令)保證只有 1 個請求查數據庫,其他請求等緩存更新。 - 數據一致性:如果數據庫數據修改了,要及時刪除或更新 Redis 里的舊緩存(比如用戶修改了商品價格,要刪除
product:1001
的緩存)。 - 內存監控:用
redis-cli
命令(或可視化工具如 RedisDesktopManager)監控內存使用情況,避免內存不足。