分布式锁是用于解决分布式环境下的并发问题的一种技术,常见的分布式锁实现方式有以下几种:
基于数据库实现分布式锁
基本思路是通过数据库表的唯一性约束来实现锁的效果。在执行业务逻辑前先往数据库中插入一条记录,如果插入成功,则认为获取到了锁,执行完后再删除该记录释放锁。
以下是基于 MySQL 数据库实现分布式锁的示例代码:
public class MysqlDistributedLock {
private static final String LOCK_KEY = "product_123456";
private DataSource dataSource;
public MysqlDistributedLock(DataSource dataSource) {
this.dataSource = dataSource;
}
public boolean acquireLock() {
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("INSERT INTO distributed_lock (lock_key) VALUES (?)")) {
stmt.setString(1, LOCK_KEY);
int rows = stmt.executeUpdate();
return rows > 0;
} catch (SQLException e) {
return false;
}
}
public void releaseLock() {
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("DELETE FROM distributed_lock WHERE lock_key = ?")) {
stmt.setString(1, LOCK_KEY);
stmt.executeUpdate();
} catch (SQLException e) {
// log error
}
}
}
基于缓存实现分布式锁
基本思路是通过缓存中键的唯一性约束来实现锁的效果。在执行业务逻辑前先往缓存中添加一个键,如果添加成功,则认为获取到了锁,执行完后再删除该键释放锁。
以下是基于 Redis 缓存实现分布式锁的示例代码:
public class RedisDistributedLock {
private static final String LOCK_KEY = "product_123456";
private static final int LOCK_EXPIRE_TIME = 3000;
private RedisTemplate redisTemplate;
public RedisDistributedLock(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public boolean acquireLock() {
return redisTemplate.opsForValue().setIfAbsent(LOCK_KEY, "locked", LOCK_EXPIRE_TIME, TimeUnit.MILLISECONDS);
}
public void releaseLock() {
redisTemplate.delete(LOCK_KEY);
}
}
基于 ZooKeeper 实现分布式锁
基本思路是通过 ZooKeeper 的临时节点来实现锁的效果。在执行业务逻辑前先在 ZooKeeper 中创建一个临时节点,如果创建成功,则认为获取到了锁,执行完后再删除该节点释放锁。
以下是基于 ZooKeeper 实现分布式锁的示例代码:
public class ZooKeeperDistributedLock {
private static final String LOCK_PATH = "/product_123456";
private ZooKeeper zooKeeper;
public ZooKeeperDistributedLock(ZooKeeper zooKeeper) {
this.zooKeeper = zooKeeper;
}
public boolean acquireLock() throws KeeperException, InterruptedException {
zooKeeper.create(LOCK_PATH, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
public void releaseLock() throws KeeperException, InterruptedException {
zooKeeper.delete(LOCK_PATH, -1);
}
}
基于 Redisson 实现分布式锁
Redisson 是一个基于 Redis 的 Java 分布式对象服务框架,它提供了多种分布式锁的实现方式,包括可重入锁、公平锁、红锁、读写锁等。
以下是基于 Redisson 的可重入锁实现分布式锁的示例代码:
public class RedissonDistributedLock {
private static final String LOCK_KEY = "product_123456";
private RedissonClient redissonClient;
public RedissonDistributedLock(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
public RLock acquireLock() {
RLock lock = redissonClient.getLock(LOCK_KEY);
lock.lock();
return lock;
}
public void releaseLock(RLock lock) {
lock.unlock();
}
}
以上仅是分布式锁实现方式的简单介绍和示例代码,实际应用中需要根据具体的场景和要求选择合适的实现方式,并进行适当的优化和调整,以保证分布式锁的正确性、性能和可靠性。