java代码使用redisSion分布式锁控制定时任务在多台服务器上执行具体实现代码
时间: 2023-07-15 14:15:01 浏览: 174
使用 Redis 分布式锁可以实现在多台服务器上控制定时任务的执行,以下是 Java 代码实现:
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class RedisLock {
private static final String LOCK_NAME = "redis_lock"; // 锁名称
private static final int LOCK_EXPIRE_TIME = 60; // 锁过期时间,单位为秒
private static final int SLEEP_TIME = 100; // 睡眠时间,单位为毫秒
private Jedis jedis;
public RedisLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean lock() {
while (true) {
SetParams setParams = new SetParams().nx().ex(LOCK_EXPIRE_TIME);
String result = jedis.set(LOCK_NAME, "locked", setParams);
if ("OK".equals(result)) {
return true;
}
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
public void unlock() {
jedis.del(LOCK_NAME);
}
}
```
在定时任务执行时,先尝试获取分布式锁。如果成功获取到锁,则执行定时任务;否则等待一段时间后再次尝试获取锁。当定时任务执行完毕后,释放锁。
以下是定时任务的代码示例:
```java
import redis.clients.jedis.Jedis;
public class ScheduledTask implements Runnable {
private Jedis jedis;
public ScheduledTask(Jedis jedis) {
this.jedis = jedis;
}
@Override
public void run() {
RedisLock redisLock = new RedisLock(jedis);
if (redisLock.lock()) {
try {
// 执行定时任务
} finally {
redisLock.unlock();
}
}
}
}
```
在多台服务器上执行该定时任务时,需要保证所有服务器连接的 Redis 实例是同一个。这样才能保证分布式锁的正确性。
阅读全文