SpringBoot整合分布式锁redisson
1、导入maven坐标
-
<!-- 原生,本章使用-->
-
<dependency>
-
<groupId>org.redisson</groupId>
-
<artifactId>redisson</artifactId>
-
<version>3.13.6</version>
-
</dependency>
-
-
<!-- 另一种Spring集成starter,本章未使用 -->
-
<dependency>
-
<groupId>org.redisson</groupId>
-
<artifactId>redisson-spring-boot-starter</artifactId>
-
<version>3.13.6</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 配置类
-
*/
-
-
public class MyRedissonConfig {
-
-
-
private String host;
-
-
private int port;
-
-
private int database;
-
// @Value(value = "${spring.redis.password}")
-
// private String password;
-
-
/**
-
* 单Redis节点模式配置方法
-
* 其他配置參數,看:
-
* <a href = "https://github.com/redisson/redisson/wiki/2.-配置方法">
-
* 单Redis节点模式配置方法
-
* </a>
-
*
-
* @return {@link RedissonClient}
-
*/
-
-
RedissonClient redisson() {
-
Config config = new Config();
-
//Redis多节点
-
// config.useClusterServers()
-
// .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");
-
//Redis单节点
-
SingleServerConfig singleServerConfig = config.useSingleServer();
-
//可以用"rediss://"来启用SSL连接
-
String address = "redis://" host ":" port;
-
singleServerConfig.setAddress(address);
-
//设置 数据库编号
-
singleServerConfig.setDatabase(database);
-
// singleServerConfig.setPassword(password);
-
//连接池大小:默认值:64
-
// singleServerConfig.setConnectionPoolSize()
-
return Redisson.create(config);
-
}
-
-
}
yml中redis的配置
-
redis:
-
database: 0
-
host: ip地址
-
port: 6379
3、创建redisson的bean
-
-
private RedissonClient redisson;
4、测试,入队
-
-
void contextLoads1() {
-
RQueue<String> queue = redisson.getQueue("RedissonQueue");
-
queue.add("hello");
-
System.out.println(queue);
-
}
redis数据
5、测试,出队
-
-
void contextLoads2() {
-
RQueue<String> queue = redisson.getQueue("RedissonQueue");
-
String remove = queue.remove();
-
System.out.println(remove);
-
}
出队数据:
6、分布式锁
-
public R redisTest1() throws InterruptedException {
-
//首先从redis查询数据
-
Orders redisOrder;
-
redisOrder=(Orders) redisTemplate.opsForValue().get("redisTest");
-
//如果存在redis则返回
-
if(ObjectUtils.isNotEmpty(redisOrder)){
-
return R.ok(redisOrder);
-
//如果不存在则从数据库查询
-
}else {
-
//首先获取分布式锁
-
RLock lock = redissonClient.getLock("redisTestDogWatch");
-
//上锁
-
lock.lock();
-
-
//获取锁之后进行查询
-
try {
-
redisOrder = (Orders) redisTemplate.opsForValue().get("redisTest");
-
if (ObjectUtils.isNotEmpty(redisOrder)) {
-
return R.ok(redisOrder);
-
}
-
//数据库查询
-
redisOrder= ordersService.getById(1577177773194113014L);
-
redisTemplate.opsForValue().set("redisTest", redisOrder );
-
System.out.println("[从数据库中查询]");
-
-
} catch (Exception e) {
-
e.printStackTrace();
-
} finally {
-
//删除锁
-
lock.unlock();
-
}
-
return R.ok(redisOrder);
-
}
-
}
在这里让线程睡眠35秒
-
//上锁
-
lock.lock();
-
Thread.sleep(35000);
此时三个服务器运行
测试结果
可以首先看到已经上锁的redisTestDogWatch,每个锁30秒,如果线程未完成则会自动续30秒,如果线程完成到finally中的unlock就删除锁
目前可以看到只有一个服务器获取到锁
存储redis的数据
此时进行并发测试
依旧保持35秒的睡眠时间
此时可以看到未拿到锁的线程报错
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: d904f2b9-e75d-472d-a5a6-d0a8cc603a80 thread-id: 210
尝试解锁锁定,未被当前线程锁定 按节点 ID:C731FAC4-9BF7-4F4A-ACC1-A2CC9B78A02F 线程 ID:232
这是因为锁住了,所以无法获取锁,然后看门狗会不断刷新
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiehjg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01