Redis实现分布式锁之防止误删非自己的锁
在为获取到锁,从而进行循环时,可能会出现,删除其他线程的锁的问题,即误删,
所以需要对代码使用lua脚本进行修改
修改前代码
//基于 Redis 实现分布式锁 public void testLock() { //加锁 String uuid = UUID.randomUUID().toString(); //对自己的锁进行添加UUID从而在删除时通过对比UUID来判断是不是自己的锁, Boolean lock = this.redisTemplate.opsForValue().setIfAbsent("lock", uuid,3,TimeUnit.SECONDS); //setIfAbsent 对应 setnx,只能设置为空的key if (!lock){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } this.testLock(); }else{ //设置过期时间 //this.redisTemplate.expire("lock",3,TimeUnit.MILLISECONDS); //获取锁,执行业务操作 String num = this.redisTemplate.opsForValue().get("num"); if (StringUtils.isBlank(num)){ this.redisTemplate.opsForValue().set("num","1"); return; } int i = Integer.parseInt(num); this.redisTemplate.opsForValue().set("num",String.valueOf(++i)); //释放锁 if (StringUtils.equals(uuid,this.redisTemplate.opsForValue().get("lock"))){
//虽然可以通过UUID判断是不是自己的锁,如果刚判断是自己的锁,但是在判断之后,删除之前,锁过期了,依旧会删除其他的锁,所以还需要保证原子性,然而jdk未提供,所以需要使用lua脚本来实现 this.redisTemplate.delete("lock"); } } }

浙公网安备 33010602011771号