文章目錄
前言
- 參考文檔:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
說明
- 這個玩意是基於Redis的一個分佈式鎖,還有很多功能,需要參考文檔去
springboot-整合
https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter#spring-boot-starter
配置 yml
- 先配置這個,配置的時候需要注意
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.1</version>
</dependency>
- 需要注意的目前3.13.1所以依賴的 是redisson-spring-data-22,參考:https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter
- 說明如果是redisson-spring-data-22 的話對應的springboot版本就是2.2.x 的版本~~
- 也就說要麼降級springboot的版本,要麼升級springboot的版本
- 要麼排除~~~ 我採用的是排除
<!-- redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.1</version>
<exclusions>
<exclusion>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-22</artifactId>
</exclusion>
</exclusions>
</dependency>
- 重新依賴 redisson-spring-data-21 即可
<dependency>
<groupId>org.redisson</groupId>
<!-- for Spring Data Redis v.2.1.x -->
<artifactId>redisson-spring-data-21</artifactId>
<version>3.13.1</version>
</dependency>
完整的依賴
- 需要說明的是這裏的完整依賴指的是 redisson的依賴,就是爲了我這種菜雞不知道如何搞…
<!-- redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.1</version>
<exclusions>
<exclusion>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-data-22</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<!-- for Spring Data Redis v.2.1.x -->
<artifactId>redisson-spring-data-21</artifactId>
<version>3.13.1</version>
</dependency>
<!-- redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
參考官網配置
spring:
redis:
redisson:
# 配置單點模式
config: classpath:redisson.yml
jedis:
pool:
max-active: 8 #最大連接數
max-wait: -1 #最大阻塞等待時間(負數表示沒限制)
max-idle: 8 #最大空閒
配置 redisson
- 需要注意的是某些版本的某些屬性可能已經失效了~~~
# 單節點配置
singleServerConfig:
# 連接空閒超時,單位:毫秒
idleConnectionTimeout: 10000
# 連接超時,單位:毫秒
connectTimeout: 10000
# 命令等待超時,單位:毫秒
timeout: 3000
# 命令失敗重試次數,如果嘗試達到 retryAttempts(命令失敗重試次數) 仍然不能將命令發送至某個指定的節點時,將拋出錯誤。
# 如果嘗試在此限制之內發送成功,則開始啓用 timeout(命令等待超時) 計時。
retryAttempts: 3
# 命令重試發送時間間隔,單位:毫秒
retryInterval: 1500
# # 重新連接時間間隔,單位:毫秒
# reconnectionTimeout: 3000
# # 執行失敗最大次數
# failedAttempts: 3
# 密碼
password: myliwenbo
# 單個連接最大訂閱數量
subscriptionsPerConnection: 5
# 客戶端名稱
clientName: null
# # 節點地址
address: redis://47.98.172.30:60112
# 發佈和訂閱連接的最小空閒連接數
subscriptionConnectionMinimumIdleSize: 1
# 發佈和訂閱連接池大小
subscriptionConnectionPoolSize: 50
# 最小空閒連接數
connectionMinimumIdleSize: 32
# 連接池大小
connectionPoolSize: 64
# 數據庫編號
database: 0
# DNS監測時間間隔,單位:毫秒
dnsMonitoringInterval: 5000
# 線程池數量,默認值: 當前處理核數量 * 2
threads: 0
# Netty線程池數量,默認值: 當前處理核數量 * 2
nettyThreads: 0
# 編碼
codec: !<org.redisson.codec.JsonJacksonCodec> {}
# 傳輸模式
transportMode : "NIO"
簡單的源碼分析
- 當我們導入了
redisson-spring-boot-starter
後 - 其實就是多了幾個類,沒錯,就三個類
RedissonProperties
- 這個就是一個配置文件類,做一個映射~~,我們配置的config就是配置到這裏了
RedissonAutoConfiguration
- 就是這個類進行配置注入了,並且會幫我們生成2個StringRedisTemplate
- 如果我們默認生成了的話就不會生成了.
簡單的測試
- 我們來測試是否生效,可以看到當第一個線程暫停5秒的時候第二個線程如果進來了會等第一個線程執行完才執行第二個線程的執行
@RestController
@RequestMapping("redisson")
public class RedissonController
{
@Autowired
private RedissonClient redissonClient;
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final String product = "MoonCake";
@RequestMapping("lockAdd")
public void lockAdd() throws Exception
{
//對數據進行加鎖
RLock lock = redissonClient.getLock(product);
//加鎖
lock.lock();
System.out.println(Thread.currentThread().getName());
String stocks = stringRedisTemplate.opsForValue().get("stock");
int stock = Integer.parseInt(stocks);
if (stock > 0) {
//下單
stock -= 1;
stringRedisTemplate.opsForValue().set("stock", String.valueOf(stock));
System.out.println("扣減成功,庫存stock:" + stock);
Thread.sleep(5000);
} else {
//沒庫存
System.out.println("扣減失敗,庫存不足");
}
//解鎖
lock.unlock();
}
}
後言
- 配置這個東西,怎麼配置都行,官方還支持編碼配置,多參考官方文檔,最主要的是鬧明白這個玩意的原理,所以千萬別鑽牛角尖~
- 我就是做個簡單的測試,所以就用的最簡單的方法,也沒有去深究