当前位置:   article > 正文

基于Spring boot 2.1 使用redisson实现分布式锁_springboot2.1.1对应的redisson

springboot2.1.1对应的redisson

redis分布式锁在该博客中,讲解了基于jedis的单价redis实现的分布式锁,如果redis是分布式部署的,该方法就没法使用了,本篇介绍的是基于redisson实现的分布式锁

组件依赖

首先我们要通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码:

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.10.5</version>
  5. </dependency>

redisson配置,我们的redis是用的是集群版,使用的代理模式

redis架构图如下

redisson使用单节点配置(还有哨兵模式,多节点模式)

  1. /**
  2. * Redisson 配置
  3. * @return
  4. */
  5. @Bean
  6. public RedissonClient redissonClient() {
  7. Config config = new Config();
  8. String host = redisProperties.getHost();
  9. int port = redisProperties.getPort();
  10. SingleServerConfig serverConfig = config.useSingleServer().setAddress("redis://" + host + ":" + port)
  11. .setTimeout(redisProperties.getTimeout())
  12. .setDatabase(redisProperties.getDatabase())
  13. .setConnectionPoolSize(redisProperties.getMaxActive())
  14. .setConnectionMinimumIdleSize(redisProperties.getMinIdle());
  15. if (StringUtils.isNotEmpty(redisProperties.getPassword())) {
  16. serverConfig.setPassword(redisProperties.getPassword());
  17. }
  18. return Redisson.create(config);
  19. }

RedissonLocker的具体实现类

  1. public class RedissonLockerImpl implements RedissonLocker {
  2. @Autowired
  3. private RedissonClient redissonClient;
  4. /**************************可重入锁**************************/
  5. /**
  6. * 拿不到lock就不罢休,不然线程就一直block
  7. * 没有超时时间,默认30s
  8. *
  9. * @param lockKey
  10. * @return
  11. */
  12. @Override
  13. public RLock lock(String lockKey) {
  14. RLock lock = redissonClient.getLock(lockKey);
  15. lock.lock();
  16. return lock;
  17. }
  18. /**
  19. * 自己设置超时时间
  20. *
  21. * @param lockKey 锁的key
  22. * @param timeout 秒 如果是-1,直到自己解锁,否则不会自动解锁
  23. * @return
  24. */
  25. @Override
  26. public RLock lock(String lockKey, int timeout) {
  27. RLock lock = redissonClient.getLock(lockKey);
  28. lock.lock(timeout, TimeUnit.SECONDS);
  29. return lock;
  30. }
  31. /**
  32. * 自己设置超时时间
  33. *
  34. * @param lockKey 锁的key
  35. * @param unit 锁时间单位
  36. * @param timeout 超时时间
  37. *
  38. */
  39. @Override
  40. public RLock lock(String lockKey, TimeUnit unit, int timeout) {
  41. RLock lock = redissonClient.getLock(lockKey);
  42. lock.lock(timeout, unit);
  43. return lock;
  44. }
  45. /**
  46. * 尝试加锁,最多等待waitTime,上锁以后leaseTime自动解锁
  47. * @param lockKey 锁key
  48. * @param unit 锁时间单位
  49. * @param waitTime 等到最大时间,强制获取锁
  50. * @param leaseTime 锁失效时间
  51. * @return 如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false
  52. */
  53. @Override
  54. public boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
  55. RLock lock = redissonClient.getLock(lockKey);
  56. try {
  57. return lock.tryLock(waitTime, leaseTime, unit);
  58. } catch (InterruptedException e) {
  59. e.printStackTrace();
  60. }
  61. return false;
  62. }
  63. /**************************公平锁**************************/
  64. /**
  65. * 尝试加锁,最多等待waitTime,上锁以后leaseTime自动解锁
  66. * @param lockKey 锁key
  67. * @param unit 锁时间单位
  68. * @param waitTime 等到最大时间,强制获取锁
  69. * @param leaseTime 锁失效时间
  70. * @return 如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false
  71. */
  72. public boolean fairLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
  73. RLock fairLock = redissonClient.getFairLock(lockKey);
  74. try {
  75. return fairLock.tryLock(waitTime, leaseTime, unit);
  76. } catch (InterruptedException e) {
  77. e.printStackTrace();
  78. }
  79. return false;
  80. }
  81. /**
  82. * 释放锁
  83. * @param lockKey 锁key
  84. */
  85. @Override
  86. public void unlock(String lockKey) {
  87. RLock lock = redissonClient.getLock(lockKey);
  88. lock.unlock();
  89. }
  90. /**
  91. * 释放锁
  92. */
  93. @Override
  94. public void unlock(RLock lock) {
  95. lock.unlock();
  96. }
  97. }

业务代码中使用

  1. String lockKey = userId;
  2. // 公平加锁,60秒后锁自动释放
  3. boolean isLocked = false;
  4. try {
  5. isLocked = redissonLocker.fairLock(lockKey , TimeUnit.SECONDS, 3, 60);
  6. if (isLocked) { // 如果成功获取到锁就继续执行
  7. // 执行业务代码操作
  8. return GlobalResponse.success();
  9. } else { // 未获取到锁
  10. return GlobalResponse.fail(500, "请勿重复点击!!");
  11. }
  12. } catch (Exception e) {
  13. return GlobalResponse.fail(500, e.getMessage());
  14. } finally {
  15. if (isLocked) { // 如果锁还存在,在方法执行完成后,释放锁
  16. redissonLocker.unlock(lockKey);
  17. }
  18. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/815223
推荐阅读
相关标签
  

闽ICP备14008679号