分布式锁实现原理
1. 分布式锁
假设3个线程访问一个文件资源,对这个文件更新或读取操作,可以通过synchronized或lock进行线程同步,解决多线程情况下并发问题。
但是在分布式架构,都会是多模块独立部署不同机器,多进程情况下,怎么弄?
比如3个系统,订单,发货,结算都要去操作同一个文件
分布式锁
1.通过数据库的方式解决
create table lock(
id
methodname 唯一约束
)
插入一条lock记录或得锁,删除这条lock这条记录,释放锁
1.1 弊端,删除失败,其他的进程都获取不到这个锁了
1.2 不是可重入锁,需要改造
2. 通过zookeeper
2.1 以树形结构存储数据
locks下面插入节点,零时有序节点
2.2 优势
有一个watch会监控节点,一个节点失效,会被删除,会启用用下一个节点
3. 基于redis
3.1 命令setnx,只会在key不存在的情况下为可以设置值,并且返回0或1,存在返回1,谁先设置这个值,谁先获取这个锁