随笔Java 基于Redis分布式锁
Posted 醇氧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随笔Java 基于Redis分布式锁相关的知识,希望对你有一定的参考价值。
public class RedisCache
@Autowired
private RedisTemplate redisTemplate;
private Map<String, String> randomValueMap = new ConcurrentHashMap();
/**
* 将String类型值存入redis,并设置有效时间
*
* @param key
* @param value
* @param time 有效时间
* @return
*/
public boolean tryLock(String key, String value, long time)
try
String result = redisTemplate.execute(jedis -> jedis.set(key, value, "nx", "ex", time));
if (result == null)
return false;
this.randomValueMap.put(key, value);
return true;
catch (Exception e)
log.error("redis tryLock exception !", e);
return false;
/**
* 分布式锁解锁(原子操作)
*
* @param lockKey
* @return
*/
public boolean unLock(String lockKey)
try
return ((Boolean) this.redisTemplate.execute((jedis) ->
String localLockedValue = (String) this.randomValueMap.get(lockKey);
String lockedValue = jedis.get(lockKey);
if (lockedValue == null)
this.randomValueMap.remove(lockKey);
return Boolean.valueOf(true);
else if (StringUtils.equals(lockedValue, localLockedValue))
if (jedis.del(lockKey).longValue() > 0L)
this.randomValueMap.remove(lockKey);
return Boolean.valueOf(true);
else
return Boolean.valueOf(false);
else
return Boolean.valueOf(false);
)).booleanValue();
catch (Exception e)
log.error("redis unLock exception !", e);
return false;
这种方法是有缺陷的,如果没有显示释放锁,只是依赖Redis超时机制会出现内存泄漏。为什么会这个大家给你评论留言。
以上是关于随笔Java 基于Redis分布式锁的主要内容,如果未能解决你的问题,请参考以下文章