redis实现未支付时间超时就删除订单,并给前端反应一个已过期

1.创建订单缓存,设置过期时间为一分钟

复制代码
now 是一个表示当前时间的对象,offset 方法用于对当前时间进行偏移。
复制代码
redisTemplate.expireAt(paymentKey, now.offset(DateField.SECOND, 60));

2.创建KeyExpiredListener类并且继承KeyExpirationEventMessageListener,用于监听Redis缓存过期。

在里面实现onMessage来实现键过期进行的回调函数

java 复制代码
 @Override
    @Transactional//修改记录
    public void onMessage(Message message, byte[] pattern) {
        //获取过期数据的Key
        String key = message.toString();
        //判断过期的数据是否为挂号单
        if (key.startsWith("registration_payment_")) {
            //从Key中提取挂号单流水号
            String outTradeNo = key.split("_")[2];
            //更新挂号支付订单状态为4
            medicalRegistrationDao.discardPayment(outTradeNo);
            //出诊计划已挂号人数减去1
            doctorWorkPlanDao.releaseNumByOutTradeNo(outTradeNo);
            //出诊时段已挂号人数减去1
            doctorWorkPlanScheduleDao.releaseNumByOutTradeNo(outTradeNo);

            //删除缓存中的已挂号人数
            //查询挂号单的workPlanId和scheduleId
            HashMap map = medicalRegistrationDao.searchWorkPlanIdAndScheduleId(outTradeNo);
            int scheduleId = MapUtil.getInt(map, "doctorScheduleId");
            int workPlanId = MapUtil.getInt(map, "workPlanId");
            
            key = "doctor_schedule_" + scheduleId;//出诊时间段的缓存
            if (redisTemplate.hasKey(key)) {//存在没有过期
                //更新缓存中已挂号人数的数量减去1
                redisTemplate.opsForHash().increment(key, "num", -1);
            }

        }
        //super.onMessage(message, pattern);
        super.onMessage(message, pattern);
    }

上面是我写的代码,就是过期调用 DAO 层的方法,更新挂号支付订单状态为 4,表示订单已废弃。分别调用 DAO 层的方法,将对应的出诊计划和出诊时段的已挂号人数减去 1。因为我这个项目最多同一时段只能挂号三个人、

相关推荐
随机昵称_1234561 分钟前
postgresql连接报错Invalid SCRAM client initialization
数据库·postgresql
Fuly10241 小时前
langchain基础教程(6)---构建知识库--②向量数据库-milvus
数据库·langchain·milvus
TDengine (老段)1 小时前
TDengine IDMP 产品路线图
大数据·数据库·人工智能·ai·时序数据库·tdengine·涛思数据
二进制_博客1 小时前
redis8.0集群搭建(三主三从)
redis·redis集群搭建·redis8
刺客xs2 小时前
MySQL数据库----通配符,正则表达式
数据库·mysql·正则表达式
赖small强2 小时前
【Linux 内存管理】Linux系统中CPU访问内存的完整机制深度解析
linux·缓存·tlb·内存访问·page table
无限大.2 小时前
计算机十万个为什么--数据库索引
数据库·oracle
IT_Octopus3 小时前
java多线程环境下 安全地初始化缓存(避免缓存击穿),同时兼顾性能 的双重检查锁方案
java·spring·缓存
思成不止于此3 小时前
MySQL 数据操作:增删改核心语法全解析
数据库·笔记·学习·mysql
得物技术3 小时前
数据库AI方向探索-MCP原理解析&DB方向实战|得物技术
数据库