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
