修改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,不然會出現支付成功或者取消訂單后還是超時未支付的情況