| | |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.StringUtils; |
| | | import java.util.*; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | private final Map<String, ScheduledExecutorService> LOCK_TASK_MAP = new HashMap<>(); |
| | | |
| | | |
| | | |
| | |
| | | redisTemplate.delete(key); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * redis加锁 |
| | | * 加锁 |
| | | * @param key |
| | | * @param value |
| | | * @param time |
| | | * @return |
| | | */ |
| | | public boolean lock(String key, String value, int time){ |
| | | if(!StringUtils.isEmpty(key)){ |
| | | key += "_lock"; |
| | | return redisTemplate.opsForValue().setIfAbsent(key, value); |
| | | public boolean lock(String key, long keepTime, long time){ |
| | | ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key); |
| | | if(null == scheduledExecutorService || scheduledExecutorService.isTerminated()){ |
| | | unlock(key); |
| | | } |
| | | keepTime *= 1000; |
| | | Boolean ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, UUIDUtil.getRandomCode()); |
| | | if(ifAbsent){ |
| | | return addLockMap(key, time); |
| | | } |
| | | long timeMillis = System.currentTimeMillis(); |
| | | while (timeMillis + keepTime > System.currentTimeMillis()){ |
| | | ifAbsent = redisTemplate.opsForValue().setIfAbsent(key, UUIDUtil.getRandomCode()); |
| | | if(ifAbsent){ |
| | | return addLockMap(key, time); |
| | | } |
| | | try { |
| | | Thread.sleep(100); |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 获取redis锁 |
| | | * @param time |
| | | * @return |
| | | */ |
| | | public boolean lock(int time){ |
| | | String uuid = UUID.randomUUID().toString(); |
| | | return lock("redis", uuid, time); |
| | | |
| | | |
| | | private boolean addLockMap(String key, long time){ |
| | | ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key); |
| | | if(null == scheduledExecutorService){ |
| | | scheduledExecutorService = Executors.newScheduledThreadPool(1); |
| | | } |
| | | LOCK_TASK_MAP.put(key, scheduledExecutorService); |
| | | scheduledExecutorService.schedule(()->{ |
| | | redisTemplate.delete(key); |
| | | LOCK_TASK_MAP.remove(key); |
| | | }, time, TimeUnit.SECONDS); |
| | | return true; |
| | | } |
| | | |
| | | |
| | | public boolean lock(String key, int time){ |
| | | String uuid = UUID.randomUUID().toString(); |
| | | return lock(key, uuid, time); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * redis释放锁 |
| | | * @param key |
| | | * @return |
| | | */ |
| | | public boolean unlock(String key){ |
| | | if(!StringUtils.isEmpty(key)){ |
| | | key += "_lock"; |
| | | return redisTemplate.delete(key); |
| | | redisTemplate.delete(key); |
| | | ScheduledExecutorService scheduledExecutorService = LOCK_TASK_MAP.get(key); |
| | | if(null != scheduledExecutorService){ |
| | | scheduledExecutorService.shutdownNow(); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 删除锁 |
| | | * @return |
| | | */ |
| | | public boolean unlock(){ |
| | | return unlock("redis"); |
| | | LOCK_TASK_MAP.remove(key); |
| | | return true; |
| | | } |
| | | |
| | | |