redis分布式锁
redis分布式锁。
redis单线程理解:
redis操作基于命令,在一个命令执行过程中,其他命令处于等待排队状态。不可能同时执行两个命令。
故redis很适合锁分布式锁
代码:
private static String lockKey = "myLockKey"; /** * value:当前时间ms值 + 超时时间(如3s) * @param jedis * @param value * @return */ public boolean lock(Jedis jedis, String value){ Long result = jedis.setnx(lockKey, value); //添加成功 if(result == 1){ return true; } String oldValue = jedis.get(lockKey); //锁过期 if(!StringUtils.isEmpty(oldValue) && Long.parseLong(oldValue) < System.currentTimeMillis()){ String val = jedis.getSet(lockKey, value); //因为redis是单线程的,这些判断很有必要 if(!StringUtils.isEmpty(val) && val.equals(value)){ return true; } } return false; } /** * * @param jedis * @param value:与获取锁的value一致 */ public void unLock(Jedis jedis, String value){ try{ String old = jedis.get(lockKey); if(!StringUtils.isEmpty(old) && old.equals(value)){ jedis.del(lockKey); } }catch (Exception e){ e.printStackTrace(); } }
setnx:若存在,则不添加,返回0
若不存在,添加成功,返回1
相关推荐
聚合室 2020-11-16
零 2020-09-18
afanti 2020-09-16
savorTheFlavor 2020-10-23
smartbaby 2020-11-11
夙梦流尘 2020-09-23
峰哥 2020-09-23
王道革 2020-11-25
wangdonghello 2020-11-03
Langeldep 2020-11-16
chenhualong0 2020-11-16
koushr 2020-11-12
MRFENGG 2020-11-11
guoyanga 2020-11-10
fackyou00 2020-11-10
Orangesss 2020-11-03
dongCSDN 2020-10-31
rainandtear 2020-10-30
Quietboy 2020-10-30