一、什么是分布式锁
分布式锁是一种跨进程的,跨机器节点的一种互斥锁。保证在多个机器节点对共享资源访问的一个排他性。
分布式与单机情况下最大的不同在于分布式锁是多进程的而单机锁是单进程多线程的。
二、为什么需要分布式锁
与分布式锁相对就的是单机锁,我们在写多线程程序时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来互斥以保证共享变量的正确性,其使用范围是在同一个进程中。
如果换做是多个进程,需要同时操作一个共享资源,如何互斥呢?
现在的业务应用通常是微服务架构,这也意味着一个应用会部署多个进程,多个进程如果需要修改数据库中的同一行记录,为了避免操作乱序导致脏数据,此时就需要引入分布式锁了。
想要实现分布式锁,必须借助一个外部系统,所有进程都去这个系统上申请加锁。而这个外部系统,必须要实现互斥能力,即两个请求同时进来,只会给一个进程加锁成功,另一个失败。这个外部系统可以是数据库,也可以是Redis或Zookeeper,但为了追求性能,我们通常会选择使用Redis或Zookeeper来做。
三、Redis 分布式锁的一些问题
- 非原子性:加锁和设置锁过期时间操作不能分开使用。可以使用Lua脚本解决异常情况下死锁的问题。
- 忘了释放锁:忘记释放锁会导致死锁。
- 释放了别人的锁:加锁时设置锁的唯一标识。UUID、GUID等。
- 锁重入的问题:加锁后业务代码还没执行完,锁到期了就释放。写一个定时任务,定时执行续锁代码,就是在加锁的时候,另开一个线程调用续锁的代码。