【SpringBoot】SpringBoot 整合Redisson


  Redis安裝參考:【Redis】安裝及簡單使用

一、Redission整合

1、創建SpringBoot項目

  引入SpringBoot的redission啟動器:

1 <dependency>
2     <groupId>org.redisson</groupId>
3     <artifactId>redisson-spring-boot-starter</artifactId>
4     <version>3.15.5</version>
5 </dependency>

   查看jar包相關依賴

  

2、配置redission

  1) 在application.yml 中添加redission 配置文件路徑

 1 spring:
 2   redis:
 3     database: 0
 4     timeout: 3000
 5     password: 
 6     # 單節點模式
 7     host: 127.0.0.1
 8     port: 6379
 9     # redisson配置文件路徑
10     redisson:
11       file: classpath:redisson.yml

  2) 新建resources/redission.yml文件, 內容如下: 

 1 # 單節點配置
 2 singleServerConfig:
 3   # 連接空閑超時,單位:毫秒
 4   idleConnectionTimeout: 10000
 5   # 連接超時,單位:毫秒
 6   connectTimeout: 10000
 7   # 命令等待超時,單位:毫秒
 8   timeout: 3000
 9   # 命令失敗重試次數,如果嘗試達到 retryAttempts(命令失敗重試次數) 仍然不能將命令發送至某個指定的節點時,將拋出錯誤。
10   # 如果嘗試在此限制之內發送成功,則開始啟用 timeout(命令等待超時) 計時。
11   retryAttempts: 3
12   # 命令重試發送時間間隔,單位:毫秒
13   retryInterval: 1500
14   # 密碼
15   password:
16   # 單個連接最大訂閱數量
17   subscriptionsPerConnection: 5
18   # 客戶端名稱
19   clientName: myredis
20   # 節點地址
21   address: redis://127.0.0.1:6379
22   # 發布和訂閱連接的最小空閑連接數
23   subscriptionConnectionMinimumIdleSize: 1
24   # 發布和訂閱連接池大小
25   subscriptionConnectionPoolSize: 50
26   # 最小空閑連接數
27   connectionMinimumIdleSize: 32
28   # 連接池大小
29   connectionPoolSize: 64
30   # 數據庫編號
31   database: 0
32   # DNS監測時間間隔,單位:毫秒
33   dnsMonitoringInterval: 5000
34 # 線程池數量,默認值: 當前處理核數量 * 2
35 #threads: 0
36 # Netty線程池數量,默認值: 當前處理核數量 * 2
37 #nettyThreads: 0
38 # 編碼
39 codec: !<org.redisson.codec.JsonJacksonCodec> {}
40 # 傳輸模式
41 transportMode : "NIO"

3、編輯啟動類 和 配置類

  1) 主啟動類 Application.java

 1 @SpringBootApplication
 2 public class Application {
 3 
 4     /**
 5      * 測試 Redis客戶端 Redission 的使用
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         SpringApplication.run(Application.class);
10     }
11 }

  2) 測試類 TestApplication.java

 1 package com.test.redis;
 2 
 3 import org.junit.Test;
 4 import org.junit.runner.RunWith;
 5 import org.redisson.api.RLock;
 6 import org.redisson.api.RedissonClient;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.context.ApplicationContext;
10 import org.springframework.test.context.junit4.SpringRunner;
11 
12 @RunWith(SpringRunner.class)
13 @SpringBootTest
14 public class TestApplication {
15 
16     @Autowired
17     ApplicationContext context;
18 
19     // redisson客戶端
20     @Autowired
21     RedissonClient redissonClient;
22 
23     // 測試分布式鎖
24     @Test
25     public void terst1() throws InterruptedException {
26         RLock lock = redissonClient.getLock("anyLock");
27 
28         new Thread(() -> {
29             lock.lock();
30 
31             try {
32                 System.out.println(Thread.currentThread().getName() + ":\t 獲得鎖");
33                 Thread.sleep(3000);
34             } catch (InterruptedException e) {
35                 e.printStackTrace();
36             } finally {
37                 System.out.println(Thread.currentThread().getName() + ":\t 釋放鎖");
38                 lock.unlock();
39             }
40         }).start();
41 
42 
43         new Thread(() -> {
44             lock.lock();
45             try {
46                 System.out.println(Thread.currentThread().getName() + ":\t 獲得鎖");
47                 Thread.sleep(3000);
48             } catch (InterruptedException e) {
49                 e.printStackTrace();
50             } finally {
51                 System.out.println(Thread.currentThread().getName() + ":\t 釋放鎖");
52                 lock.unlock();
53             }
54         }).start();
55 
56         Thread.sleep(100000);
57     }
58 }

4、測試運行

  正常運行,且能加鎖成功

  控制台輸出:   redis數據:

  分布式鎖原理參考:【Redis】分布式鎖之Redis實現

二、Redission整合原理

1、Redission的自動配置類 RedissonAutoConfiguration

 1 @Configuration
 2 @ConditionalOnClass({Redisson.class, RedisOperations.class})
 3 
 4 // @AutoConfigureBefore表示在 RedisAutoConfiguration 之前注入
 5 @AutoConfigureBefore(RedisAutoConfiguration.class)
 6 
 7 @EnableConfigurationProperties({RedissonProperties.class, RedisProperties.class})
 8 public class RedissonAutoConfiguration {
 9     ......
10     
11     // Redisson屬性配置
12     @Autowired
13     private RedissonProperties redissonProperties;
14     // Redis屬性配置
15     @Autowired
16 
17 
18     // 注入了 redisTemplate
19     @Bean
20     @ConditionalOnMissingBean(name = "redisTemplate")
21     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
22         RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
23         template.setConnectionFactory(redisConnectionFactory);
24         return template;
25     }
26 
27     // 注入了 stringRedisTemplate
28     @Bean
29     @ConditionalOnMissingBean(StringRedisTemplate.class)
30     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
31         StringRedisTemplate template = new StringRedisTemplate();
32         template.setConnectionFactory(redisConnectionFactory);
33         return template;
34     }
35 
36     // 注入了 redissonConnectionFactory redission連接工廠
37     @Bean
38     @ConditionalOnMissingBean(RedisConnectionFactory.class)
39     public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
40         return new RedissonConnectionFactory(redisson);
41     }
42 
43     // 注入了 RedissonClient 客戶端
44     @Bean(destroyMethod = "shutdown")
45     @ConditionalOnMissingBean(RedissonClient.class)
46     public RedissonClient redisson() throws IOException {
47         Config config = null;
48         ......
49         return Redisson.create(config);
50     }
51     ......
52 }

  可以看到配置類中注入了Redission客戶端對象 RedissonClient

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM