1 Star 0 Fork 2

Emotion404 / JavaBooks

forked from 帝八哥 / JavaBooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Redis的key过期事件.md 2.18 KB
一键复制 编辑 原始数据 按行查看 历史
DreamCats 提交于 2020-05-31 10:37 . 提交手撕-项目文档

订单自动取消

如果系统的并发量不是特别高的,或者日访问量不是特别高的话,可以使用Redis的key过期事件,如果访问量过高,还是采用延迟队列吧。

Redis的配置

#
#  notify-keyspace-events Ex
#
#  By default all notifications are disabled because most users don't need
#  this feature and the feature has some overhead. Note that if you don't
#  specify at least one of K or E, no events will be delivered.
notify-keyspace-events "Ex"

RedisListenerConfig配置

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

RedisKeyExpirationListener监听事件

@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Autowired
    private IOrderService orderService;

    /**
     * 监听key过期事件
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        super.onMessage(message, pattern);
        String expiredKey = message.toString();
        log.info("redis key过期:{}",expiredKey);
        String orderCancleKey = RedisConstants.ORDER_CANCLE_EXPIRE.getKey();
        if (expiredKey.startsWith(orderCancleKey)) {
            // 获取订单id
            String[] strings = expiredKey.split(orderCancleKey);
            String orderId = strings[1];
            log.warn("过期订单ID:" + orderId);
            // 得到过期订单。
            // 1。 更改订单状态就完事了
            OrderRequest request = new OrderRequest();
            request.setOrderStatus("2"); // 关闭订单
            request.setUuid(Convert.toLong(orderId));
            orderService.updateOrderStatus(request);
            log.warn("过期订单已处理:" + orderId);
        }
    }
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/Emotion404/JavaBooks.git
git@gitee.com:Emotion404/JavaBooks.git
Emotion404
JavaBooks
JavaBooks
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891