1 Redis介紹
1.1 Redis作為緩存
由于Redis的存取效率非常高,在開發實踐中,通常會將一些數據從關系型數據庫(例如MySQL)中讀取出來,并寫入到Redis中,后續當需要訪問相關數據時,將優先從Redis中讀取所需的數據,以此,可以提高數據的讀取效率,并且對一定程度的保護關系型數據庫。
一旦使用Redis后,相關的數據就會同時存在于關系型數據和Redis中,即同一個數據有2份或更多(如果你使用了更多的Redis服務或其它數據處理技術),則可能出現數據不同步的問題!
1.2 數據一致性問題
如果最終出現了關系型數據庫和Redis中的數據不同的問題,則稱之為“數據一致性問題
”
-
更新數據庫成功 -> 更新緩存失敗 -> 數據不一致
-
更新緩存成功 -> 更新數據庫失敗 -> 數據不一致
1.3 redis緩存使用場景
-
高頻率訪問的數據
- 例如熱門榜單
-
修改頻率非常低的數
- 例如商品的類別
-
對于數據的“準確性”要求不高的
- 例如商品的庫存余量(因為不管余量為多少,只有真正付款的時候才會去判斷是否買到)
1.4 redis使用緩存的時機
關于在項目中應用Redis,首先考慮何時將MySQL中的數據讀取出來并寫入到Redis中!常見的策略有:
1 直接嘗試從Redis中讀取數據,如果Redis中無此數據,則從MySQL中讀取并寫入到Redis
從運行機制上,類似于單例模式中的懶漢式
2 當項目啟動時,就直接從MySQL中讀取數據并寫入到Redis
從運行機制上,類似于單例模式中的餓漢式
這種做法通常稱之為“緩存預熱”當使用緩存預熱的處理機制時,需要使得某段代碼是項目啟動時就自動執行的,可以自定義組件類實現AppliacationRunner接口,重寫其中的run( )方法,此方法將在項目啟動完成之后自動調用。
2 SpringBoot集成Redis
2.1 安裝redis
地址Releases · microsoftarchive/redis · GitHub
2.2 在springboot中引入依賴
<!--集成redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.7.18</version>
</dependency>
2.3 添加redis配置信息
# spring配置
spring:redis:database: 0 # redis數據庫索引(默認為0)host: localhostport: 6379timeout: 5000 # mspassword: 123456
2.4 編寫redis配置類、工具類
/*** redis配置*/
@Configuration
@AutoConfigureBefore(RedissonAutoConfiguration.class)
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {// 創建 RedisTemplate 對象RedisTemplate<String, Object> template = new RedisTemplate<>();// 設置 RedisConnection 工廠。?? 它就是實現多種 Java Redis 客戶端接入的秘密工廠。感興趣的胖友,可以自己去擼下。template.setConnectionFactory(factory);// 使用 String 序列化方式,序列化 KEY 。template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 使用 JSON 序列化方式(庫是 Jackson ),序列化 VALUE 。template.setValueSerializer(RedisSerializerUtils.getSerializer());template.setHashValueSerializer(RedisSerializerUtils.getSerializer());return template;}}
public class RedisSerializerUtils {privat