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

快速开始

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

spring boot 分布式锁组件 spring-boot-klock-starter相关推荐

  1. 【Spring 】Synchronized锁在Spring事务管理下,为啥还线程不安全?

    1.概述 转载:Synchronized锁在Spring事务管理下,为啥还线程不安全? 知乎问题:知乎

  2. Spring Boot Redis 实现分布式锁,真香!!

    之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...

  3. Spring Boot Redis 实现分布式锁,真香

    之前看很多人手写分布式锁,其实 Spring Boot 现在已经做的足够好了,开箱即用,支持主流的 Redis.Zookeeper 中间件,另外还支持 JDBC. 本篇栈长以 Redis 为例(这也是 ...

  4. 基于Spring boot 2.1 使用redisson实现分布式锁

    在博客redis分布式锁中,讲解了基于jedis的单机redis实现的分布式锁,如果redis是分布式部署的,该方法就没法使用了,本篇介绍的是基于redisson实现的分布式锁 组件依赖 首先我们要通 ...

  5. 事务 | Spring Cloud 分布式事务管理(二)2pc/3pc

    Spring Cloud 分布式事务管理(二)2pc/3pc 上一篇 Spring Cloud 分布式事务管理 上一章,讲到了微服务带来的优点和缺点以及分布式事务的不确定性.这节说一下2pc/3pc ...

  6. java设计前期工作基础和存在的困难_Java秒杀系统实战系列-基于Redisson的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子操作在优化秒 ...

  7. 实战系列-分布式锁的Redis实现

    导语   本篇博客,博主使用本地的Docker 搭建了一套测试环境,用来手写一个属于自己的基于Redis分布式锁实现方案,通过自己实现来了解分布式锁的原理.并且对整个的构建过程做了分享,希望可以对大家 ...

  8. Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...

  9. Redis分布式锁(图解 - 秒懂 - 史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

最新文章

  1. CSS:超出部分省略号
  2. 16、HTML密码框
  3. 96. 奇怪的汉诺塔【递推】
  4. 本周个人总结(软件的初步开发)
  5. linux内核层是什么,从用户层到内核层 - Linux内核中的信号机制_Linux编程_Linux公社-Linux系统门户网站...
  6. Reference, List, and Completion of javascript
  7. python web框架 多线程_Django基础知识 web框架的本质详解
  8. VueX的store的简单使用心结
  9. uniq 去除重复命令使用方法介绍
  10. linux内核博大精深,Linux Kernel里的cpu_to_le32是干啥的?
  11. observable java_java源码阅读Observable(观察者模式)
  12. python获取局域网通过guest开放的软件_python构建SSH僵尸网络
  13. 【工具使用】SecureCRT的下载、安装图文详细过程介绍
  14. 【使用pycharm管理github仓库】github代码版本控制
  15. 交换机的作用是什么?交换机功能及工作原理详解!
  16. SVG霍比特人电影标题样式
  17. 【图神经网络】异构时间图卷积网络HTGCN——用于社区检测
  18. 简述dijkstra算法原理_理解最短路径——迪杰斯特拉(dijkstra)算法
  19. 友价实现一键Nofollow(数据库替换)
  20. QEMU(1) - QOM

热门文章

  1. dash 和 bash 切换
  2. Sublime 插件- px 转rem
  3. 命令行下mysql新建用户及分配权限
  4. 方法调方法(委托方式)
  5. 用JSmooth制作java jar文件的可运行exe文件教程【图文】
  6. Gnuplot 简单使用
  7. wait( )和 waitpid( )
  8. angularjs 结构的两种写法(2)
  9. Kinect2.0-空间长度测量
  10. 【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net