高并发下的 Redis 分布式锁
redis 使用 setnx 作为分布式锁,多个线程 setnx 调用时,有且仅有一个线程会拿到这把锁,所以拿到锁的执行业务代码,最后释放掉锁。
加大了调用次数,执行业务代码需要一点时间,这段时间拒绝了很多等待获取锁的请求。
假如 redis 服务挂掉了,抛出异常了,这时锁不会被释放掉,出现死锁问题,可以添加 try finally 处理,Redis 服务挂掉导致死锁的问题解决了,但是,如果服务器果宕机了,又会导致锁不能被释放的现象,所以可以设置超时时间为 10s。
如果有一个线程执行需要 15s,当执行到 10s 时第二个线程进来拿到这把锁,会出现多个线程拿到同一把锁执行,在第一个线程执行完时会释放掉第二个线程的锁,以此类推…就会导致锁的永久失效。
所以,只能自己释放自己的锁,可以给当前线程取一个名字,永久失效的问题解决了,但是,如果第一个线程执行 15s,还是会存在多个线程拥有同一把锁的现象。
所以,需要续期超时时间,当一个线程执行 5s 后对超时时间进行续期都 10s,就可以解决了,续期设置可以借助 redission 工具,加锁成功,后台新开一个线程,每隔 10 秒检查是否还持有锁,如果持有则延长锁的时间,如果加锁失败一直循环(自旋)加锁。
版权声明: 本文为 InfoQ 作者【java_wxid】的原创文章。
原文链接:【http://xie.infoq.cn/article/a6757b0a9ce55126039d2b2ce】。文章转载请联系作者。
评论