前言

最近开发了几个微服务上线了,发现定时任务执行了很多次,查看rancher发现这几个微服务都是多实例的,也就是说定时任务执行了多次,恰好所用框架中使用的是Redisson, 正好记录下使用Redission实现分布式锁

正文

配置

添加Redisson依赖

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.6.5</version>
  5. </dependency>

添加配置类

  1. import org.redisson.Redisson;
  2. import org.redisson.api.RedissonClient;
  3. import org.redisson.config.Config;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class RedissonConfiguration {
  9. @Value("${spring.redis.host}")
  10. private String host;
  11. @Value("${spring.redis.password}")
  12. private String password;
  13. @Value("${spring.redis.port:6379}")
  14. private String port;
  15. @Value("${spring.redis.clientName:${eureka.instance.instanceId}}")
  16. private String clientName;
  17. @Value("${spring.redis.idleConnectionTimeout:10000}")
  18. private int idleConnectionTimeout;
  19. @Value("${spring.redis.pingTimeout:1000}")
  20. private int pingTimeout;
  21. @Value("${spring.redis.connectTimeout:10000}")
  22. private int connectTimeout;
  23. @Value("${spring.redis.timeout:3000}")
  24. private int timeout;
  25. @Value("${spring.redis.retryAttempts:3}")
  26. private int retryAttempts;
  27. @Value("${spring.redis.retryInterval:1500}")
  28. private int retryInterval;
  29. @Value("${spring.redis.subscriptionsPerConnection:5}")
  30. private int subscriptionsPerConnection;
  31. @Value("${spring.redis.subscriptionConnectionMinimumIdleSize:1}")
  32. private int subscriptionConnectionMinimumIdleSize;
  33. @Value("${spring.redis.subscriptionConnectionPoolSize:10}")
  34. private int subscriptionConnectionPoolSize;
  35. @Value("${spring.redis.connectionMinimumIdleSize:32}")
  36. private int connectionMinimumIdleSize;
  37. @Value("${spring.redis.connectionPoolSize:64}")
  38. private int connectionPoolSize;
  39. @Value("${spring.redis.database:1}")
  40. private int database;
  41. @Value("${spring.redis.dnsMonitoring:false}")
  42. private boolean dnsMonitoring;
  43. @Value("${spring.redis.dnsMonitoringInterval:5000}")
  44. private int dnsMonitoringInterval;
  45. @Bean
  46. public RedissonClient redisson() {
  47. Config config = new Config();
  48. config.useSingleServer()
  49. .setAddress(String.format("redis://%s:%s", host,port))
  50. .setClientName(clientName)
  51. .setPassword(password)
  52. .setIdleConnectionTimeout(idleConnectionTimeout)
  53. .setPingTimeout(pingTimeout)
  54. .setConnectTimeout(connectTimeout)
  55. .setTimeout(timeout)
  56. .setRetryAttempts(retryAttempts)
  57. .setRetryInterval(retryInterval)
  58. .setSubscriptionsPerConnection(subscriptionsPerConnection)
  59. .setSubscriptionConnectionMinimumIdleSize(subscriptionConnectionMinimumIdleSize)
  60. .setSubscriptionConnectionPoolSize(subscriptionConnectionPoolSize)
  61. .setConnectionMinimumIdleSize(connectionMinimumIdleSize)
  62. .setConnectionPoolSize(connectionPoolSize)
  63. .setDatabase(database)
  64. .setDnsMonitoring(dnsMonitoring)
  65. .setDnsMonitoringInterval(dnsMonitoringInterval);
  66. return Redisson.create(config);
  67. }
  68. }

使用

  1. @Inject
  2. RedissonClient redisson;
  3. RLock lock;
  4. public void method() {
  5. try {
  6. // key替换为锁key, 不要与其他锁key冲突
  7. lock = redisson.getLock("key");
  8. // 参数1为等待时间,超时return
  9. // 参数2为锁的过期时间
  10. // 参数3为时间单位
  11. // 本例中,得不到锁立即失败,50秒后自动解锁
  12. if (!lock.tryLock(0, 50, TimeUnit.SECONDS)) {
  13. return;
  14. }
  15. // 业务逻辑
  16. lock.forceUnlock();
  17. } catch (InterruptedException e) {
  18. // 重置线程打断状态
  19. Thread.currentThread().interrupt();
  20. }
  21. }

配置文件就不上了

基于Redisson实现分布式锁的更多相关文章

  1. 基于Redisson实现分布式锁源码解读

    文章目录 一.分布式锁的概念 和 使用场景 二.将redis官网对于分布式锁(红锁)的定义和Redisson实现做概括性总结 三.基于Redisson的分布式实现方案 四.加锁过程分析 五.锁重入过程 ...

  2. 【连载】redis库存操作,分布式锁的四种实现方式[二]--基于Redisson实现分布式锁

    一.redisson介绍 redisson实现了分布式和可扩展的java数据结构,支持的数据结构有:List, Set, Map, Queue, SortedSet, ConcureentMap, L ...

  3. 基于redis的分布式锁实现方案--redisson

    实例代码地址,请前往:https://gitee.com/GuoqingLee/distributed-seckill redis官方文档地址,请前往:http://www.redis.cn/topi ...

  4. 基于 Redis 做分布式锁

    基于 REDIS 的 SETNX().EXPIRE() 方法做分布式锁 setnx() setnx 的含义就是 SET if Not Exists,其主要有两个参数 setnx(key, value) ...

  5. Redisson实现分布式锁

    转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...

  6. 基于 Redis 的分布式锁

    前言 分布式锁在分布式应用中应用广泛,想要搞懂一个新事物首先得了解它的由来,这样才能更加的理解甚至可以举一反三. 首先谈到分布式锁自然也就联想到分布式应用. 在我们将应用拆分为分布式应用之前的单机系统 ...

  7. 基于redis的分布式锁(转)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  8. 基于redis的分布式锁(不适合用于生产环境)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  9. redis系列:基于redis的分布式锁

    一.介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分为两部分,一个是单机环境, ...

随机推荐

  1. 虚拟机使用不同CPU配置时内存性能的差异

    第一款机器的配置: CPU(s): 8On-line CPU(s) list: 0-7Thread(s) per core: 1Core(s) per socket: 4座: 2NUMA 节点: 1 ...

  2. PP学习笔记02

    SPRO SAP参考IMG MM03 物料视图 生产计划编制 需求管理 已计划的独立需求 需求类型 策略组 定义策略 策略组 主要策略(独立需求 ) 客户需求类型 需求类 (计划标识符.消耗标识.需求 ...

  3. Kivy crash 中文教程 实例入门 1. 第1个应用 Kivy App (Making a simple App)

    1.  空白窗口 在 PyCharm 中创建一个名为 TutorialApp 的项目,然后在该项目中新建了个名为 tutorial_app.py 的 Python 源文件,在 PyCharm 的代码编 ...

  4. ueditor 使用

    之前在微信上用到富文本编辑器,选用了ueditor 之后又在项目中使用到了,因此打算写下来记录一下. 1  首先去下载ueditor 2  我的是 MVC项目,贴一下:粘贴到Content下 3 然后 ...

  5. Codeforces965E Short Code 【启发式合并】【堆】

    题目大意: 给出总长度不超过1E+5的不重复字符串集,给每个字符串选一个前缀使得可以区分它. 题目分析: KAN出的DIV2难度一般不高,想升Ranting的可以试试. 简单的树上启发式合并,建出Tr ...

  6. 树剖模板(洛谷P3384 【模板】树链剖分)(树链剖分,树状数组,树的dfn序)

    洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\su ...

  7. 自学Linux Shell17.1-正则表达式

    点击返回 自学Linux命令行与Shell脚本之路 17.1-正则表达式 1. 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“ ...

  8. selenium 登陆小技巧

    from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Fi ...

  9. Java:终于找到了在alloy中的JFileChooser中的弹出式菜单不显示文字的解决办法

    alloy界面可以说是我写过的最漂亮的一种JAVA界面. 可惜不知为什么,至从几年前推出1.4版后,就再也没有更新了. 随着java版本的升级,一直很担心alloy有一天不再适用于java的最新版. ...

  10. python之配置日志的几种方式

    作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文 ...