1、场景分布式订单服务启动了多个,里面有一个自动检查订单是否超期,然后自动收货的功能,在里面有一个调用加积分的功能,所以如果不采用分布式锁就会执行多次
2、采用redisson解决这个问题
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.10.1</version> </dependency>
3、加配置
@Bean public RedissonClient redissonClient(){ Config config = new Config(); config.useSingleServer().setAddress("redis://"+host+":"+port); config.useSingleServer().setPassword(password); final RedissonClient client = Redisson.create(config); return client; }
4、因为是可重入锁我们不希望释放锁所以代码如下
while (!Thread.currentThread().isInterrupted()) { RLock lock = redissonClient.getLock("lock1"); try { lock.lock(); // System.out.println(Thread.currentThread().getName()+"我在执行"); } catch (Exception e) { e.printStackTrace(); lock.unlock(); }