redis分布式锁

匿名 (未验证) 提交于 2019-12-03 00:44:02

简单场景:

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

redis是单线程

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

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

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

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

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

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

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!