集群下的分布式锁实现


之前在单机情况下,可以使用synchronized或者lock来锁单个进程,以解决高并发下注入超售的问题。

现在换到了集群情况,有多台服务器,不同服务器都有自己的JVM和线程池,在第一台服务器上使用synchronized或lock锁住的线程1,并不会影响到第二台服务器上线程2的操作,也就是说,超售问题依然存在,我们就需要在此前线程锁的基础上添加分布式锁。

有多种方案选择,Mysql、Redis、ZooKeeper。其中Mysql和ZooKeeper都有很好的安全性,但是性能较差,Redis有良好的性能,但是安全方面只能使用时效来释放锁,这里使用的依然是redis方案。

boolean lock(long time) {
    long threadId = Thread.currentThread().getId();
    Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent("lock", String.valueOf(threadId), time, TimeUnit.SECONDS);
    return Boolean.TRUE.equals(flag);
}

void release() {
    stringRedisTemplate.delete("lock");
}