资讯专栏INFORMATION COLUMN

基于Reddsion分布式的锁实现

ralap / 1704人阅读

redission用来做分布式锁比zookeeper更方便,简单。

引入依赖

</>复制代码

  1. org.redisson
  2. redisson
  3. 2.10.7
  4. compile
配置redission

</>复制代码

  1. @Import(SLockAspect.class) //引入AOP配置
  2. @AutoConfigureAfter(RedisAutoConfiguration.class) // 配置Redis
  3. @EnableConfigurationProperties(value = {SLockConfig.class}) //自动注册配置文件
  4. public class RedissionAutoConfig {
  5. @Resource
  6. private SLockConfig sLockConfig;
  7. @Bean(destroyMethod = "shutdown")
  8. @ConditionalOnMissingBean(name = "redission")
  9. public RedissonClient redission() {
  10. Config config = new Config();
  11. config.useSingleServer()
  12. .setPassword(this.sLockConfig.getPassword())
  13. .setAddress(this.sLockConfig.getAddress());
  14. return Redisson.create(config);
  15. }
  16. @Bean
  17. public LockInfoProvider lockInfoProvider() {
  18. return new LockInfoProvider();
  19. }
  20. @Bean
  21. public SLockFactory sLockFactory() {
  22. return new SLockFactory();
  23. }
  24. }

其中 SLockAspect.class 就是一个一个注解,基于AOP切面的,SLockConfig.class就是读入 redission的配置文件

自主义注解 SLock

</>复制代码

  1. @Target(value = {ElementType.METHOD})
  2. @Retention(value = RetentionPolicy.RUNTIME)
  3. public @interface SLock {
  4. /**
  5. * 锁名称
  6. *
  7. * @return
  8. */
  9. String name() default "";
  10. /**
  11. * 锁类型,默认Fair公平锁
  12. *
  13. * @return
  14. */
  15. LockType lockType() default LockType.FAIR;
  16. /**
  17. * 尝试加锁等待时长,默认 Long.MIN_VALUE
  18. *
  19. * @return
  20. */
  21. long waitTime() default Long.MIN_VALUE;
  22. /**
  23. * 自动解锁时长,默认 Long.MIN_VALUE
  24. *
  25. * @return
  26. */
  27. long releaseTime() default Long.MIN_VALUE;
  28. enum LockType {
  29. /**
  30. * 可重入锁
  31. */
  32. REENTRANT,
  33. /**
  34. * 公平锁
  35. */
  36. FAIR,
  37. /**
  38. * 读锁
  39. */
  40. READ,
  41. /**
  42. * 写锁
  43. */
  44. WRITE,
  45. }
  46. }
测试

</>复制代码

  1. @GetMapping("/{id}")
  2. @SLock(name = "BB",waitTime = Long.MAX_VALUE, releaseTime = 5)
  3. public String hello(@PathVariable Long id){
  4. Long counter = redisTemplate.opsForValue().increment("COUNTER", 1);
  5. try {
  6. log.info(id +" locked and begin...");
  7. Thread.sleep(5000); ////模拟处理过程 do something.
  8. } catch (Exception ex) {
  9. log.error("Error occurred");
  10. } finally {
  11. log.info(id +" unlocked...");
  12. }
  13. return "lock-" + id ;
  14. }

当多线程测试的时候,下一个线程总会等到上一个线程完成后再继续。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68339.html

相关文章

  • 基于 Zookeeper 的布式实现

    摘要:不过比较肤浅,为了进一步加深对的认识,我利用空闲时间编写了本篇文章对应的基于的分布式锁实现。不过我所编写的分布式锁还是比较简陋的,实现的也不够优美,仅仅是个练习,仅供参考使用。好了,题外话就说到这里,接下来我们就来聊聊基于的分布式锁实现。 1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用。且很多资料都是将 Z...

    邱勇 评论0 收藏0
  • 百度社招面试题——如何用Redis实现布式

    摘要:集群实现分布式锁上面的讨论中我们有一个非常重要的假设是单点的。但是其实这已经超出了实现分布式锁的范围,单纯用没有命令来实现生成。这个问题用实现分布式锁暂时无解。结论并不能实现严格意义上的分布式锁。 关于Redis实现分布式锁的问题,网络上很多,但是很多人的讨论基本就是把原来博主的贴过来,甚至很多面试官也是一知半解经不起推敲就来面候选人,最近结合我自己的学习和资料查阅,整理一下用Redi...

    YanceyOfficial 评论0 收藏0
  • 基于redis实现布式锁思考

    摘要:分布式锁基于实现分布式锁思考几个问题锁为什么不能应用于分布式锁虽然能够解决同步问题,但是每次只有一个线程访问,并且锁属于锁,仅适用于单点部署然而分布式需要部署多台实例,属于不同的线程对象使用中实现分布式锁。分布式锁基于redis实现分布式锁思考几个问题?synchronized锁为什么不能应用于分布式锁?synchronized虽然能够解决同步问题,但是每次只有一个线程访问,并且synchr...

    Tecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<