diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java index 20d1223..92b81c2 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java @@ -94,9 +94,10 @@ public class ESJobSearchImpl implements IESJobSearchService private boolean acquireDistributedLock() throws InterruptedException { long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start < WAIT_LOCK_SECONDS * 1000) { - boolean lockExists = redisCache.hasKey(ES_INIT_LOCK_KEY); - if (!lockExists) { - redisCache.setCacheObject(ES_INIT_LOCK_KEY, "es_init_locked", LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS); + boolean success = redisCache.setIfAbsent(ES_INIT_LOCK_KEY,"es_init_locked", + LOCK_EXPIRE_SECONDS,TimeUnit.SECONDS + ); + if (success) { logger.info("成功获取ES初始化分布式锁,key:{}", ES_INIT_LOCK_KEY); return true; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 44e80d8..fa87989 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -265,4 +265,17 @@ public class RedisCache { return redisTemplate.keys(pattern); } + + /** + * 分布式锁:不存在则设置缓存(原子操作) + * @param key 缓存键 + * @param value 缓存值 + * @param timeout 过期时间 + * @param unit 时间单位 + * @return true=设置成功(获取锁),false=已存在(未获取锁) + */ + public boolean setIfAbsent(String key, Object value, long timeout, TimeUnit unit) { + Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit); + return Boolean.TRUE.equals(result); + } }