基于Reddsion分布式的锁实现
redission用来做分布式锁比zookeeper更方便,简单。
引入依赖
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.10.7</version><scope>compile</scope></dependency>
配置redission
@Import(SLockAspect.class) //引入AOP配置
@AutoConfigureAfter(RedisAutoConfiguration.class) // 配置Redis
@EnableConfigurationProperties(value = {SLockConfig.class}) //自动注册配置文件
public class RedissionAutoConfig {@Resourceprivate SLockConfig sLockConfig;@Bean(destroyMethod = "shutdown")@ConditionalOnMissingBean(name = "redission")public RedissonClient redission() {Config config = new Config();config.useSingleServer().setPassword(this.sLockConfig.getPassword()).setAddress(this.sLockConfig.getAddress());return Redisson.create(config);}@Beanpublic LockInfoProvider lockInfoProvider() {return new LockInfoProvider();}@Beanpublic SLockFactory sLockFactory() {return new SLockFactory();}
}
其中 SLockAspect.class 就是一个一个注解,基于AOP切面的,SLockConfig.class就是读入 redission的配置文件
自主义注解 SLock
@Target(value = {ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface SLock {/*** 锁名称** @return*/String name() default "";/*** 锁类型,默认Fair公平锁** @return*/LockType lockType() default LockType.FAIR;/*** 尝试加锁等待时长,默认 Long.MIN_VALUE** @return*/long waitTime() default Long.MIN_VALUE;/*** 自动解锁时长,默认 Long.MIN_VALUE** @return*/long releaseTime() default Long.MIN_VALUE;enum LockType {/*** 可重入锁*/REENTRANT,/*** 公平锁*/FAIR,/*** 读锁*/READ,/*** 写锁*/WRITE,}
}
测试
@GetMapping("/{id}")@SLock(name = "BB",waitTime = Long.MAX_VALUE, releaseTime = 5)public String hello(@PathVariable Long id){Long counter = redisTemplate.opsForValue().increment("COUNTER", 1);try {log.info(id +" locked and begin...");Thread.sleep(5000); 模拟处理过程 do something.} catch (Exception ex) {log.error("Error occurred");} finally {log.info(id +" unlocked...");}return "lock-" + id ;}
当多线程测试的时候,下一个线程总会等到上一个线程完成后再继续。
基于Reddsion分布式的锁实现相关推荐
- 如何基于 String 实现同步锁?
作者:等你归去来 https://www.cnblogs.com/yougewe/p/11573911.html 如何基于String实现同步锁? 在某些时候,我们可能想基于字符串做一些事情,比如:针 ...
- 基于redis的悲观锁
所谓悲观锁:具有强烈的独占和排他特性.它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠 ...
- 分布式红锁的加锁失败的设计原理
分布式红锁的加锁失败的设计原理 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb OK 都设置为30分钟超时 过期 ...
- 采用docker部署3台Redis分布式红锁实例
采用docker部署3台Redis分布式红锁实例 docker run -p 6381:6379 --name redis-master-1 -d redis:5.0.7 docker run -p ...
- 纳秒级分布式无锁限流插件 Current-Limiting
github:https://github.com/yueshutong/SnowJena 码云:https://gitee.com/zyzpp/spring-boot-starter-current ...
- Redis分布式事务锁的原理(上)
我们在单机服务器,出现资源的竞争,一般使用synchronized 就可以解决,但是在分布式的服务器上,synchronized 就无法解决这个问题,这就需要一个分布式事务锁. 除此之外面试,基本会问 ...
- Spring Cloud Alibaba微服务项目中集成Redis实现分布式事务锁实践
引言 我们知道同一个进程里面为了解决资源共享而不出现高并发的问题可以通过高并发编程解决,通过给变量添加volatile关键字实现线程间变量可见:通过synchronized关键字修饰代码块.对象或者方 ...
- 基于数组的无锁队列(译)
2019独角兽企业重金招聘Python工程师标准>>> 1 引言 最近对于注重性能的应用程序,我们有了一种能显著提高程序性能的选择:多线程.线程的概念实际上已经存在了很长时间.在过去 ...
- .net core 下的分布式事务锁
系统分布式锁的用法 公司框架新增功能分布式锁: 锁的性能之王:缓存 > Zookeeper >= 数据库 锁的实现 实现原理:核心采用StackExchange.Redis的LockTak ...
最新文章
- php程序中报date错误
- 最全的cisco ios下载,思科ios下载
- React不提交表单并且获取表单中的数据
- AWS Loft的数据库周
- 平均每天呆实验室14小时,本科女生一作发表PNAS,直博北大!
- JAVAOO难以理解的部分
- android-hotfix(QQ空间思路)浅析
- php mysql 框架_YCKIT-一个基于PHP+MYSQL架构下的敏捷开发框架
- 225 Implement Stack using Queues(用队列实现栈Medium)
- Spring @Autowired注解在非Controller注入为null,Springboot @Reference注入为null解决方案
- 从网易云、QQ音乐下载音乐
- LBP特征及其一些变种
- struts2拦截器实现登录限制
- 2007.12.25 2个意外惊喜
- 美团点评运营数据产品化实战
- 如何克服自己的懒惰-第二弹
- python基础—列表解析式简单应用
- You are what you read 笔记
- 工作记录 io流写入linux文件
- 开关电源保险丝、整流桥及输入滤波电容的选型
热门文章
- 揭秘华为麒麟990 5G:提前3年布局,百亿晶体管把7nm用到了极致
- 【跃迁之路】【658天】程序员高效学习方法论探索系列(实验阶段415-2018.12.02)...
- aws ec2使用ses邮件服务的坑
- oracle数据库enq: TX - allocate ITL entry性能诊断
- FJ省队集训DAY3 T1
- onethink不能安装到已经存在的数据库中的问题
- 【随想】_无关技术_你是合格的项目经理人吗?
- Tungsten Fabric SDN — 社区贡献
- 微服务架构 — 服务治理 — 服务注册与发现、服务订阅与通知
- 分布式任务队列 Celery — 详解工作流