MCPcopy Create free account
hub / github.com/cool-team-official/cool-admin-java / CoolLock

Class CoolLock

src/main/java/com/cool/core/lock/CoolLock.java:18–108  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

16import org.springframework.stereotype.Component;
17
18@Component
19@RequiredArgsConstructor
20public class CoolLock {
21 // 缓存类型
22 @Value("${spring.cache.type}")
23 private String type;
24
25 @Value("${cool.cacheName}")
26 private String cacheName;
27
28 private final CacheManager cacheManager;
29 private RedisCacheWriter redisCache ;
30
31 // 非redis方式时使用
32 private static final Map<String, Lock> lockMap = new ConcurrentHashMap<>();
33
34 private static final String LOCK_PREFIX = "lock:";
35
36 @PostConstruct
37 private void init() {
38 this.type = type.toLowerCase();
39 if (type.equalsIgnoreCase(CacheType.REDIS.name())) {
40 redisCache = (RedisCacheWriter) Objects.requireNonNull(cacheManager.getCache(cacheName))
41 .getNativeCache();
42 }
43 }
44 /**
45 * 尝试获取锁
46 *
47 * @param key 锁的 key
48 * @param expireTime 锁的过期时间
49 * @return 如果成功获取锁则返回 true,否则返回 false
50 */
51 public boolean tryLock(String key, Duration expireTime) {
52 String lockKey = getLockKey(key);
53 if (type.equalsIgnoreCase(CacheType.CAFFEINE.name())) {
54 Lock lock = lockMap.computeIfAbsent(lockKey, k -> new ReentrantLock());
55 return lock.tryLock();
56 }
57 byte[] lockKeyBytes = lockKey.getBytes();
58 // 使用 putIfAbsent 来尝试设置锁,如果成功返回 true,否则返回 false
59 return redisCache.putIfAbsent(cacheName, lockKeyBytes, new byte[0], expireTime) == null;
60 }
61
62 /**
63 * 释放锁
64 */
65 public void unlock(String key) {
66 String lockKey = getLockKey(key);
67 if (type.equalsIgnoreCase(CacheType.CAFFEINE.name())) {
68 Lock lock = lockMap.get(lockKey);
69 if (lock != null && lock.tryLock()) {
70 lock.unlock();
71 lockMap.remove(lockKey);
72 }
73 return;
74 }
75 redisCache.remove(cacheName, lockKey.getBytes());

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected