博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis 分布式锁 解决集群环境下多次定时任务执行
阅读量:4921 次
发布时间:2019-06-11

本文共 2148 字,大约阅读时间需要 7 分钟。

1、设置分布式锁

/**     * 设置redis 分布式锁     * @param lockName     * @param acquireTimeout     * @param lockTimeout     * @return     */    public String acquireDistributedLockWithTimeout(String lockName, long acquireTimeout, int lockTimeout) {        String lockValue = UUID.randomUUID().toString();        String lockKey = "lock:" + lockName;        long acquireTime = System.currentTimeMillis() + acquireTimeout;        ValueOperations ops = this.redisTemplate.opsForValue();        while(acquireTime > System.currentTimeMillis()) {            boolean locked = ops.setIfAbsent(lockKey, lockValue);            if (locked) {                this.redisTemplate.expire(lockKey, (long)lockTimeout, TimeUnit.SECONDS);                return lockValue;            }            try {                TimeUnit.MILLISECONDS.sleep(1L);            } catch (InterruptedException var12) {                Thread.currentThread().interrupt();            }        }        return null;    }

2、释放redis分布式锁

/**     * 释放redis锁     * @param lockName     * @param lockValue     * @return     */    public boolean releaseDistributedLock(String lockName, String lockValue) {        String lockKey = "lock:" + lockName;        List result = null;        ValueOperations ops = this.redisTemplate.opsForValue();        do {            this.redisTemplate.watch(lockKey);            if (!Objects.equal(lockValue, ops.get(lockKey))) {                break;            }            this.redisTemplate.delete(lockKey);        } while(result == null);        this.redisTemplate.unwatch();        return true;    }

3、定时逻辑

     //集群环境 定时任务加锁,保证执行一次 异常情况6个小时 释放锁        String lock = redisService.acquireDistributedLockWithTimeout("incomeStatistics", 10, 60*60*6);        //判断是否获得锁        if(StringUtils.isNotBlank(lock)){            logger.info("定时任务 开始执行");            try{                //业务逻辑                                            }catch (Exception e){               //异常处理            }            finally {                //释放锁                redisService.releaseDistributedLock("incomeStatistics",lock);            }        }

 

转载于:https://www.cnblogs.com/yi1036943655/p/11512869.html

你可能感兴趣的文章
SQL 行转列
查看>>
对CSS中的Position、Float属性的一些深入探讨
查看>>
前端UI
查看>>
喵哈哈村的括号序列
查看>>
把excel数据导入mysql中
查看>>
linux内核——进程切换宏switch_to
查看>>
后面需要继续完善的地方
查看>>
SQL Server 用链接服务器 同步SqlServer与MySQL
查看>>
外星人入侵
查看>>
单调栈
查看>>
zepto源码--核心方法2(class相关)--学习笔记
查看>>
将16进制的颜色转为rgb颜色
查看>>
POJ 2182 Lost Cows (树状数组 && 二分查找)
查看>>
Matlab中界面和注释---中英文切换问题
查看>>
主板维修技术
查看>>
PHP实现四种基本排序算法
查看>>
企业级应用,如何实现服务化四(基础环境准备)
查看>>
Code::Blocks
查看>>
CBitmap,HBitmap,Bitmap区别及联系
查看>>
debian 系统备份
查看>>