SpringBoot整合分布式鎖redisson的示例代碼
1、導(dǎo)入maven坐標(biāo)
<!-- 用redisson作為所有分布式鎖,分布式對(duì)象等功能框架-->
<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é)點(diǎn)模式配置方法
* 其他配置參數(shù),看:
* <a >
* 單Redis節(jié)點(diǎn)模式配置方法
* </a>
*
* @return {@link RedissonClient}
*/
@Bean(destroyMethod = "shutdown")
RedissonClient redisson() {
Config config = new Config();
//Redis多節(jié)點(diǎn)
// config.useClusterServers()
// .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");
//Redis單節(jié)點(diǎn)
SingleServerConfig singleServerConfig = config.useSingleServer();
//可以用"rediss://"來啟用SSL連接
String address = "redis://" + host + ":" + port;
singleServerConfig.setAddress(address);
//設(shè)置 數(shù)據(jù)庫(kù)編號(hào)
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、測(cè)試,入隊(duì)
@Test
void contextLoads1() {
RQueue<String> queue = redisson.getQueue("RedissonQueue");
queue.add("hello");
System.out.println(queue);
}redis數(shù)據(jù)

5、測(cè)試,出隊(duì)
@Test
void contextLoads2() {
RQueue<String> queue = redisson.getQueue("RedissonQueue");
String remove = queue.remove();
System.out.println(remove);
}出隊(duì)數(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ù)庫(kù)查詢
}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ù)庫(kù)查詢
redisOrder= ordersService.getById(1577177773194113014L);
redisTemplate.opsForValue().set("redisTest", redisOrder );
System.out.println("[從數(shù)據(jù)庫(kù)中查詢]");
} catch (Exception e) {
e.printStackTrace();
} finally {
//刪除鎖
lock.unlock();
}
return R.ok(redisOrder);
}
}
在這里讓線程睡眠35秒
//上鎖 lock.lock(); Thread.sleep(35000);
此時(shí)三個(gè)服務(wù)器運(yùn)行

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

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

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

此時(shí)進(jìn)行并發(fā)測(cè)試

依舊保持35秒的睡眠時(shí)間
此時(shí)可以看到未拿到鎖的線程報(bào)錯(cuò)
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é)點(diǎn) ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 線程 ID:232
這是因?yàn)殒i住了,所以無法獲取鎖,然后看門狗會(huì)不斷刷新

到此這篇關(guān)于SpringBoot整合分布式鎖redisson的文章就介紹到這了,更多相關(guān)SpringBoot整合分布式鎖redisson內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的示例代碼
- Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例
- 基于Redis分布式鎖Redisson及SpringBoot集成Redisson
- SpringBoot整合Redisson實(shí)現(xiàn)分布式鎖
- Springboot中如何使用Redisson實(shí)現(xiàn)分布式鎖淺析
- SpringBoot使用Redisson實(shí)現(xiàn)分布式鎖(秒殺系統(tǒng))
- SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例
- Spring Task實(shí)現(xiàn)定時(shí)任務(wù)的示例
相關(guān)文章
logback?OutputStreamAppender高效日志輸出源碼解析
這篇文章主要介紹了為大家logback?OutputStreamAppender日志輸出效率提升示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Spring Cloud基于zuul實(shí)現(xiàn)網(wǎng)關(guān)過程解析
這篇文章主要介紹了Spring Cloud基于zuul實(shí)現(xiàn)網(wǎng)關(guān)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題
這篇文章主要介紹了Spring Boot2解決idea console 控制臺(tái)輸出亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21解決辦法
這篇文章主要給大家介紹了關(guān)于idea創(chuàng)建spring?boot項(xiàng)目時(shí)javaversion只能選擇17和21的解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01

