第五章 新版SpringBoot2.x整合Redis6客戶端實戰
第1集 分散式快取Redis客戶端講解
簡介:分散式快取Redis客戶端講解
-
自帶客戶端 redis-cli
-
視覺化工具
-
語言客戶端:java、nodejs、python
-
java語言客戶端:
- jedis
Jedis 是直連模式,在多個執行緒間共享一個 Jedis 例項時是執行緒不安全的,需要使用連線池
其API提供了比較全面的Redis命令的支援,相比於其他Redis 封裝框架更加原生
Jedis中的方法呼叫是比較底層的暴露的Redis的API,Java方法基本和Redis的API保持著一致
使用阻塞的I/O,方法呼叫同步,程式流需要等到socket處理完I/O才能執行,不支援非同步操作
- lettuce
高階Redis客戶端,用於執行緒安全同步,非同步響應
基於Netty的的事件驅動,可以在多個執行緒間併發訪問, 通過非同步的方式可以更好的利用系統資源
-
第2集 新版SpringBoot2.X專案建立
簡介:新版SpringBoot2.X專案建立
-
新版SpringBoot2.X介紹
-
相關軟體環境和作用
-
JDK1.8+以上
-
Maven3.5+
-
編輯器IDEA(旗艦版)
-
PostMan
-
翻譯神器
-
-
線上建立 :https://start.spring.io/
-
注意:
-
採用springboot2.5 + jdk11
-
初次匯入專案下載包比較慢 5~20分鐘不等
- 出問題的話: mvn clean install 試試
-
不建議修改預設maven倉庫(可以先還原預設的,防止下載包失敗)
-
idea記得配置jdk11
-
-
第3集SpringBoot2.x實戰整合Redis客戶端+單元測試
簡介:SpringBoot2.x整合Redis客戶端+單元測試
-
在SpringBoot整合Redis很簡單
-
SpringData介紹
- 操作mysql/redis/elasticseatch
- SpringDataRedis是專門操作redis的依賴
-
新增依賴 spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
-
-
注意
-
Springboot2後預設使用Lettuce作為訪問redis的客戶端
-
舊版本lettuce存在堆外記憶體溢位的bug, 5.3版本修復了這個bug, 我們是用 6.1
-
很多同學沒產生原因
- 併發量不高
- 記憶體足夠大,沒發生問題就又釋出更新了
-
解決方式
- 升級版本
- 換jedis
-
第4集 SpringDataRedis的RedisTemplate講解介紹
簡介:SpringDataRedis配置RedisTemplate介紹
-
RedisTemplate介紹
- ValueOperations:簡單K-V操作
- SetOperations:set型別資料操作
- ZSetOperations:zset型別資料操作
- HashOperations:針對map型別的資料操作
- ListOperations:list型別的資料操作
-
RedisTemplate和StringRedisTemplate的區別
-
StringRedisTemplate繼承RedisTemplate
-
兩者的資料是不共通的(預設的序列化機制導致key不一樣)
-
StringRedisTemplate預設採用的是String的序列化策略
-
RedisTemplate預設採用的是JDK的序列化策略,會將資料先序列化成位元組陣列然後在存入Redis資料庫
-
總結
- 當redis資料庫裡面本來操作的是字串資料的時候,那使用StringRedisTemplate即可
- 資料是複雜的物件型別,那麼使用RedisTemplate是更好的選擇
-
-
操作
-
String結構
- 儲存字串
- 儲存物件
-
第5集 RedisTemplate的序列和反序列化機制講解
簡介:RedisTemplate的序列和反序列化機制講解
-
上集問題
- 同個key為啥獲取不到值,核心就是序列化機制導致key不一樣
-
什麼是序列化
-
把物件轉換為位元組序列的過程稱為物件的序列化。
-
把位元組序列恢復為物件的過程稱為物件的反序列化。
-
物件的序列化主要有兩種用途
- 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中
- 在網路上傳送物件的位元組序列。
-
-
Redis為什麼要序列化
-
效能可以提高,不同的序列化方式效能不一樣
-
視覺化工具更好檢視
- 採用預設的jdk方式會亂碼(POJO類需要實現Serializable介面)
- 採用JSON方式則不用,且視覺化工具更好檢視
-
-
自定義redis序列化方式,提供了多種可選擇策略
-
JdkSerializationRedisSerializer
- POJO物件的存取場景,使用JDK本身序列化機制
- 預設機制 ObjectInputStream/ObjectOutputStream進行序列化操作
-
StringRedisSerializer
- Key或者value為字串
-
Jackson2JsonRedisSerializer
- 利用jackson-json工具,將pojo例項序列化成json格式儲存
-
GenericFastJsonRedisSerializer
- 另一種javabean與json之間的轉換,同時也需要指定Class型別
-
...
-
第6集 RedisTemplate 序列化機制配置實戰
簡介:自定義序列化和反序列化機制配置實戰
- 配置實戰
@Configuration
public class RedisTemplateConfiguration {
/**
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替換預設序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 設定key和value的序列化規則
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 設定hashKey和hashValue的序列化規則
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
// 設定支援事物
//redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
第7集 SpringBoot整合Jedis+Lettuce客戶端連線池配置實戰
簡介:SpringBoot整合Jedis+Lettuce客戶端連線池配置實戰
-
基於SpringDataRedis可以快速替換底層實現
- Lettuce連線池介紹(新增連線池)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-active = 10
# 連線池中的最大空閒連線
spring.redis.lettuce.pool.max-idle = 10
# 連線池中的最小空閒連線
spring.redis.lettuce.pool.min-idle = 0
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-wait= -1ms
#指定客戶端
spring.redis.client-type = lettuce
- Jedis連線池介紹(可以不排除lettuce依賴包)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--不用指定版本號,本身spring-data-redis裡面有-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.1</version>
</dependency>
# 連線池最大連線數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active = 10
# 連線池中的最大空閒連線
spring.redis.jedis.pool.max-idle = 10
# 連線池中的最小空閒連線
spring.redis.jedis.pool.min-idle = 0
# 連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait= -1ms
#指定客戶端
spring.redis.client-type = jedis
-
斷點除錯 redisTemplate的connectionFactory實現