分布式定时任务用 redis.lock() 实现

本文介绍如何使用Redisson实现Redis加锁,并结合Spring框架的定时任务功能,确保在并发环境下数据的一致性和安全性。通过具体的代码示例,展示了加锁、解锁的方法,以及如何设置锁的有效期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:实现 redis 加锁lock() 类

// 创建 redis 连接
 @PostConstruct
    private void init() {
        Config config = new Config();
        config.useSingleServer().setAddress(redisAddress).setPassword(redisPassword);
        redisson = Redisson.create(config);
        logger.info("Redisson initialized");
    }
// 实现 Redis加锁
   @Override
    public Lock lock(String lockName, long l, TimeUnit unit) {
        RLock rLock = redisson.getLock(lockName);
        if (l == 0 || unit == null) {
            rLock.lock();
            logger.info("locked {}", lockName);
        } else {
            rLock.lock(l, unit);
            logger.info("locked {} {} {}", lockName, l, unit);
        }
        return new LockImpl(logger, rLock);
    }

public static class LockImpl implements Lock {
        private final Logger logger;
        private final RLock rLock;

        LockImpl(Logger logger, RLock rLock) {
            this.logger = logger;
            this.rLock = rLock;
        }


2: 使用 Spring 的定时任务

 @Scheduled(fixedRate = 60000L)
    public void checkAndQueues() throws InternalException {
        checkAndUpdateObjects(QUEUE);
    }

3:实现类内部加锁 ,解锁;

private void checkAndUpdateObjects(String type) throws InternalException {
         加锁时间等于定时任务的间隔时间
        Lock lock = redisService.lock(UPDATE_YUNTAI_DATA + type, 1L, TimeUnit.MINUTES);
        try {
          
		//这里是业务实现类
		
        } finally {
            lock.unlock();
        }
    }

4: 解锁实现类

   public void unlock() {
            rLock.unlock();
            logger.info("unlocked {}", rLock.getName());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值