spring boot 分布式锁组件 spring-boot-klock-starter

基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring boot,和spirng mvc等spring相关项目

spring boot 分布式锁组件 spring-boot-klock-starter

快速开始

spring boot项目接入

1.添加lock starter组件依赖,目前还没上传到公共仓库,需要自己下源码build ,已上传到maven中央仓库

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-klock-starter</artifactId><version>1.2-SNAPSHOT</version>
</dependency>

2.application.properties配置redis链接:spring.klock.address=127.0.0.1:6379

3.在需要加分布式锁的方法上,添加注解@Klock,如:

@Service
public class TestService {@Klock(waitTime = Long.MAX_VALUE)public String getValue(String param) throws Exception {if ("sleep".equals(param)) {//线程休眠或者断点阻塞,达到一直占用锁的测试效果Thread.sleep(1000 * 50);}return "success";}
}

支持锁指定的业务key,如同一个方法ID入参相同的加锁,其他的放行。业务key的获取支持Spel,具体使用方式如下

使用参数说明

spring.klock.address : redis链接地址
spring.klock.password : redis密码
spring.klock.database : redis数据索引
spring.klock.waitTime : 获取锁最长阻塞时间(默认:60,单位:秒)
spring.klock.leaseTime: 已获取锁后自动释放时间(默认:60,单位:秒)
spring.klock.cluster-server.node-addresses : redis集群配置 如 127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002
spring.klock.address 和 spring.klock.cluster-server.node-addresses 选其一即可

@Klock注解参数说明

@Klock可以标注四个参数,作用分别如下
name:lock的name,对应redis的key值。默认为:类名+方法名
lockType:锁的类型,目前支持(可重入锁,公平锁,读写锁)。默认为:公平锁
waitTime:获取锁最长等待时间。默认为:60s。同时也可通过spring.klock.waitTime统一配置
leaseTime:获得锁后,自动释放锁的时间。默认为:60s。同时也可通过spring.klock.leaseTime统一配置
lockTimeoutStrategy: 加锁超时的处理策略,可配置为不做处理、快速失败、阻塞等待的处理策略,默认策略为不做处理
customLockTimeoutStrategy: 自定义加锁超时的处理策略,需指定自定义处理的方法的方法名,并保持入参一致。
releaseTimeoutStrategy: 释放锁时,持有的锁已超时的处理策略,可配置为不做处理、快速失败的处理策略,默认策略为不做处理
customReleaseTimeoutStrategy: 自定义释放锁时,需指定自定义处理的方法的方法名,并保持入参一致。

锁超时说明

因为基于redis实现分布式锁,如果使用不当,会在以下场景下遇到锁超时的问题:

加锁超时处理策略(LockTimeoutStrategy):

  • NO_OPERATION 不做处理,继续执行业务逻辑
  • FAIL_FAST 快速失败,会抛出KlockTimeoutException
  • KEEP_ACQUIRE 阻塞等待,一直阻塞,直到获得锁,但在太多的尝试后,会停止获取锁并报错,此时很有可能是发生了死锁。
  • 自定义(customLockTimeoutStrategy) 需指定自定义处理的方法的方法名,并保持入参一致,指定自定义处理方法后,会覆盖上述三种策略,且会拦截业务逻辑的运行。

释放锁时超时处理策略(ReleaseTimeoutStrategy):

