利用redis的setIfAbsent()方法实现分布式锁
在Java中,可以使用Redisson客户端库来实现分布式锁。setIfAbsent
方法可以用来尝试获取锁,如果锁未被占用,则获取并返回true
,否则返回false
。以下是一个使用setIfAbsent
方法实现简单分布式锁的示例:
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import java.util.concurrent.TimeUnit;
public class RedisDistributedLock {
private RedissonClient redissonClient;
private static final String LOCK_KEY = "redlock_lock";
public RedisDistributedLock() {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
redissonClient = Redisson.create(config);
}
public void lockAndExecute(Runnable task, long timeout, TimeUnit unit) {
RLock lock = redissonClient.getLock(LOCK_KEY);
try {
if (lock.tryLock(timeout, unit)) {
try {
task.run();
} finally {
lock.unlock();
}
} else {
System.out.println("Failed to acquire lock");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static void main(String[] args) {
RedisDistributedLock lock = new RedisDistributedLock();
Runnable task = () -> System.out.println("Task executed with lock");
lock.lockAndExecute(task, 5, TimeUnit.SECONDS);
}
}
在这个例子中,RedisDistributedLock
类使用Redisson客户端实现了一个简单的分布式锁。lockAndExecute
方法尝试获取锁,如果成功,执行传入的任务,然后释放锁。如果在指定的时间内无法获取锁,则不执行任务并打印失败信息。
请注意,这个简单的实现没有考虑可重入性、锁释放时的确切性、或者锁的可靠性。在生产环境中,你需要实现这些额外的特性以确保分布式锁的安全性和可靠性。
评论已关闭