Spring Boot3 Redis 項目地址
https://gitee.com/supervol/loong-springboot-study
(記得給個start,感謝)
Redis 介紹
????????Redis 是一款高性能的?內存數據庫(支持持久化),兼具緩存、NoSQL 存儲、分布式鎖等核心能力;Spring Boot 3 作為主流的 Java 開發框架,通過?spring-boot-starter-data-redis
?starter 簡化了 Redis 的整合流程,降低了開發門檻。
Redis 核心
????????開源內存數據庫,支持?String、Hash、List、Set、ZSet?等數據結構,主打高性能(QPS 達 10W+)、低延遲,常用于緩存、分布式鎖、會話存儲等場景。Spring Boot 3 為 Redis 提供了兩個核心操作類:RedisTemplate
?和?StringRedisTemplate
,兩者定位不同,需根據場景選擇。
1. StringRedisTemplate
- 定位:專門處理?String 類型?的 Redis 操作(鍵和值均為 String)。
- 默認配置:使用?
StringRedisSerializer
?序列化鍵和值,序列化后的數據在 Redis 中?可讀性強(無亂碼)。 - 適用場景:存儲簡單字符串(如驗證碼、會話 ID、計數器等)。
2. RedisTemplate
- 定位:通用 Redis 操作類,支持?任意類型?的鍵和值(通過泛型?
RedisTemplate<K, V>
?約束)。 - 默認配置問題:默認使用?
JdkSerializationRedisSerializer
?序列化,會導致 Redis 中存儲的是?二進制數據(可讀性差,且需實體類實現?Serializable
?接口),不推薦直接使用默認配置。 - 優化方案:自定義?
RedisTemplate
,使用?Jackson2JsonRedisSerializer
?序列化(支持 JSON 格式,可讀性強,無需實現?Serializable
)。
Redis 示例
1. 前置條件
- JDK 17+(推薦 JDK 17 或 21)
- 構建工具:Maven 3.6+
- 開發工具:IntelliJ IDEA
- Redis 環境:?Redis 6.x+? ? ? ?
2. 代碼位置
????????請參考項目地址中 springboot-cache/springboot-redis 模塊代碼。
Redis 高級
????????Spring Boot 3 不僅支持 Redis 基礎操作,還能便捷整合其高級特性(如緩存抽象、分布式鎖、發布訂閱)。基于 Redis 的緩存抽象,Spring 提供了?緩存注解(如?@Cacheable
),結合 Redis 可快速實現緩存功能,無需手動調用?RedisTemplate
。
步驟 1:啟用緩存
????????在啟動類上添加?@EnableCaching
?注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching // 啟用 Spring 緩存抽象
public class RedisDemoApplication {public static void main(String[] args) {SpringApplication.run(RedisDemoApplication.class, args);}
}
步驟 2:使用緩存注解
????????常用注解說明及示例:
注解 | 作用 |
---|---|
@Cacheable | 方法執行前先查緩存,有則返回緩存值;無則執行方法,將結果存入緩存。 |
@CachePut | 執行方法后,將結果存入緩存(覆蓋舊值,常用于更新操作)。 |
@CacheEvict | 刪除緩存(常用于刪除操作,支持批量刪除)。 |
@Caching | 組合多個緩存操作(如同時?@Cacheable ?和?@CacheEvict )。 |
示例代碼:
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class UserService {/*** 查詢用戶:優先查緩存(key 為 "user:userId"),無則查數據庫并緩存(1 小時過期)*/@Cacheable(value = "user", // 緩存名稱(對應 Redis 中的 key 前綴:user::xxx)key = "#userId", // 緩存 key 的后綴(SpEL 表達式,#userId 為方法參數)unless = "#result == null", // 結果為 null 時不緩存timeout = 3600 // 緩存過期時間(秒))public User getUserById(Long userId) {// 模擬數據庫查詢(實際項目中替換為 MyBatis/JPA 調用)System.out.println("查詢數據庫:userId = " + userId);return new User(userId, "張三", 25, "zhangsan@xxx.com");}/*** 更新用戶:執行方法后更新緩存(覆蓋舊值)*/@CachePut(value = "user",key = "#user.id", // 用用戶 ID 作為 keyunless = "#user == null")public User updateUser(User user) {// 模擬數據庫更新System.out.println("更新數據庫:user = " + user);return user;}/*** 刪除用戶:執行方法后刪除緩存*/@CacheEvict(value = "user",key = "#userId")public void deleteUser(Long userId) {// 模擬數據庫刪除System.out.println("刪除數據庫:userId = " + userId);}
}
Redis 指南
1. 序列化方式選擇
序列化器 | 優點 | 缺點 | 推薦度 |
---|---|---|---|
Jackson2JsonRedisSerializer | 可讀性強、支持復雜對象、無需實現 Serializable | 需配置類型信息(避免反序列化丟失類型) | ★★★★★ |
StringRedisSerializer | 可讀性強、輕量 | 僅支持 String 類型 | ★★★★☆ |
JdkSerializationRedisSerializer | 無需額外配置、支持所有實現 Serializable 的類 | 可讀性差(二進制)、需實現 Serializable | ★★☆☆☆ |
????????結論:優先使用?Jackson2JsonRedisSerializer
(自定義?RedisTemplate
)。
2. 連接池配置優化
- max-active:根據并發量調整(如 16-64,避免過大導致 Redis 壓力)。
- max-idle:建議與?
max-active
?一致(避免頻繁創建連接)。 - max-wait:設置為 1-3 秒(避免無限等待,快速失敗)。
- timeout:設置為 1-3 秒(避免網絡波動導致的長時間阻塞)。
3. 緩存問題解決方案
問題 | 原因 | 解決方案 |
---|---|---|
緩存穿透 | 請求不存在的 key,穿透緩存直擊數據庫 | 1. 緩存空值(短期過期);2. 使用布隆過濾器 |
緩存擊穿 | 熱點 key 過期,大量請求直擊數據庫 | 1. 互斥鎖(如 Redisson 鎖);2. 熱點 key 永不過期 |
緩存雪崩 | 大量 key 同時過期,數據庫壓力驟增 | 1. 過期時間加隨機值(分散過期);2. 集群部署 Redis |
4. 數據一致性保障
????????緩存與數據庫同步的核心原則:先更新數據庫,后操作緩存(避免臟數據)。
- 更新操作:更新數據庫 → 刪除緩存(推薦,避免更新緩存失敗導致臟數據)。
- 刪除操作:刪除數據庫 → 刪除緩存。
總結? ? ? ??
????????Spring Boot 3 整合 Redis 簡化了開發流程,通過?RedisTemplate
/StringRedisTemplate
?可快速操作 Redis 基礎數據結構,結合 Spring 緩存抽象、Redisson 分布式鎖等高級特性,能滿足企業級應用的核心需求。實際開發中需注意序列化配置、連接池優化、緩存一致性等問題,確保系統高性能、高可用。Redis 的場景覆蓋?緩存、分布式協調、計數、消息、排序?等多個領域,核心是利用其?高性能、多結構、原子性?的特性解決傳統數據庫或單體應用的痛點。實際使用時需根據業務需求選擇合適的數據結構和命令,同時注意內存管理、持久化策略和高可用部署(如主從、集群)。