zoukankan      html  css  js  c++  java
  • 一种对于多台服务器处理定时任务的方法 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中的setIfAbsentsetnx是一样的意思,都是不存在则set,返回boolean类型,判断是否进入方法体。

              看你的redis使用版本和引用是哪种类型,一般都会有这两种。

  • 相关阅读:
    今天学会了如何察看SSDT里面的东西、修改里面的地址
    今天。。。。忙了一天
    我承认,我怕,我很怕
    WinCE下的第二个窗口程序
    终于搭好了WinCE上MFC的SDK环境
    原来腾迅的QQ号竟然是个int变量
    操了,编译器,你就不能少给我下几个断么
    谁能教我网络编程阿
    反汇编。。。本来以为很难,原来却这么容易
    PE头里的东西更多。。。越看越恶心了,我都不想看了
  • 原文地址:https://www.cnblogs.com/sunnyguo/p/12418955.html
Copyright © 2011-2022 走看看