修改redis的redis.conf文件
找到 notify-keyspace-events Ex 这一行 取消行前边的注释 开启键空间失效通知
在SpringBoot项目的pom.xml中导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
在项目中新建Listener 并继承自 KeyExpirationEventMessageListener
@Component @Slf4j public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { @Autowired private OrderService orderService; public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } @Override public void onMessage(Message message, byte[] pattern) { // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key String expiredKey = message.toString(); log.info("------------------redis key 失效; key = " + expiredKey); if (expiredKey.startsWith(GlobalConstant.RedisPrefixKey.ORDER_PREFIX)) { // 获取订单orderNO String orderNo = expiredKey.substring(expiredKey.lastIndexOf(":")+1); // 将待支付的订单改为已取消(超时未支付) orderService.orderPaidTimeout(orderNo); } } }
新建配置类
@Configuration public class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } }
在生成订单的时候要将orderNo作为key放入redis,设置失效时长为30分钟
在订单支付成功或者取消订单后删除redis中的key,不然会出现支付成功或者取消订单后还是超时未支付的情况