  • NO_OPERATION 不做处理,继续执行业务逻辑
  • FAIL_FAST 快速失败,会抛出KlockTimeoutException
  • 自定义(customReleaseTimeoutStrategy) 需指定自定义处理的方法的方法名,并保持入参一致,指定自定义处理方法后,会覆盖上述两种策略, 执行自定义处理方法时,业务逻辑已经执行完毕,会在方法返回前和throw异常前执行。

 

转载于:https://www.cnblogs.com/luchangjiang/p/10805733.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

std::string中的find_first_of()和find_last_of()函数

编程语言: c/linux 在std::string中&#xff0c;有时需要找到一个string中最后一个或者第一个以某个特定的字符开始的位置或者下标&#xff0c;这时就需要使用find_first_of()和find_last_of()函数。 find_first_of() &#xff1a; 找到一个string中第一个以 某个 字符开始的…

Adsense加入黑名单的预防办法

说说预防被例如黑名单的办法。 GOOGLE同样知道竞争对手在点你的广告&#xff0c;这也会被记录在案&#xff08;Adsense同样知道他们的地理位置&#xff09;。 如果发现网站广告点击有异常情况&#xff0c;应该及时通知Google相关人员。万一被Google Adsense除名了&#xff0c;也…

【学习笔记4】Action名称的搜索顺序

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0e;获得请求路径的URI&#xff0c;例如url是&#xff1a;http://server/struts2/path1/path2/path3/test.action 2&#xff0e;首先寻找namespace为/path1/path2/path3的package&#xff0c;如果不存在这个pac…

std::map中的lower_bound与upper_bound

最近在工作中遇到了std::map中的lower_bound与upper_bound&#xff0c;再次记录下其功能和使用方式。 std::map<char, int> mp; mp.lower_bound<key> &#xff1a; 返回的是第一个大于、等于key的iterator&#xff0c;如果没有则返回空。 mp.upper_bound<key…

函数初识

函数#1.函数的定义 def#2.函数的调用#3.函数的返回值 return#4.函数的参数 #形参&#xff1a; # 位置参数 &#xff1a; 必须传 # *args &#xff1a;可以接收任意多个位置参数 # 默认参数 &#xff1a; 可以不传 # **kwargs &#xff1a; 可以…

MongoDB 初学

大致看了一点 MongoDB. 回忆一下&#xff0c;这个数据库有这样一些特征&#xff1a; Schema-less: 不需要预先定义 schema. 数据以 document 的方式存储&#xff0c;document 大致上相当于关系数据库中的一行记录。document 存放在 collection 中间&#xff08;相当于关系数据库…

STL中的set/map

std::set/std::map底层实现的机制是红黑树&#xff0c;树中的数据是有序的&#xff0c;那么进行插入、删除、查找时的平均时间复杂读O(logN),以2为低的对数N。set相当于map中的key&#xff0c;map中的key不能有重复的并且按升序进行排序&#xff0c;如果结构体作为map中的key&a…

IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)

上篇文章中&#xff0c;举了一个Autofac的简单例子&#xff0c;园友eflay反应: “虽然对autofac架构原理还是完全不懂&#xff0c;不过基本是明白ioc的用途了&#xff0c;会从已注册的类中找出符合接口的类来调用构造函数进行构造” 所以这篇文章&#xff0c;还是针对上次的例子…

STATS 4014 Advanced Data Science

STATS 4014Advanced Data ScienceAssignment 3Jono TukeSemester 1 2019CHECKLIST: Have you shown all of your working, including probability notation where necessary? : Have you given all numbers to 3 decimal places unless otherwise stated? : Have you include…

铁血规则:事件预订与取消预订

在编码的时候&#xff0c;我们经常预订某个事件来处理它&#xff0c;但很少取消事件的预订&#xff0c;这种做法可能导致程序在运行时出现一些异常。 如果你的某个用于处理事件的对象不是在运行期内永久存在的&#xff08;比如&#xff0c;不是Singleton对象&#xff09;&#…

MySQL中的insert ignore into讲解

最近工作中&#xff0c;使用到了insert ignore into语法&#xff0c;感觉这个语法还是挺有用的&#xff0c;就记录下来做个总结。 insert ignore into : 忽略重复的记录&#xff0c;直接插入数据。 包括两种场景&#xff1a; 1、插入的数据是主键冲突时 insert ignore into…

[置顶] 我的iOS作品

我的iOS作品 罗朝辉 ( http://blog.csdn.net/kesalin)CC 许可&#xff0c;转载请注明出处前言 做了好几年的 iOS 开发了&#xff0c;业余也零零散散地写了不少代码和博文教程。可惜一直都没有整理下&#xff0c;上次过年回家在张江广兰路把笔记本给丢了&#xff0c;损失惨重&am…

SSM框架搭建

SSM&#xff08;SpringSpringMvcMybatis&#xff09;项目环境搭建&#xff1a; 1、项目环境&#xff1a; jdk-1.8 tomcat-9.0 mysql-5.1.44 spring 5.1.6 mybatis 3.5.1 maven 3.5.42、项目目录结构&#xff1a; 3、pom.xml中引入的依赖&#xf…

MySQL字段值大小写敏感的解决方案

最近在用开源的MySQL 8.0开发本公司的产品&#xff0c;在客户现场建表时默认使用的是CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci 字符集导致与oracle的结果不一致&#xff0c;最后将建表时的字符集改为utf8mb3就可以了。 正常建表如下&#xff0c;默认使用的是CHARSETutf8mb4 …

制作Slider组件

利用as3&#xff0c;我们可以尝试制作一些有趣的组件&#xff0c;虽然现在已经有很多实用的组件&#xff0c;但是自己尝试写一下也是不错的。利用as3语法&#xff0c;借用了绘图Api我们尝试制作一下这个组件。因为我们不需要很强大的功能&#xff0c;对此我们只是需要选取其一部…

Android 编程下的四大组件之服务(Service)

服务&#xff08;Service&#xff09; 是一种在后台运行&#xff0c;没有界面的组件&#xff0c;由其他组件调用开始。Android 中的服务和 Windows 中的服务是类似的东西&#xff0c;它运行于系统中不容易被用户发觉&#xff0c;可以使用它开发如监控之类的程序。 服务&#xf…

mysql ld preload过程

纯手工打造每一篇开源资讯与技术干货&#xff0c;数十万程序员和Linuxer已经关注。 导读 本文将叙述通过二进制源码方式安装Percona-5.7.15&#xff0c;并进行快速启动。这边如何使用二进制版本安装Percona-5.7.15就不说了&#xff0c;和之前一模一样。 不做多余的事 1、解…

第六章实验报告(函数和宏定义实验)

C程序设计实验报告 一、实验项目: 1、编写由三角形三边求面积的函数 2、编写求N阶乘的函数 3、求两个整数的最大公约数 4、打印输出三角形 5、求500以内的所有亲密数对 姓名&#xff1a;廖云福 实验地点&#xff1a;教学楼514教室  实验时间&#xff1a;2019.4.30 一、实验目…

HttpRequest 与HttpWebRequest 有什么区别

System.Web.HttpRequest是封装浏览器对服务器的请求的&#xff0c;主要用在ASP.NET中&#xff0c;其中包括浏览器请求的网址&#xff0c;查询字符串数据或表单数据等等 而System.Net.HttpWebRequest则是用来简化网络请求的过程&#xff0c;从服务器上获取文件/结果的&#xff0…

mysqld_safe启动脚本源码阅读与分析

原文链接&#xff1a;https://blog.csdn.net/weixin_39844426/article/details/113422137 前几天读了下mysqld_safe脚本&#xff0c;个人感觉还是收获蛮大的&#xff0c;其中细致的交代了MySQL数据库的启动流程&#xff0c;包括查找MySQL相关目录&#xff0c;解析配置文件以及…