定时任务中数据库锁的使用

单机定时任务很好解决,可以使用引入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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/nullAndValue/p/9350463.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值