Redis过期监听—订单超时-取消

2023-11-06

最近在做电商项目,涉及支付超时处理的几种方式。【记录哈使用redis监听处理】

提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消。

redis过期监听的实现:

1.修改redis.windows.conf配置文件中notify-keyspace-events的值

默认配置notify-keyspace-events的值为 ""

修改为 notify-keyspace-events Ex 这样便开启了过期事件

2. 创建配置类RedisListenerConfig(配置RedisMessageListenerContainer这个Bean)

package com.zjt.shop.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 作者:zhuLin
 * 日期:2020-08-21 11:48
 * 备注:redis监听配置
 */

@Configuration
public class RedisListenerConfig {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 处理乱码
     * @return
     */
    @Bean
    public RedisTemplate redisTemplateInit() {

        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //val实例化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }

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

}

3.继承KeyExpirationEventMessageListener创建redis过期事件的监听类 

package com.zjt.shop.common.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zjt.shop.modules.order.service.OrderInfoService;
import com.zjt.shop.modules.product.entity.OrderInfoEntity;
import com.zjt.shop.modules.product.mapper.OrderInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * 作者:zhuLin
 * 日期:2020-08-21 11:51
 * 备注:redis数据失效事件
 */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Autowired
    private OrderInfoMapper orderInfoMapper;

    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
      try {
          String key = message.toString();
          //从失效key中筛选代表订单失效的key
          if (key != null && key.startsWith("order_")) {
              //截取订单号,查询订单,如果是未支付状态则为-取消订单
              String orderNo = key.substring(6);
              QueryWrapper<OrderInfoEntity> queryWrapper = new QueryWrapper<>();
              queryWrapper.eq("order_no",orderNo);
              OrderInfoEntity orderInfo = orderInfoMapper.selectOne(queryWrapper);
              if (orderInfo != null) {
                  if (orderInfo.getOrderState() == 0) {   //待支付
                      orderInfo.setOrderState(4);         //已取消
                      orderInfoMapper.updateById(orderInfo);
                      log.info("订单号为【" + orderNo + "】超时未支付-自动修改为已取消状态");
                  }
              }
          }
      } catch (Exception e) {
          e.printStackTrace();
          log.error("【修改支付订单过期状态异常】:" + e.getMessage());
      }
    }
}

4:测试

通过redis客户端存一个有效时间为3s的订单:

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis过期监听—订单超时-取消 的相关文章

  • 带 Java 客户端的键值数据库

    我基本上想在磁盘上存储一个哈希表 以便以后可以查询它 我的程序是用Java 编写的 哈希表从字符串映射到列表 那里有很多键值存储 但经过大量研究 阅读后 尚不清楚哪一个最适合我的目的 以下是一些对我来说很重要的事情 简单的键值存储 允许您使
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • Caffeine Expiry 中如何设置多个过期标准?

    我正在使用 Caffeine v2 8 5 我想创建一个具有可变到期时间的缓存 基于 值的创建 更新以及 该值的最后一次访问 读取 无论先发生什么都应该触发该条目的删除 缓存将成为三层值解析的一部分 The key is present i
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID

