redisson 分布式锁 waitTime 小坑

maven 依赖

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>2.9.0</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-avro</artifactId>
  <version>2.9.0</version>
</dependency>

RedissonManager 分装初始化

@Component
@Slf4j
public class RedissonManager {

    private Config config = new Config();

    private Redisson redisson = null;

    public Redisson getRedisson() {
        return redisson;
    }

	// 从配置文件里获取 redis 的 ip 和端口
    private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip");
    private static Integer redis1Port = Integer.parseInt(PropertiesUtil.getProperty("redis1.port"));

    @PostConstruct
    private void init() {
        try {
            config.useSingleServer().setAddress(new StringBuilder().append(redis1Ip).append(":").append(redis1Port).toString());
            redisson = (Redisson) Redisson.create(config);
            log.info("初始化Redisson 结束");
        } catch (Exception e) {
            log.error("Redisson init error",e);
        }
    }
}

redisson 分布式锁 业务编码

    @Autowired
    private RedissonManager redissonManager; // 注入 RedissonManager 

    @Scheduled(cron = "0 */1 * * * ?")// 每 1 分钟执行一次 (1 分钟的整数倍)
    public void closeOrderTaskV4() {

        RLock lock = redissonManager.getRedisson().getLock(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
        boolean getLock = false;
        try {
        	/**
             * tryLock 里的第一个参数 waitTime 要设置成为0,否则或导致两个线程都会获取到锁,这是不行的,
             * 设置为 0 让各个线程去竞争获取锁,不要等待
             */
            if (getLock = lock.tryLock(0, 50, TimeUnit.SECONDS)) {
                log.info("Redisson 获取到分布式锁:{},ThreadName:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK, Thread.currentThread().getName());
                 /**
	             *  竞争获取到了锁,执行相关的业务逻辑,这里是 定时器关闭超时订单
	             */                       
                int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.out", "2"));
				iOrderService.closeOrder(hour);
			   
            } else {
                log.info("没有获取到分布式锁:{}", Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
            }
        } catch (InterruptedException e) {
            log.error("Redisson 获取分布式锁异常",e);
        }finally {
            if (!getLock) {
                return;
            }
            lock.unlock();
            log.info("Redisson 分布式释放锁");
        }

    }

   // 省略其他代码
发布了41 篇原创文章 · 获赞 25 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Andy86869/article/details/88970672
今日推荐