redis锁+@Scheduled
时间: 2023-10-17 16:34:04 浏览: 88
redis倒计时商品订单状态
您好!对于使用Redis实现锁的问题,可以结合@Scheduled注解来定时执行任务。接下来,我将为您提供一个示例代码,用于演示如何在Spring Boot中使用Redis实现定时任务和锁。
首先,确保您的Spring Boot项目中引入了Redis的依赖。然后,您可以使用以下代码片段作为参考:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledTask {
private static final String LOCK_KEY = "myLock";
@Autowired
private StringRedisTemplate redisTemplate;
@Scheduled(fixedDelay = 1000) // 每隔1秒执行一次任务
public void scheduledTask() {
// 获取锁
boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(LOCK_KEY, "locked");
if (lockAcquired) {
try {
// 执行任务
System.out.println("执行任务...");
// ... 具体的业务逻辑
} finally {
// 释放锁
redisTemplate.delete(LOCK_KEY);
}
} else {
// 锁被其他线程占用
System.out.println("锁被其他线程占用,任务未执行");
}
}
}
```
在上述代码中,我们定义了一个名为`MyScheduledTask`的组件,并使用`@Scheduled`注解将`scheduledTask`方法标记为定时任务。在方法内部,我们使用Redis的`setIfAbsent`方法尝试获取锁,如果成功获取到锁,则执行具体的任务逻辑;如果未能获取到锁,则任务不会执行。
请注意,上述代码中的`StringRedisTemplate`是Spring Data Redis提供的一个简化版模板,用于操作Redis字符串类型数据。您可以根据实际需求使用其他Redis客户端或模板。
希望这个示例对您有所帮助!如有任何疑问,请随时提问。
阅读全文