1ee33e3e97f44db35b38b94efd7f45e9909a45ea.svn-base 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package org.jeecg.boot.starter.lock.client;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.redisson.api.RLock;
  4. import org.redisson.api.RedissonClient;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.redis.core.RedisTemplate;
  7. import org.springframework.stereotype.Component;
  8. import java.util.concurrent.TimeUnit;
  9. /**
  10. * 分布式锁实现基于Redisson
  11. *
  12. * @author zyf
  13. * @date 2020-11-11
  14. */
  15. @Slf4j
  16. @Component
  17. public class RedissonLockClient {
  18. @Autowired
  19. private RedissonClient redissonClient;
  20. @Autowired
  21. private RedisTemplate<String, Object> redisTemplate;
  22. /**
  23. * 获取锁
  24. */
  25. public RLock getLock(String lockKey) {
  26. return redissonClient.getLock(lockKey);
  27. }
  28. /**
  29. * 加锁操作
  30. *
  31. * @return boolean
  32. */
  33. public boolean tryLock(String lockName, long expireSeconds) {
  34. return tryLock(lockName, 0, expireSeconds);
  35. }
  36. /**
  37. * 加锁操作
  38. *
  39. * @return boolean
  40. */
  41. public boolean tryLock(String lockName, long waitTime, long expireSeconds) {
  42. RLock rLock = getLock(lockName);
  43. boolean getLock = false;
  44. try {
  45. getLock = rLock.tryLock(waitTime, expireSeconds, TimeUnit.SECONDS);
  46. if (getLock) {
  47. log.info("获取锁成功,lockName={}", lockName);
  48. } else {
  49. log.info("获取锁失败,lockName={}", lockName);
  50. }
  51. } catch (InterruptedException e) {
  52. log.error("获取式锁异常,lockName=" + lockName, e);
  53. getLock = false;
  54. }
  55. return getLock;
  56. }
  57. public boolean fairLock(String lockKey, TimeUnit unit, int leaseTime) {
  58. RLock fairLock = redissonClient.getFairLock(lockKey);
  59. try {
  60. boolean existKey = existKey(lockKey);
  61. // 已经存在了,就直接返回
  62. if (existKey) {
  63. return false;
  64. }
  65. return fairLock.tryLock(3, leaseTime, unit);
  66. } catch (InterruptedException e) {
  67. e.printStackTrace();
  68. }
  69. return false;
  70. }
  71. public boolean existKey(String key) {
  72. return redisTemplate.hasKey(key);
  73. }
  74. /**
  75. * 锁lockKey
  76. *
  77. * @param lockKey
  78. * @return
  79. */
  80. public RLock lock(String lockKey) {
  81. RLock lock = getLock(lockKey);
  82. lock.lock();
  83. return lock;
  84. }
  85. /**
  86. * 锁lockKey
  87. *
  88. * @param lockKey
  89. * @param leaseTime
  90. * @return
  91. */
  92. public RLock lock(String lockKey, long leaseTime) {
  93. RLock lock = getLock(lockKey);
  94. lock.lock(leaseTime, TimeUnit.SECONDS);
  95. return lock;
  96. }
  97. /**
  98. * 解锁
  99. *
  100. * @param lockName 锁名称
  101. */
  102. public void unlock(String lockName) {
  103. try {
  104. redissonClient.getLock(lockName).unlock();
  105. } catch (Exception e) {
  106. log.error("解锁异常,lockName=" + lockName, e);
  107. }
  108. }
  109. }