分布式锁

为什么需要分布式锁?

  当两个应用(进程)并发修改共享数据时,如何确保数据的一致性?

  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的实现支持有序操作  

 

posted @ 2018-11-27 10:48  陈标  阅读(104)  评论(0编辑  收藏  举报