SpringBoot整合分布式鎖redisson的示例代碼
1、導(dǎo)入maven坐標(biāo)
<!-- 用redisson作為所有分布式鎖,分布式對象等功能框架-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.5</version>
</dependency>2、redisson配置類(如果redis沒有密碼就不需要private String password)
package com.xuechengpluscommon.config;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @description Redisson 配置類
*/
@Configuration
public class MyRedissonConfig {
@Value(value = "${spring.redis.host}")
private String host;
@Value(value = "${spring.redis.port}")
private int port;
@Value(value = "${spring.redis.database}")
private int database;
// @Value(value = "${spring.redis.password}")
// private String password;
/**
* 單Redis節(jié)點模式配置方法
* 其他配置參數(shù),看:
* <a >
* 單Redis節(jié)點模式配置方法
* </a>
*
* @return {@link RedissonClient}
*/
@Bean(destroyMethod = "shutdown")
RedissonClient redisson() {
Config config = new Config();
//Redis多節(jié)點
// config.useClusterServers()
// .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");
//Redis單節(jié)點
SingleServerConfig singleServerConfig = config.useSingleServer();
//可以用"rediss://"來啟用SSL連接
String address = "redis://" + host + ":" + port;
singleServerConfig.setAddress(address);
//設(shè)置 數(shù)據(jù)庫編號
singleServerConfig.setDatabase(database);
// singleServerConfig.setPassword(password);
//連接池大小:默認(rèn)值:64
// singleServerConfig.setConnectionPoolSize()
return Redisson.create(config);
}
}
yml中redis的配置
redis:
database: 0
host: ip地址
port: 63793、創(chuàng)建redisson的bean
@Autowired private RedissonClient redisson;
4、測試,入隊
@Test
void contextLoads1() {
RQueue<String> queue = redisson.getQueue("RedissonQueue");
queue.add("hello");
System.out.println(queue);
}redis數(shù)據(jù)

5、測試,出隊
@Test
void contextLoads2() {
RQueue<String> queue = redisson.getQueue("RedissonQueue");
String remove = queue.remove();
System.out.println(remove);
}出隊數(shù)據(jù):

6、分布式鎖
public R redisTest1() throws InterruptedException {
//首先從redis查詢數(shù)據(jù)
Orders redisOrder;
redisOrder=(Orders) redisTemplate.opsForValue().get("redisTest");
//如果存在redis則返回
if(ObjectUtils.isNotEmpty(redisOrder)){
return R.ok(redisOrder);
//如果不存在則從數(shù)據(jù)庫查詢
}else {
//首先獲取分布式鎖
RLock lock = redissonClient.getLock("redisTestDogWatch");
//上鎖
lock.lock();
//獲取鎖之后進(jìn)行查詢
try {
redisOrder = (Orders) redisTemplate.opsForValue().get("redisTest");
if (ObjectUtils.isNotEmpty(redisOrder)) {
return R.ok(redisOrder);
}
//數(shù)據(jù)庫查詢
redisOrder= ordersService.getById(1577177773194113014L);
redisTemplate.opsForValue().set("redisTest", redisOrder );
System.out.println("[從數(shù)據(jù)庫中查詢]");
} catch (Exception e) {
e.printStackTrace();
} finally {
//刪除鎖
lock.unlock();
}
return R.ok(redisOrder);
}
}
在這里讓線程睡眠35秒
//上鎖 lock.lock(); Thread.sleep(35000);
此時三個服務(wù)器運行

測試結(jié)果
可以首先看到已經(jīng)上鎖的redisTestDogWatch,每個鎖30秒,如果線程未完成則會自動續(xù)30秒,如果線程完成到finally中的unlock就刪除鎖

目前可以看到只有一個服務(wù)器獲取到鎖

存儲redis的數(shù)據(jù)

此時進(jìn)行并發(fā)測試

依舊保持35秒的睡眠時間
此時可以看到未拿到鎖的線程報錯
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: d904f2b9-e75d-472d-a5a6-d0a8cc603a80 thread-id: 210
嘗試解鎖鎖定,未被當(dāng)前線程鎖定 按節(jié)點 ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 線程 ID:232
這是因為鎖住了,所以無法獲取鎖,然后看門狗會不斷刷新

到此這篇關(guān)于SpringBoot整合分布式鎖redisson的文章就介紹到這了,更多相關(guān)SpringBoot整合分布式鎖redisson內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題
今天小編就為大家分享一篇關(guān)于SpringBoot集成shiro,MyRealm中無法@Autowired注入Service的問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Java基于UDP協(xié)議實現(xiàn)簡單的聊天室程序
這篇文章主要為大家詳細(xì)介紹了Java基于UDP協(xié)議實現(xiàn)簡單的聊天室程序的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07
Elasticsearch QueryBuilder簡單查詢實現(xiàn)解析
這篇文章主要介紹了Elasticsearch QueryBuilder簡單查詢實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
手把手教你如何利用SpringBoot實現(xiàn)審核功能
審核功能經(jīng)過幾個小時的奮戰(zhàn)終于完成了,現(xiàn)在我就與廣大網(wǎng)友分享我的成果,這篇文章主要給大家介紹了關(guān)于如何利用SpringBoot實現(xiàn)審核功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

