基于Redisson实现分布式锁
前言
最近开发了几个微服务上线了,发现定时任务执行了很多次,查看rancher发现这几个微服务都是多实例的,也就是说定时任务执行了多次,恰好所用框架中使用的是Redisson, 正好记录下使用Redission实现分布式锁
正文
配置
添加Redisson依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.6.5</version>
</dependency>
添加配置类
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfiguration {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.port:6379}")
private String port;
@Value("${spring.redis.clientName:${eureka.instance.instanceId}}")
private String clientName;
@Value("${spring.redis.idleConnectionTimeout:10000}")
private int idleConnectionTimeout;
@Value("${spring.redis.pingTimeout:1000}")
private int pingTimeout;
@Value("${spring.redis.connectTimeout:10000}")
private int connectTimeout;
@Value("${spring.redis.timeout:3000}")
private int timeout;
@Value("${spring.redis.retryAttempts:3}")
private int retryAttempts;
@Value("${spring.redis.retryInterval:1500}")
private int retryInterval;
@Value("${spring.redis.subscriptionsPerConnection:5}")
private int subscriptionsPerConnection;
@Value("${spring.redis.subscriptionConnectionMinimumIdleSize:1}")
private int subscriptionConnectionMinimumIdleSize;
@Value("${spring.redis.subscriptionConnectionPoolSize:10}")
private int subscriptionConnectionPoolSize;
@Value("${spring.redis.connectionMinimumIdleSize:32}")
private int connectionMinimumIdleSize;
@Value("${spring.redis.connectionPoolSize:64}")
private int connectionPoolSize;
@Value("${spring.redis.database:1}")
private int database;
@Value("${spring.redis.dnsMonitoring:false}")
private boolean dnsMonitoring;
@Value("${spring.redis.dnsMonitoringInterval:5000}")
private int dnsMonitoringInterval;
@Bean
public RedissonClient redisson() {
Config config = new Config();
config.useSingleServer()
.setAddress(String.format("redis://%s:%s", host,port))
.setClientName(clientName)
.setPassword(password)
.setIdleConnectionTimeout(idleConnectionTimeout)
.setPingTimeout(pingTimeout)
.setConnectTimeout(connectTimeout)
.setTimeout(timeout)
.setRetryAttempts(retryAttempts)
.setRetryInterval(retryInterval)
.setSubscriptionsPerConnection(subscriptionsPerConnection)
.setSubscriptionConnectionMinimumIdleSize(subscriptionConnectionMinimumIdleSize)
.setSubscriptionConnectionPoolSize(subscriptionConnectionPoolSize)
.setConnectionMinimumIdleSize(connectionMinimumIdleSize)
.setConnectionPoolSize(connectionPoolSize)
.setDatabase(database)
.setDnsMonitoring(dnsMonitoring)
.setDnsMonitoringInterval(dnsMonitoringInterval);
return Redisson.create(config);
}
}
使用
@Inject
RedissonClient redisson;
RLock lock;
public void method() {
try {
// key替换为锁key, 不要与其他锁key冲突
lock = redisson.getLock("key");
// 参数1为等待时间,超时return
// 参数2为锁的过期时间
// 参数3为时间单位
// 本例中,得不到锁立即失败,50秒后自动解锁
if (!lock.tryLock(0, 50, TimeUnit.SECONDS)) {
return;
}
// 业务逻辑
lock.forceUnlock();
} catch (InterruptedException e) {
// 重置线程打断状态
Thread.currentThread().interrupt();
}
}
配置文件就不上了
基于Redisson实现分布式锁的更多相关文章
- 基于Redisson实现分布式锁源码解读
文章目录 一.分布式锁的概念 和 使用场景 二.将redis官网对于分布式锁(红锁)的定义和Redisson实现做概括性总结 三.基于Redisson的分布式实现方案 四.加锁过程分析 五.锁重入过程 ...
- 【连载】redis库存操作,分布式锁的四种实现方式[二]--基于Redisson实现分布式锁
一.redisson介绍 redisson实现了分布式和可扩展的java数据结构,支持的数据结构有:List, Set, Map, Queue, SortedSet, ConcureentMap, L ...
- 基于redis的分布式锁实现方案--redisson
实例代码地址,请前往:https://gitee.com/GuoqingLee/distributed-seckill redis官方文档地址,请前往:http://www.redis.cn/topi ...
- 基于 Redis 做分布式锁
基于 REDIS 的 SETNX().EXPIRE() 方法做分布式锁 setnx() setnx 的含义就是 SET if Not Exists,其主要有两个参数 setnx(key, value) ...
- Redisson实现分布式锁
转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...
- 基于 Redis 的分布式锁
前言 分布式锁在分布式应用中应用广泛,想要搞懂一个新事物首先得了解它的由来,这样才能更加的理解甚至可以举一反三. 首先谈到分布式锁自然也就联想到分布式应用. 在我们将应用拆分为分布式应用之前的单机系统 ...
- 基于redis的分布式锁(转)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- 基于redis的分布式锁(不适合用于生产环境)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- redis系列:基于redis的分布式锁
一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...
随机推荐
- [转帖]Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有
Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有 之前用 千兆的机器 下载速度 一般只能到 50MB 左右 没法更高 万兆的话 可能也就是 200MB左右的速度 很难更高 不知道后续的服 ...
- parent()、parents()和parentsUntil()的区别
1.parent() 返回被选元素的直接父元素,该方法只会向上一级对 DOM 树进行遍历: 2.parents() 返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>) ...
- width() 、 height() 方法;innerWidth() 、innerHeight() 方法;outerWidth() 、 outerHeight() 方法的区别
1.width() . height() 方法 设置或返回元素的宽度.高度(不包括内边距.边框或外边距): 2.innerWidth() .innerHeight() 方法 返回元素的宽度.高度(包括 ...
- awk、sed、grep三大shell文本处理工具之awk的应用
awk 1.是什么 是一个编程语言.支持变量.数组.函数.流程控制(if...else/for/while) 单行程序语言. 2.工作流程 读取file.标准输入.管道给的数据,从第一行开始读取,逐行 ...
- Launch4j Java 转可执行程序工具
launch4j 可以用来将Java应用程序转成Windows本地可执行文件 (.exe).提供了本地弹出屏幕,应用程序图标,JRE搜索或使用绑定的JRE,启动失败反馈,传递命令行参数,ANT编译脚本 ...
- BZOJ2199[Usaco2011 Jan]奶牛议会——2-SAT+tarjan缩点
题目描述 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M ...
- POJ2492-A Bug's Life-并查集扩展应用
维护一个relation数组,保留着此元素和根元素之间的性别关系.之后就可以判断gay了. #include <cstdio> #include <algorithm> #in ...
- 自学Linux Shell1.1-Linux初识
点击返回 自学Linux命令行与Shell脚本之路 1.1-Linux初识(架构.内核.shell) 1. Linux架构 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.(有 ...
- Android recording 录音功能 简单使用小实例
package com.app.recordingtest; import java.io.File; import java.io.IOException; import android.app.A ...
- [luogu3258][JLOI2014]松鼠的新家
题解 我们就在\([a_i,a_{i+1}]\)的路径上都\(+1\),然后单点查询就可以了. ac代码(吸了氧才过的QwQ) # include <bits/stdc++.h> # de ...