十分钟了解分布式锁
分布式锁是什么?它有什么用?
希望阅读完本文,对你能有所帮助。
关于锁,在不同的语言中都有其概念和语法。作用,在多线程运行的情况下,保证同一个资源同一个时间只能被一个线程访问。例如,java中synchronized关键字,lock()等。
分布式锁和上面提到的锁又区别吗?
大同小异,关键在分布式三个字上。
以java中的synchronized关键字为例。
synchronized的作用只针对运行在同一个Java虚拟机(JVM)进程下的多线程才有效。如下所示
一旦线程运行在不同的JVM进程下,就会出现以下情况。
同一个时间,资源可能被不同的线程获取。因为线程运行在了不同的JVM上,所以synchronized就失效了。
以前,访问量少的时候,一台机器足以应对自如。但随着访问量的不断增多,一台不够用了,就需要增加机器。这样,单机就变为了多机,单例就变为了分布式。
这样的情况下,就需要用分布式锁。分布式锁是一种概念,只要满足了其定义,都可以叫分布式锁。
分布式锁,是指在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问。
分布式锁特性:
- 排他性:在同一时间只会有一个客户端能获取到锁,其它客户端无法同时获取。
- 避免死锁:这把锁在一段有限的时间之后,一定会被释放(正常释放或异常释放)。
- 高可用:获取或释放锁的机制必须高可用且性能佳。
常见的分布式锁的实现方式如下:
- Memcached:利用Memcached的add命令。此命令是原子性操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。
- Redis:利用Redis的setnx命令。此命令同样是原子性操作,只有在key不存在的情况下,才能set成功。
- Zookeeper:利用Zookeeper的顺序临时节点,来实现分布式锁和等待队列。
- Chubby:Google公司实现的粗粒度分布式锁服务,底层利用了Paxos一致性算法。
总结
分布式锁和我们常见的锁相比,不是什么深奥的东西,目的都是为了保证对资源访问的安全性。只不过平常的锁由于有效范围的限制,只能用于单机,而分布式锁扩展到了多机。
再次回顾文章开头的那两个问题:分布式锁是什么?它有什么用?
分布式锁:分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问。
分布式锁是一种思想,它画了一个框,里面具体是什么,就需要开发者自己脑洞了。