随机推荐

  • AT指令(中文详解版)

    AT命令最常见的应用场景 1 智能手机 一般智能手机都是一个主芯片控制一个通信模块 这个通信模块就是一个完整的 简单的手机 包括手机应该有的射频 基带等部分 还有GSM协议栈 完全可以独立打电话 发短信 用GPRS上网等 主芯片实现复杂的应
  • 【GD32篇】新建KEIL工程

    以GD32f103C8T6芯片为例 一 下载MDK5 软件包 下载地址 https www keil com dd2 pack 1 选择工程所需的软件包 2 打开软件包 安装在KEIL5同路径下 3 安装成功后打开keil软件 可查看到自己
  • 经典Hive-SQL面试题及答案

    目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017 1 21 5 u02 20
  • 单片机C语言基础知识-指针篇

    引言 指针是变量在计算机或单片机内所占有的存储区域的地址 C51语言中广泛使用的指针概念是从C语言中继承下来的 利用指针变量不但可以操作各种基本的数据类型 而且能使C51语言像汇编语言一样 具有处理单片机内存地址的能力 地址 指针 指针变量
  • Paramiko远程操作Linux服务器

    在日常工作中我们经常会跟Linux打交道 对于测试同学来说 使用Linux的场景还是比较多的 比如 搭建测试环境 查看日志信息 修改配置文件 监控服务资源等 本篇将介绍一个Python的第三方库Paramiko 使用Paramiko 我们可
  • ChatGPT学python——制作自己的AI模型(一)初步了解

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 引
  • 离线环境下手动安装python环境的依赖包

    在写完python代码之后 想要部署到服务器上 但由于服务器无法连接外网 对应的服务器上也没有代码中用到的包 怎么进行手动安装 正是一件麻烦的事情 现在主要针对这样的情况介绍几种依赖包的手动安装 这里主要介绍flask和jieba的安装 关
  • opencv获取多个摄像头名字和编号

    https blog csdn net hyqwmxsh article details 74479694
  • 房地产不同视角

    author skate time 2012 08 14 房地产不同视角 房地产 你为啥看不懂 一 看现象与看本质 http blog sina com cn s blog 77479d2301015cpk html 房地产 你为啥看不懂
  • KMP例题

    KMP算法 实现两个字符串的匹配 KMP讲解 KMP模板 include
  • MinGW和 MinGW-W64的区别

    部分参照备忘录原文 bitbucket org FrankHB yslib src 50c3e6344a5a24b2382ce3398065f2197c2bd57e doc Workflow Annual2014 txt at master
  • 使用R语言进行柱状图可视化特征的种类和个数

    使用R语言进行柱状图可视化特征的种类和个数 柱状图是一种常用的数据可视化工具 用于展示变量 特征 的种类及其数量 通过柱状图 我们可以更直观地了解数据的分布情况和特征之间的差异 在R语言中 我们可以使用多种方法来创建柱状图 并对特征种类和个
  • 使用Excel实现数据驱动测试

    文章目录 1 概述 2 xlrd 3 openpyxl 4 pandas 5 如何在excel表格中描述多个用例 5 1 制定解析规则 5 2 创建测试用例 1 概述 测试类型 本质 数据类型 接口测试 数据流动和验证 csvyamljso
  • RTX2080ti配置tensorflow gpu版

    tensorflow gpu配置 昨晚搞到1点 终于把tensorflow gpu给配置成功了 之前是交给一位朋友搞的 我也懒得弄 结果还是没搞定 秉着万事靠自己的态度 终于 一边下军旗 一边配置成功了 首先 讲讲我个人的电脑配置 E3 1
  • 有关‘全局唯一id‘

    UUID和Snowflake的对比 当需保证全局唯一的id 可以选用UUID或Snowflake 及其变种 其中UUID 不依赖于任何第三方系统 性能和可用性上较好 Snowflake生成的id具有单调递增性 可以拿到生成时的时间戳信息 能
  • MySQL高级增删改查

    新增数据 基本语法 insert into 表名 字段列表 values 值列表 主键冲突 更新和替换 主键冲突 更新操作 insert into 表名 字段列表 包含主键 values 值列表 on duplicate key updat
  • SqlServer数据库版本不一致使用DROP TABLE IF EXISTS语法报错

    SqlServer数据库版本不一致使用DROP TABLE IF EXISTS语法报错 在SqlServer2016版本及更高版本 建表前判断表是否存在 可以使用 DROP TABLE IF EXISTS sysuser 低版本的SqlSe
  • linux启动停留时间,Ubuntu 16.04 启动长时间停留在紫屏状态

    Ubuntu 16 04 启动长时间停留在紫屏状态 1 Ubuntu 16 04 启动长时间停留在紫屏状态 2 Advanced options for Ubuntu 3 Ubuntu with Linux 4 10 0 28 generi
  • Framework工具——EA画图

    EA 是一个著名的企业架构 Enterprise Architecture 工具 用于绘制和管理企业的架构图和过程模型 该工具提供了多种功能 包括建立业务流程图 数据流图 组织结构图 应用架构图等 EA工具可帮助企业进行战略规划 业务流程改
  • Redis过期监听—订单超时-取消

    最近在做电商项目 涉及支付超时处理的几种方式 记录哈使用redis监听处理 提交订单的时候 支付 超过了有效时间则支付状态自动更新为已取消 redis过期监听的实现 1 修改redis windows conf配置文件中notify key