Redisson常见的问题
redisson的分布式锁是可重入的
redis锁的问题:
1、不是原子操作
设置获取锁和设置锁超时不是原子操作,有可能导致获取锁成功,但是设置锁过期时间失败,这样任务执行会出现不可控的情况。
获取锁 setnx key value
设置锁过期时间 expire key 30
执行业务代码
释放锁
解决方法:用redisson提供的api:lock(long leaseTime, TimeUnit unit),或者直接使用lua脚本。
2、没有释放锁
如果到释放锁这一步项目突然宕机导致锁没有释放,后面的线程都拿不到锁,因此在设置锁时加上锁的过期时间。
3、释放了锁,但业务没有执行完
在redisson中,如果不写分布式锁的过期时间有可能会导致锁释放不掉的问题,
如果写了锁过期的时间,有可能导致锁提前释放,
解决办法:推荐用 tryLock + leaseTime,同时结合业务容错逻辑做保护。
4、释放了别人的锁
第三个问题的延伸:如果A业务的分布式锁提前过期,导致A在释放锁的时候有可能会释放别人的锁。
解决办法:1、释放锁的时间设置要合理。2、加锁时添加一个全局唯一的id,放入锁的key中,释放锁时判断释放的锁是不是自己生成的锁。
5、大量请求竞争锁失败
重试:让该线程自旋,再次重试,重试3-5次还是没有获取到,则返回获取锁失败。
让锁内部的业务代码尽可能的短,快点执行完。
限流。
6、多节点redis主从复制的问题
在cluster模式下(多组redis集群组成的集群),当某一组的主节点宕机,导致加锁失败。
解决办法:使用zk的cp模式(一致性+分区容错性)。
7、锁的性能问题
分段锁:ConcurrentHashMap

浙公网安备 33010602011771号