分布式锁
分布式锁
分布式锁是分布式项目中的一个重要的话题,当我们使用传统的java锁锁不住共享资源的时候,就要考虑分布式锁了。那么分布式锁有哪些技术方案呢?我们可以通过redis的分布式锁,比如redis的setxnx命令,还可以使用redisson,第二种技术方案就是使用zookeeper,利用的就是zookeeper的临时顺序节点,第三种技术方案呢就是使用数据库的主键或唯一索引来进行加锁解锁
redis分布式锁
加锁命令:setnx key value nx ex 10s
key可以根据自己的业务进行设置,value可以是随机值,保证全局唯一,nx表示这个key不存在的时候返回成功,否则执行失败,这样保证锁存在的时候不会再次加锁了,ex用来设置key的过期时间,防止程序在运行过程中挂掉后没有释放锁导致死锁,有了过期时间后,即使程序没有主动释放锁,到了过期时间,redis也会让这个key失效从而释放锁。如果当前业务加锁后10s没有执行完自己的业务,key就到期了,其他线程可能会加锁成功,这时候就需要对key进行续期,使用的就是watch dog,删除锁的时候要保证删的是自己的锁,也是在删锁的过程中要对key的value进行比较,一般采用lua脚本来进行释放锁,保证原子性
总而言之,加锁和释放锁都要保证原子性
使用redis做分布式锁的话一般redis都是读写分离的架构,而数据的复制都是异步进行的,在主从切换的时候可能导致部分数据丢失,因为redis保证的是最终的一致性
zookeeper分布式锁
zookeeper分布式锁就是利用的zookeeper的临时顺序节点的特性,客户端执行业务逻辑之前先在zookeeper中创建一个临时顺序节点,然后拿到zookeeper中所有的节点,如果当前节点是最小的就加锁成功,否则就需要等待。释放锁就是把自己创建的临时顺序节点删掉,之所以需要临时接点,是保证连接zookeeper的服务挂掉后及时的删除节点从而释放锁。
zookeeper做分布式锁利用的是临时顺序节点,如果客户端和zookeeper网络发生状况可能导致错误的释放锁,而且如果节点过多,zookeeper集群之间的数据同步也耗时
数据库分布式锁
数据库做分布式锁就是利用主键或唯一索引,保证当前业务添加一条数据后其他业务不能添加同样的数据从而保证加锁成功,释放锁就是删除数据
总结
这篇文章介绍了分布式锁的实现方式,有基于redis分布式锁、基于zookeeper实现的分布式锁和基于数据库来实现的分布式锁,真正在生产中使用的情况还是比较少的,如果用的话会使用基于这些技术封装的框架比如Curator、Seate等等。
- 点赞
- 收藏
- 关注作者
评论(0)