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。因为我这个项目最多同一时段只能挂号三个人、

相关推荐
kaico20187 分钟前
MYSQL的日志文件
数据库·mysql
oMcLin12 分钟前
如何在AlmaLinux 9上优化MariaDB Galera Cluster,提升数据库集群的事务一致性与并发处理能力?
数据库·mariadb
yuankunliu13 分钟前
【redis】1、Redis的安装部署
数据库·redis·缓存
model200515 分钟前
mariadb系统盘迁移数据盘
数据库·mariadb
码农学院40 分钟前
使用腾讯翻译文本
服务器·数据库·c#
@zulnger1 小时前
正则表达式
数据库·正则表达式
源代码•宸1 小时前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover
optimistic_chen1 小时前
【Redis 系列】持久化特性
linux·数据库·redis·分布式·中间件·持久化
Coder码匠1 小时前
从项目实践中学习 Spring 事务范围优化
数据库·spring