前言
有些业务需要延迟一定时间后执行,比如订单提交后15分钟未支付就自动关闭,这里只是举个例子。我们可以通过监听redis的key过期事件来实现这个功能。
一、添加依赖
添加redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、配置
配置消息监听容器,把redis连接工厂放进去
@Configuration
public class RedisListenerConfig {
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
三、监听
继承org.springframework.data.redis.listener.KeyExpirationEventMessageListener类,监听过期事件。注意message里的是失效的key,拿不到value。
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
/**
* 针对 redis 数据失效事件,进行数据处理
* @param message key
* @param pattern pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 获取到失效的 key
String expiredKey = message.toString();
log.info("拿到过期的数据:{}", expiredKey);
super.onMessage(message, pattern);
}
}
@Component
public class TimeTaskTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void add(){
redisTemplate.opsForValue().set("key", "value", 30, TimeUnit.SECONDS);
}
}