由于具体业务场景的需求,需要保证数据在分布式环境下的正确更新,所以研究了一下Java中分布式锁的实现。
Java分布式锁的实现方式主要有以下三种:
数据库实现的乐观锁
Redis实现的分布式锁
Zookeeper实现的分布式锁
其中,较常用的是前两种方式,但是数据库实现方式需要较多的数据库操作,所以最终选择的是用Redis实现分布式锁。
最初考虑分布式锁的数据安全性的时候,只考虑到两点。第一,Redis锁需要有一个超时时间,这样即便某个持有锁的节点挂了,也不到导致其他节点死锁,保证每个锁有一个UniqueId;第二,每个锁需要有一个UniqueId,确保当一个线程执行完一个任务去释放锁的时候释放的一定是自己的锁,否则可能存在一种场景,就是一个线程释放锁的时候,它的锁可能已经超时被释放了,而因为缺少一个UniqueId,它却释放了另一个线程的锁
基于以上两点的考虑,分别设计了获取锁和释放锁的api。
public interface DistributionLockService {
/**
* @param lockName the name of the lock
* @param uniqueCode uniqueCode for the lock
* @param expireTime expire time of lock(MILLISECONDS)
* @ret