java利用redis的incrBy和Springboot的Scheduled利用集群进行分布式定时任务分片处理数据每台实例处理对应分片incrBy返回的值代表当前主机要处理的分片的数据实例数根据incrBy的值决定每15分钟定时任务执行一次
实现代码如下:
- 定义RedisUtil类,用于操作redis的incrBy命令
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 将指定的值加上增量delta,并返回最新的值
*
* @param key 键
* @param delta 增量
* @return 最新的值
*/
public long incrBy(String key, long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}
}
- 定义定时任务类,使用@Scheduled注解每15分钟执行一次任务,调用RedisUtil的incrBy方法获取当前主机要处理的分片,根据分片处理数据
@Component
public class MyTask {
@Autowired
private RedisUtil redisUtil;
/**
* 每15分钟执行一次任务
*/
@Scheduled(cron = "0 */15 * * * ?")
public void execute() {
// 获取当前主机要处理的分片
long shard = redisUtil.incrBy("task_shard", 1);
// 获取实例数
int instanceCount = (int) redisUtil.incrBy("task_instance_count", 0);
// 计算当前主机要处理的数据范围
int start = (int) ((shard - 1) * Math.ceil(1.0 * instanceCount / shard));
int end = (int) (shard * Math.ceil(1.0 * instanceCount / shard));
// 处理对应分片的数据
for (int i = start; i < end; i++) {
// TODO 处理数据
}
}
}
- 在SpringBoot的配置文件中配置redis集群
spring.redis.cluster.nodes=node1:6379,node2:6379,node3:6379
spring.redis.cluster.max-redirects=3
- 在启动类上添加@EnableScheduling注解开启定时任务功能
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
``
原文地址: https://www.cveoy.top/t/topic/g0yI 著作权归作者所有。请勿转载和采集!