两种分布式Redis锁异同

@Slf4j
public class DisLock {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    // 一   RedisTemplate
    public void oneLock(){
        String key = "key-001";
        Long currentTime = System.currentTimeMillis();
        boolean lock = redisTemplate.opsForValue().setIfAbsent(key, currentTime);
        try {
            if (lock) {
                log.info("获取锁成功,开始逻辑处理");
            }else{
                log.info("获取锁失败,业务正在处理中,请稍后");
            }
        }catch (Exception e){
            log.error("系统异常",e);
        }finally {
            if (lock) {
                redisTemplate.delete(key);
                log.info("处理结束,释放锁!");
            } else {
                log.info("没有获取到锁,无需释放锁!");
                Long createTime = (Long) redisTemplate.opsForValue().get(key);
                Long nowTime = System.currentTimeMillis();
                Long time = (nowTime - createTime) / 1000;
                log.info("没有获取到锁,检测获取锁的线程是否处理超时,超时则释放他的锁");
                if (time > 10) {//自定义锁多久自动释放锁
                    redisTemplate.delete(key);
                    log.info("逻辑处理超过20秒,释放锁!");
                }
            }
        }
    }
    //二 jds
    public void twoLock() {
        //基于redis的分布式锁
        String redisKey = "key-001";
        boolean falg = false;
        try {
            Long lock = this.incrBy(redisKey, 1, 10);//一次,超时时间10秒
            if (lock > 1) {
                log.info("请勿重复提交请求");
            }
            log.info("逻辑处理开始。。。。");
        } catch (Exception e) {
            log.error("#accumulatePoints() 出现异常:{}", e);
        } finally {
            if(falg) {
                this.del(redisKey);
            }
        }
    }

    static ShardedJedisPool pool;
    public static Long incrBy(String key, long num, int seconds) {
        ShardedJedis jds = null;
        jds = pool.getResource();
        Long result = jds.incrBy(key, num);
        if (seconds > 0) {
            jds.expire(key, seconds);
        }
        return result;
    }
    public static void del(String key) {
        ShardedJedis jds = null;
        try {
            jds = pool.getResource();
            jds.del(key);
        } catch (Exception e) {
            log.error("#RedisPool() del异常:", e);
            e.printStackTrace();

        }
    }

}

后者,分两步,设置过期时间,会出现过期时间没有设置上,导致永久有效。。。

补充:业务未执行结束,延期

自己定义个线程,进行监控。快过期没有执行完进行延期。

Thread.currentThread() 获取当前线程

Thread.currentThread().start() 获取当前线程运行状态

if (Thread.State.TERMINATED == Thread.currentThread().start() ) {判断线程是否结束

结束解锁 未结束延期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾宝玉的贾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值