分布式锁

举报
周杰伦本人 发表于 2022/07/27 13:53:44 2022/07/27
【摘要】 分布式锁 redis分布式锁 zookeeper分布式锁 数据库分布式锁 总结 分布式锁分布式锁是分布式项目中的一个重要的话题,当我们使用传统的java锁锁不住共享资源的时候,就要考虑分布式锁了。那么分布式锁有哪些技术方案呢?我们可以通过redis的分布式锁,比如redis的setxnx命令,还可以使用redisson,第二种技术方案就是使用zookeeper,利用的就是zookeeper...

分布式锁

分布式锁是分布式项目中的一个重要的话题,当我们使用传统的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等等。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。