分布式锁 及常见实现

分布式锁

针对单体应用来说,一个JVM运行的进程中,要解决资源共享的情况,可以使用java中的 lock进行加锁解锁、使用synchronized修饰方法,修饰变量,也可以使用volatile来保证原子性等,来保证多线程安全问题。但随着为了保证高并发或者系统容错,一个jar包运行在多台jvm上面的时候,nginx分流后,再去考虑资源共享就要引入分布式锁,分布式锁简单来说就是找到一个多个jvm都去访问的点,以保证多个环境下的互斥。

常见的分布式锁实现:数据库实现、缓存实现、zokeeper实现

数据库实现

实现相对来说,比较容易,就是直接在库中创建一张表,这张表包含方法名 id、method_name、create_time字段,当有线程抢占资源时候,表中insert一条数据,保存访问的哪个方法,相当于这个资源方法被加锁,其他线程去抢占这个锁的时候,会去访问这个表,如果有该方法的一条数据,就表明该锁已经被占有。

分布式锁 及常见实现

常见的几个问题是,不可重入、锁没有失效时间、数据库服务器宕机锁失效等。对于没有失效时间,可以在代码中加入轮询根据创建时间去扫描清除过期的锁。

 

缓存实现

以rediss为例,同数据库类似,其实rediss分布式锁可以考虑使用使用 Redisson 框架,官网:https://redisson.org/, 简单的代码如下,更多学习可以参考官网



RLock lock = redisson.getLock("lock");
  lock.lock();
lock.unlock();

而且rediss可以部署高可用主从集群,放置master宕机,同时redis锁可以保证锁互斥,可重入加锁机制,自动释放锁(reidss expire设置失效时间)等机制。

 

zokeeper实现 

(未完待续)