RedissonService.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package com.qqflow.engine.common.service;
  2. import org.redisson.api.*;
  3. import org.springframework.stereotype.Component;
  4. import java.time.Duration;
  5. import java.util.Collection;
  6. import java.util.Map;
  7. import java.util.concurrent.TimeUnit;
  8. @Component
  9. public class RedissonService {
  10. private final RedissonClient redissonClient;
  11. public RedissonService(RedissonClient redissonClient) {
  12. this.redissonClient = redissonClient;
  13. }
  14. // ==================== 分布式锁 ====================
  15. /** 获取锁(阻塞直到获取成功) */
  16. public RLock getLock(String key) {
  17. return redissonClient.getLock(key);
  18. }
  19. /** 尝试获取锁,默认等待 10 秒,持有 30 秒 */
  20. public boolean tryLock(String key) {
  21. try {
  22. return redissonClient.getLock(key).tryLock(10, 30, TimeUnit.SECONDS);
  23. } catch (InterruptedException e) {
  24. Thread.currentThread().interrupt();
  25. return false;
  26. }
  27. }
  28. /** 尝试获取锁 */
  29. public boolean tryLock(String key, long waitTime, long leaseTime, TimeUnit unit) {
  30. try {
  31. return redissonClient.getLock(key).tryLock(waitTime, leaseTime, unit);
  32. } catch (InterruptedException e) {
  33. Thread.currentThread().interrupt();
  34. return false;
  35. }
  36. }
  37. /** 释放锁 */
  38. public void unlock(String key) {
  39. RLock lock = redissonClient.getLock(key);
  40. if (lock.isHeldByCurrentThread()) {
  41. lock.unlock();
  42. }
  43. }
  44. public void unlock(RLock lock) {
  45. if (lock != null && lock.isHeldByCurrentThread()) {
  46. lock.unlock();
  47. }
  48. }
  49. /** 是否被锁 */
  50. public boolean isLocked(String key) {
  51. return redissonClient.getLock(key).isLocked();
  52. }
  53. // ==================== 通用 Key-Value ====================
  54. public <T> void set(String key, T value) {
  55. redissonClient.getBucket(key).set(value);
  56. }
  57. public <T> void set(String key, T value, long ttl, TimeUnit unit) {
  58. redissonClient.getBucket(key).set(value, ttl, unit);
  59. }
  60. public <T> void set(String key, T value, Duration ttl) {
  61. redissonClient.getBucket(key).set(value, ttl);
  62. }
  63. @SuppressWarnings("unchecked")
  64. public <T> T get(String key) {
  65. RBucket<T> bucket = redissonClient.getBucket(key);
  66. return bucket.get();
  67. }
  68. public boolean delete(String key) {
  69. return redissonClient.getBucket(key).delete();
  70. }
  71. public boolean exists(String key) {
  72. return redissonClient.getBucket(key).isExists();
  73. }
  74. /** 设置过期时间 */
  75. public boolean expire(String key, long ttl, TimeUnit unit) {
  76. return redissonClient.getBucket(key).expire(ttl, unit);
  77. }
  78. // ==================== 原子操作 ====================
  79. public RAtomicLong getAtomicLong(String key) {
  80. return redissonClient.getAtomicLong(key);
  81. }
  82. public long increment(String key) {
  83. return redissonClient.getAtomicLong(key).incrementAndGet();
  84. }
  85. public long decrement(String key) {
  86. return redissonClient.getAtomicLong(key).decrementAndGet();
  87. }
  88. // ==================== Map 操作 ====================
  89. public <K, V> Map<K, V> getMap(String key) {
  90. return redissonClient.<K, V>getMap(key);
  91. }
  92. public <K, V> void putMapValue(String key, K field, V value) {
  93. redissonClient.<K, V>getMap(key).put(field, value);
  94. }
  95. public <K, V> V getMapValue(String key, K field) {
  96. return redissonClient.<K, V>getMap(key).get(field);
  97. }
  98. // ==================== 限流器 ====================
  99. public RRateLimiter getRateLimiter(String key) {
  100. return redissonClient.getRateLimiter(key);
  101. }
  102. /** 设置限流速率并获取令牌 */
  103. public boolean tryAcquireRateLimiter(String key, long rate, long rateInterval, RateIntervalUnit unit) {
  104. RRateLimiter limiter = redissonClient.getRateLimiter(key);
  105. limiter.trySetRate(RateType.OVERALL, rate, rateInterval, unit);
  106. return limiter.tryAcquire();
  107. }
  108. // ==================== 队列操作 ====================
  109. /** 获取阻塞队列 */
  110. public <T> RBlockingQueue<T> getBlockingQueue(String key) {
  111. return redissonClient.getBlockingQueue(key);
  112. }
  113. /** 入队 */
  114. public <T> boolean offer(String key, T value) {
  115. return redissonClient.<T>getQueue(key).offer(value);
  116. }
  117. /** 出队 */
  118. public <T> T poll(String key) {
  119. return redissonClient.<T>getQueue(key).poll();
  120. }
  121. // ==================== Set 操作 ====================
  122. public boolean sAdd(String key, String value) {
  123. return redissonClient.<String>getSet(key).add(value);
  124. }
  125. public boolean sContains(String key, String value) {
  126. return redissonClient.<String>getSet(key).contains(value);
  127. }
  128. public Collection<String> sMembers(String key) {
  129. return redissonClient.<String>getSet(key).readAll();
  130. }
  131. // ==================== 底层客户端 ====================
  132. public RedissonClient getClient() {
  133. return redissonClient;
  134. }
  135. }