分布式锁的实现

 但考虑到,可能在业务执行时间长的情况下,正好锁的存活时间超时了,那么线程2有可能也获取到锁了,然后线程一执行完所有任务后,remove key(锁),导致把线程2的锁误删了,这就很严重。

有人说,可以在删除前get key,对比锁的值是否相等,但一般情况下redis的 get 和remove是分开执行的,中间的时间间隔还是会出现上面说的误删情况,所以可以使用lua脚本,redis 执行lua脚本也是原子的,所以更合适.

private static final Long lockReleaseOK = 1L;
static String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";// lua脚本,用来释放分布式锁

public static boolean releaseLock(String key ,String lockValue){
	if(key == null || lockValue == null) {
		return false;
	}
	try {
		Jedis jedis = getJedisPool().getResource();
		Object res =jedis.eval(luaScript,Collections.singletonList(key),Collections.singletonList(lockValue));
		jedis.close();
		return res!=null && res.equals(lockReleaseOK);
	} catch (Exception e) {
		return false;
	}
}

当然redis实现分布式锁不是完美的,假设在主从节点情景下,redis master同步数据到从库,中途有很小延迟,也会少见出现获取锁不正常问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值