Redisson 的简单使用(定时清理过期订单)
1. 概述
Redisson 不只是一个 Java Redis 客户端,它是一个以内存 Redis 服务器作为后端的处理 Java 对象(如 java.util.List
, java.util.Map
, java.util.Set
, java.util.concurrent.locks.Lock
等)的一个框架。它也提供了一些高级服务,如 RemoteService 和 SpringCacheManager。Redisson 的目标是提供使用 Redis 的更方便和容易的方式。若你已经使用过其他 Java Redis 客户端,在迁移到 Redisson 过程中Redis命令映射 列表会很有用。
2.Redisson分布式锁的简单用法(定时清理过期订单)
前提需要已安装redis 服务。
POM.xml 增加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.10.6</version> </dependency>
application.yml 文件设置:
spring:
application:
name: Redis Distribute Lock
redis:
host: 192.168.xx.xx
port: 6379
timeout: 20000
password:
server:
port: 8080
RedissonConfig.java
@Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private String port; @Value("${spring.redis.password}") private String password; /** * RedissonClient,单机模式 * @return RedissonClient */ @Bean(destroyMethod = "shutdown") public RedissonClient redisson() { Config config = new Config(); config.useSingleServer().setAddress("redis://" + host + ":" + port); if (StringUtils.isNotEmpty(password)) { config.useSingleServer().setPassword(password); } return Redisson.create(config); } }
RedissonLock.java
tryLock(long var1, long var3, TimeUnit var5) 接收3个参数,第一个指定最长等待时间waitTime,第二个指定最长持有锁的时间 holdTime, 第三个是单位
@Service public class RedissonLock { private static final String REWARD_CARD_LOCK_KEY = "444:lock:%d"; @Resource private RedissonClient redissonClient; @Scheduled(cron = "0/10 * * ? * *") public synchronized void clearOrderTask() { RLock lock = redissonClient.getLock(String.format(REWARD_CARD_LOCK_KEY, 2)); try { //尝试加锁,最多等待3秒,上锁后10秒自动解锁 if (lock.tryLock(3, 10, TimeUnit.SECONDS)){ try { System.out.println("获取锁成功,任务开始!" + LocalDateTime.now()+ ":" + Thread.currentThread()); clearOrder(); } finally { System.out.println("任务结束,释放锁!" + LocalDateTime.now()+ ":" + Thread.currentThread()); lock.unlock(); } } } catch (InterruptedException e) { e.printStackTrace(); } } private void clearOrder() throws InterruptedException { System.out.println("开始清理未支付订单!" + LocalDateTime.now()+ ":" + Thread.currentThread()); Thread.sleep(500); System.out.println("恢复订单库存!" + LocalDateTime.now()+ ":" + Thread.currentThread()); } }