一种对于多台服务器处理定时任务的方法 redis
最近要写一个拉取其他项目数据的定时任务。
最先写了一个,首先查询主表,获取主数据后,循环去拉取子数据。这种方式在同一个定时任务里,超级慢。
果断改成多个定时任务,第一个定时任务获取主数据存表。第二个定时任务查询本地主表数据,循环去拉取。这种方式比在一个定时任务里快很多。
接下来说说线上出现的问题:
在跟进定时任务时,发现:1,数据没有同步完全;2,服务器日志里报请求太频繁。可能是其他项目的防刷机制,后来我想只是一个请求,又是定时的,没有同时操作。
后来发现是多台服务的问题,定时到某个时间点,多台服务器会在毫秒级内一块请求,就算是一个请求也会报频繁。
解决方案:
在定时任务里加锁机制,等某台服务器获取权限,其他服务器将不再执行此次定时任务
if(redisTemplate.opsForValue().setIfAbsent("getsnInfo","11")){ //key的值放什么不重要,重要的是key.所以11或者aa都行。多个定时任务,是多个key,不能set一样的,各管各的定时任务。懂redis的应该都明白 try{ // 业务代码 }catch(){ redisTemplate.delete("getsnInfo"); } redisTemplate.delete("getsnInfo"); }
注意:
异常里和方法结尾,都要加上删除key标识。否则当系统异常退出和正常执行退出时,key还在,未来的定时任务将永远不会被执行。
另外:redistemplate中的setIfAbsent和setnx是一样的意思,都是不存在则set,返回boolean类型,判断是否进入方法体。
看你的redis使用版本和引用是哪种类型,一般都会有这两种。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具