redis分布式锁

简单场景:

redis分布式锁

单机模式下:添加synchronized实现同步,分布式环境下不能实现同步

redis分布式锁

redis是单线程

redis分布式锁

问题:假如执行到stringRedisTemplate.opsForValue().set("stock",realStock+");这行出问题,那么后面的stringRedisTemplate.delete(lockKey);没有执行,则会造成死锁

解决方法:添加try...catch,最后finally的时候一定删除键值,释放锁

问题:假如运维在stringRedisTemplate.opsForValue().set("stock",realStock+");这行代码执行的时候kill程序了,finally里面的释放锁又没有执行,又出现死锁了。

解决方法:key值添加超时时间:

redis分布式锁

问题:运行Boolean result=stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"zhuge")后,程序挂掉,stringRedisTemplate.expire(lockKey,30,TimeUnit.SECONDS);这行代码没有执行,则又会出现死锁

解决办法:两句合成一句,执行redis的原子操作,对redis版本有要求

redis分布式锁

问题:设置超时时间10秒,程序运行到stringRedisTemplate.opsForValue().set("stock",realStock+"");花费了10秒

发现锁超时了,容易产生第一个请求会释放第二个请求的锁,第三个请求又能请求了,导致完全没有顺序,造成锁的永久失效

redis分布式锁

解决办法:问题的本质:自己的锁被别人解锁了;

 

上一篇:springboot整合redis


下一篇:springboot整合redis