分布式锁的基本原理
基本概念:
分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
举个例子:
1.假设有一个进程A,每小时准点给用户发送一条短信"Hello world",为了高可用,就必须在多台机器上面部署多个进程,避免宕机的情况
2.假设部署在两台机器,那么问题来了,用户每个小时就会收到两条"Hello world",信息就重复了
3.我们希望只发送一条"Hello world",那么就可以引入分布式锁的概念了,
4.进程A和进程B发送短信前先去注册一个锁,假设进程A抢到了锁,进程B就等待结果,如果发送成功了,那么就B就放弃此次任务,等待下一个小时。
5.问题的核心就在于怎么注册锁,检查锁的存在和注册锁是一个原子性操作,类似mysql的主键,存在则不能insert,就说是你不能把我的锁覆盖了,你得等着
6.我们有多种方式可以实现分布式锁,最简单的就是以每小时准点这个时间作为主键,到mysql写入一条数据,利用数据库来维持一致性
7.当然分布式锁也会存在很多暗坑,不在这里展开。
分布式锁的几种实现:
1.zookeeper分布式锁,基于自增节点
2.redis分布式锁,基于setnx命令,
基于Redis实现分布式锁:http://blog.csdn.net/daiyudong2020/article/details/51760648
官网:http://redis.io/topics/distlock
译文:http://www.oschina.net/translate/redis-distlock
3.memcache分布式锁,基于add函数
这几种方案在网上有很多技术文章,不重复叙述,需要的Google一下
推荐一篇分布式锁的文章:聊聊分布式锁的设计
原文出自:http://blog.csdn.net/daiyudong2020/article/details/51660994
End;