分布式锁的实现思路

所有的实现方式均为简略版,提供的只是一个大致的思路。实际使用以及生产环境下,需要根据情况以及业务逻辑进行设计。
1、简单分布式实现:利用redis的setNX,如果值不存在则设置值并返回1,表示加锁成功。如果值存在则返回0,表示加锁失败;
2、可重入分布式锁:为了使当前线程可以多次获得锁,实现锁的可重入效果,在简单分布式锁的基础上,使用ThreadLocal变量记录当前线程的重入锁次数,每次加锁次数加一,释放锁次数减一。只有当次数减为0,这个锁才会被完全释放;
3、可重入自旋锁实现:部分场景下线程需要争取到锁才能继续进行,这个时候就需要自旋锁。在可重入锁的基础上,增加自选操作while循环不断尝试,只有拿到了锁才退出循环。这种方式对于系统来说并不友好,在没有拿到锁的情况下会持续占用资源。但为了保证逻辑的正确和业务的正常,自旋锁还是有使用的必要。
4、锁的异步续命:在获取到锁之后,由于数据过大、IO太慢、业务过于复杂等情况,锁到了过期时间。对于redis锁,我们必须设置过期时间,避免因为网络波动或者程序异常造成的死锁,导致整个系统崩溃,业务数据崩塌。这种情况下,为了避免锁提前过期,可以使用异步续命方式。新增一个线程用于持续性刷新当前锁的过期时间,直到锁被释放线程才退出。

posted @ 2022-04-11 13:06  不撞南墙  阅读(113)  评论(0)    收藏  举报
Live2D