Redis实现分布式锁2
redisTemplate实现分布式锁
/** * 分布式锁-加锁 * @param key * @param value 当前时间+超时时间 System.currentTimeMillis()+timeout * @return */ public boolean lock(String key, String value) { //SETNX命令, 可以设置返回true, 不可以返回false if (redisTemplate.opsForValue().setIfAbsent(key, value)) { return true; } Object obj = redisTemplate.opsForValue().get(key); //如果锁过期 Long time= (obj !=null) ? Long.parseLong((String)obj) :0; if (time< System.currentTimeMillis()) { Object obj1 = redisTemplate.opsForValue().getAndSet(key, value);//getAndSet 取出旧值,设置新值 Long time1= (obj1 !=null) ? Long.parseLong((String)obj1) :0; if(time1 < Long.valueOf(value)) return true; } return false; } /** * 分布式锁-解锁 */ public void unLock(String key, String value) { try { Object obj = redisTemplate.opsForValue().get(key); String oldVaue= (obj !=null) ? (String)obj : "0"; if (oldVaue.equals(value)) { redisTemplate.opsForValue().getOperations().delete(key); } } catch (Throwable e) { logger.error("[redis分布式锁] 解锁异常, {}", e.getMessage(), e); } }