为什么需要分布式锁?
当两个应用(进程)并发修改共享数据时,如何确保数据的一致性?
JDK提供的锁(Synchronize/Lock)仅支持进程内的线程并发,而无法保证进程间的并发。
此时就需要使用分布式锁。
分布式锁的要求:
1、排他性
2、高可用(分布式是高可用的,所有必须具备高性能)
分布式锁的实现方式:
1、基于数据库实现
a、乐观锁,使用版本号version来进行实现。
b、悲观锁,使用for update 来实现,select * from table_name where id = xxx for update; 在InnoDB中,只有id加了索引才会是行级锁,否则为表级锁。当这条语句能获取到记录时,代表获得了锁。
2、基于Redis实现
SET key_name value_text NX PX 100 ; SET语句是原子操作的,上面的语句NX代表只有该key_name不存在时,才进行创建。
3、基于zookeeper的实现
原理是使用zk的临时有序节点来实现分布式锁。
当客户端需要加锁时,就在zk上的某个节点目录下创建一个唯一的临时有序节点,然后判断自己是否就是该节点中序号最小的一个,如果是则获得了锁。如果不是则对序号最小的那个节点调用exist()方法,对其注册监听事件,当节点被删除,再判断一次自己的节点是否是序号最小的那个,依次操作指导能够获取分布式锁。
总结:
由上面三种实现方式,可以推出:仅zk的实现支持有序操作