NullToValue

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

单机定时任务很好解决,可以使用引入quartz解决。对于多机分布式定时任务系统可以使用TBSchedule、elastic-job等框架解决。

本文要介绍的是在机器少任务少的情况下的解决方案。比如一个后台项目,只分配了两台服务器。不可能使用其中一台专门做定时任务服务器。

如何解决两机任务分配?

1.思路:在更新事务内,执行select操作谁先获得数据库锁谁先执行,执行完后把信号放到redis.

if(!redisUtil.exist(key)){
   Test test =dao.select(“select * from t_test where id=1”);
     if(!redisUtil.exist(key)){
        //do something ...
    redisUtil.set(key, 1, time);
    }  
}      

 2.直接使用redis

a.使用redis SETNX

    public boolean getRedisLock(String taskName) throws Exception {
            String taskKey = RedisServiceKeyUtil.taskLock(taskName);
            Boolean b =redisTemplate.opsForValue().setIfAbsent(taskKey, "1");
            if(b!=null && b){
                redisTemplate.opsForValue().set(taskKey, "1", 1, TimeUnit.HOURS);
                return true;
            }
           return false;
    }

b.使用redis  INCR 自增序列

    public boolean getRedisLock(String taskName){
        try {
            ValueOperations<String, Long> operations = redisTemplateLong.opsForValue();
            Long i=operations.increment(taskName, 1);
            return Long.valueOf(1).equals(i);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

3.使用 zookeeper

 

posted on 2018-07-22 16:05  NullToValue  阅读(1030)  评论(0编辑  收藏  举报