redission用来做分布式锁比zookeeper更方便,简单。
引入依赖</>复制代码
org.redisson
redisson
2.10.7
compile
配置redission
</>复制代码
@Import(SLockAspect.class) //引入AOP配置
@AutoConfigureAfter(RedisAutoConfiguration.class) // 配置Redis
@EnableConfigurationProperties(value = {SLockConfig.class}) //自动注册配置文件
public class RedissionAutoConfig {
@Resource
private 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);
}
@Bean
public LockInfoProvider lockInfoProvider() {
return new LockInfoProvider();
}
@Bean
public 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 ;
}
当多线程测试的时候,下一个线程总会等到上一个线程完成后再继续。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68339.html
摘要:不过比较肤浅,为了进一步加深对的认识,我利用空闲时间编写了本篇文章对应的基于的分布式锁实现。不过我所编写的分布式锁还是比较简陋的,实现的也不够优美,仅仅是个练习,仅供参考使用。好了,题外话就说到这里,接下来我们就来聊聊基于的分布式锁实现。 1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用。且很多资料都是将 Z...
摘要:集群实现分布式锁上面的讨论中我们有一个非常重要的假设是单点的。但是其实这已经超出了实现分布式锁的范围,单纯用没有命令来实现生成。这个问题用实现分布式锁暂时无解。结论并不能实现严格意义上的分布式锁。 关于Redis实现分布式锁的问题,网络上很多,但是很多人的讨论基本就是把原来博主的贴过来,甚至很多面试官也是一知半解经不起推敲就来面候选人,最近结合我自己的学习和资料查阅,整理一下用Redi...
摘要:分布式锁基于实现分布式锁思考几个问题锁为什么不能应用于分布式锁虽然能够解决同步问题,但是每次只有一个线程访问,并且锁属于锁,仅适用于单点部署然而分布式需要部署多台实例,属于不同的线程对象使用中实现分布式锁。分布式锁基于redis实现分布式锁思考几个问题?synchronized锁为什么不能应用于分布式锁?synchronized虽然能够解决同步问题,但是每次只有一个线程访问,并且synchr...
阅读 2947·2021-11-23 09:51
阅读 3198·2021-11-12 10:36
阅读 3232·2021-09-27 13:37
阅读 3191·2021-08-17 10:15
阅读 2612·2019-08-30 15:55
阅读 2780·2019-08-30 13:07
阅读 812·2019-08-29 16:32
阅读 2669·2019-08-26 12:00
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要