推荐答案
// www.javascriptcn.com code example
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class DistributedLock {
private static final String LOCK_KEY = "distributed_lock";
private static final String LOCK_VALUE = "locked";
private static final int LOCK_EXPIRE_TIME = 10000; // 10 seconds
private Jedis jedis;
public DistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean tryLock() {
SetParams params = SetParams.setParams().nx().px(LOCK_EXPIRE_TIME);
String result = jedis.set(LOCK_KEY, LOCK_VALUE, params);
return "OK".equals(result);
}
public void unlock() {
jedis.del(LOCK_KEY);
}
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
DistributedLock lock = new DistributedLock(jedis);
if (lock.tryLock()) {
try {
// 业务逻辑处理
System.out.println("Lock acquired, processing business logic...");
} finally {
lock.unlock();
}
} else {
System.out.println("Failed to acquire lock.");
}
}
}本题详细解读
1. 分布式锁的概念
分布式锁是一种用于在分布式系统中控制多个进程对共享资源进行访问的机制。它确保在同一时间只有一个进程可以访问共享资源,从而避免数据不一致的问题。
2. Redis 实现分布式锁的原理
Redis 实现分布式锁的核心思想是利用 Redis 的 SET 命令的 NX 和 PX 参数:
NX:表示只有当键不存在时才能设置成功,即实现互斥锁。PX:设置键的过期时间,防止锁被长时间占用。
3. 代码解析
tryLock()方法:使用SET命令尝试获取锁。如果锁成功获取,返回true,否则返回false。unlock()方法:释放锁,删除 Redis 中的键。main()方法:演示如何使用分布式锁。首先尝试获取锁,如果成功则执行业务逻辑,最后释放锁。
4. 注意事项
- 锁的过期时间:必须设置一个合理的过期时间,防止锁被长时间占用导致系统不可用。
- 锁的释放:确保在业务逻辑执行完毕后释放锁,避免死锁。
- Redis 单点故障:如果 Redis 是单点部署,可能会成为系统的单点故障。可以考虑使用 Redis 集群来提高可用性。
5. 扩展
- Redlock 算法:为了进一步提高分布式锁的可靠性,可以使用 Redlock 算法,该算法通过多个 Redis 实例来实现分布式锁,避免单点故障。
- Lua 脚本:可以使用 Lua 脚本来实现更复杂的锁逻辑,确保操作的原子性。