日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot整合Redis要注意的那些

發布時間:2023/12/3 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot整合Redis要注意的那些 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

昨天自己在重新學習SpringBoot整合Redis時,遇到了一個問題java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig,錯誤很明顯找不到需要的類。下面主要記錄一下錯誤是怎么出線的,并且如何解決。

錯誤回顧

在SpringBoot 2.0+后,默認的redis client是lettuce而不是一直使用的jedis。此次出現的錯誤也是因為使用了lettuce出現的。
使用時的配置如下所示:

spring:redis:host: localhostport: 6379password:# 連接超時時間timeout: 10s# springboot默認使用lettucelettuce:pool:# 連接池中的最小空閑連接min-idle: 0# 連接池中的最大空閑連接max-idle: 8# 連接池的最大數據庫連接數max-active: 8# #連接池最大阻塞等待時間(使用負值表示沒有限制)max-wait: -1ms

pom使用最小的依賴進行測試驗證。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency>

測試代碼,期望結果是控制臺顯示 123456,表明redis可以正常使用。

@SpringBootTest public class RedisServiceTest {@Autowiredprivate RedisTemplate<Object, Object> redisTemplate;@Testpublic void testRedis() {redisTemplate.opsForValue().set("test", "123456");String abec = (String) redisTemplate.opsForValue().get("test");System.out.println(abec);} }

測試驗證結果:

問題原因

跟蹤一下源碼發現就能輕松的發現問題:
既然使用的事lettuce client,程序中會通過yml配置匹配到LettuceConnectionConfiguration來創建連接池,所以看此類的源碼就能得到答案。

/*** 創建lettuce工廠方法,該方法執行完我們會得到一個RedisConnectionFactory的實現類。 但是目前問題可以清楚的知道,該方法未執行完就出現了報錯,所以我們看下面的代碼。*/ @Bean @ConditionalOnMissingBean(RedisConnectionFactory.class) LettuceConnectionFactory redisConnectionFactory(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources) {LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources,getProperties().getLettuce().getPool());return createLettuceConnectionFactory(clientConfig); }/*** 生成lettuce客戶端配置*/ private LettuceClientConfiguration getLettuceClientConfiguration(ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,ClientResources clientResources, Pool pool) {LettuceClientConfigurationBuilder builder = createBuilder(pool);applyProperties(builder);if (StringUtils.hasText(getProperties().getUrl())) {customizeConfigurationFromUrl(builder);}builder.clientOptions(createClientOptions());builder.clientResources(clientResources);builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));return builder.build(); }/*** lettuce客戶端配置構造器*/ private LettuceClientConfigurationBuilder createBuilder(Pool pool) { // pool就是我們在yml配置文件中的lettuce.pool配置// 不為空執行的下面的方法if (pool == null) {return LettuceClientConfiguration.builder();}return new PoolBuilderFactory().createBuilder(pool); }

最后執行的方法截圖能明顯發現錯誤

😂最后發現就是很簡單的問題,很單純的沒有引入commons-pool2的jar包。問題原因就是自己不按照人要求做事,還逼逼賴賴~~ (無能的人兒啊)

解決方法

📢那就如她所愿,增加上新的pom依賴

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId> </dependency>

🤣賓狗-------驗證通過

當然還有一種方法,就是yml配置文件中不要配置lettuce.pool配置項,這樣初始化就執行默認的連接池了。🤔但是好像不配置的話又不符合企業級應用要求,所以還是當一個聽話的好孩子吧,這樣在之后出錯的話就會有人站出來為你說一句: “他還是個孩子啊!!~”

🔚

這次記錄就到這里啦~ 獻給努力的我們。

總結

以上是生活随笔為你收集整理的SpringBoot整合Redis要注意的那些的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。