当前位置: 首页 > news >正文

订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能

如何使用redis实现订单超时实时关闭功能

  • 准备工作
  • 实现步骤
  • 解释
  • 注意事项(重点)

使用Redis实现订单超时实时关闭功能,可以利用Redis的延时队列(使用Sorted Set实现)和过期键(使用TTL和Keyspace Notifications)来实现。以下是一个示例说明如何实现这个功能。

准备工作

首先,需要确保你的Redis服务器已经开启了Keyspace Notifications功能。你可以在Redis的配置文件中设置以下参数,或者在Redis CLI中执行命令:

# 在redis.conf中设置
notify-keyspace-events Ex

或者在Redis CLI中执行:

CONFIG SET notify-keyspace-events Ex

实现步骤

  1. 创建订单并设置过期时间:当用户创建订单时,将订单信息存储在Redis中,并设置一个过期时间(例如30分钟)。

  2. 监听订单过期事件:使用Redis的Keyspace Notifications功能监听订单的过期事件,当订单过期时执行相应的关闭操作。

  3. 处理订单关闭逻辑:在订单过期时,将订单状态设置为已取消,并进行相应的业务处理。

下面是一个简单的Java示例,使用Jedis库来实现:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;public class OrderService {private static final String REDIS_HOST = "localhost";private static final int REDIS_PORT = 6379;private static final int ORDER_EXPIRE_TIME = 30 * 60; // 30 minutes in secondsprivate Jedis jedis;public OrderService() {this.jedis = new Jedis(REDIS_HOST, REDIS_PORT);}// 创建订单public void createOrder(String orderId) {// 存储订单信息到Redis,并设置过期时间jedis.setex("order:" + orderId, ORDER_EXPIRE_TIME, "PENDING");System.out.println("Order " + orderId + " created and will expire in 30 minutes.");}// 监听订单过期事件public void startOrderExpirationListener() {new Thread(() -> {try (Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT)) {jedis.psubscribe(new JedisPubSub() {@Overridepublic void onPMessage(String pattern, String channel, String message) {if (channel.equals("__keyevent@0__:expired")) {handleOrderExpiration(message);}}}, "__keyevent@0__:expired");}}).start();}// 处理订单过期private void handleOrderExpiration(String orderKey) {if (orderKey.startsWith("order:")) {String orderId = orderKey.substring(6);System.out.println("Order " + orderId + " has expired and will be cancelled.");// 更新订单状态为已取消(在实际应用中,这里可以是数据库操作)// updateOrderStatus(orderId, "CANCELLED");}}public static void main(String[] args) throws InterruptedException {OrderService orderService = new OrderService();orderService.startOrderExpirationListener();// 创建一个示例订单orderService.createOrder("12345");// 保持主线程运行一段时间以便观察过期事件Thread.sleep(35 * 60 * 1000);}
}

解释

  1. 创建订单:在 createOrder 方法中,我们将订单信息存储在Redis中,并使用 setex 方法设置订单的过期时间为30分钟。

  2. 监听订单过期事件:在 startOrderExpirationListener 方法中,我们使用 psubscribe 方法监听Redis的过期事件。当订单过期时,Redis会发布一个过期事件,我们可以在 onPMessage 方法中处理这个事件。

  3. 处理订单过期:在 handleOrderExpiration 方法中,我们处理订单过期的逻辑,例如将订单状态设置为已取消。在实际应用中,这里可以是数据库操作。

  4. 运行示例:在 main 方法中,我们创建一个示例订单,并保持主线程运行一段时间以便观察过期事件。

这个示例展示了如何使用Redis实现订单超时实时关闭功能。在实际应用中,你可能需要根据具体需求进行扩展和优化,例如处理并发、错误处理和日志记录等。

注意事项(重点)

== 1.Keyspace Notifications无法实现事件的可靠通知。==
Keyspace Notifications功能是Redis从2.8.0版本开始支持的一项功能,它基于订阅/发布(Pub/Sub)机制,允许客户端接收Redis数据空间中键变化的事件通知‌。
Keyspace Notifications可以监控Redis中的键和值的变化,包括键的过期事件。当库中的键发生改变时,如添加、修改、删除或过期等,订阅了相应事件的客户端可以立即接收到通知。这一功能通过Pub/Sub频道实现,客户端需要订阅特定的频道来感知事件的发生。
值得注意的是,Redis的Pub/Sub功能是“触发后不管(Fire and Forget)”的,即如果发布/订阅的客户端断开连接,然后再重新连接,那么在客户端断开连接的期间内传递的所有事件都会丢失。因此,Keyspace Notifications无法实现事件的可靠通知。不过,Redis的未来版本可能会计划支持事件的可靠通知功能‌。
2.在分布式环境下要注意不能重复处理订单。

相关文章:

订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能

如何使用redis实现订单超时实时关闭功能 准备工作实现步骤解释注意事项(重点) 使用Redis实现订单超时实时关闭功能,可以利用Redis的延时队列(使用Sorted Set实现)和过期键(使用TTL和Keyspace Notifications…...

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品: || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A(TX)连接RX B(RX)连接TX 打开1个网络调试助手,模拟用户的UDP客户端设…...

RabbitMQ快速上手及入门

概念 概念: publisher:生产者,也就是发送消息的一方 consumer:消费者,也就是消费消息的一方 queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理 exchang…...

4种架构的定义和关联

文章目录 **1. 各架构的定义****业务架构(Business Architecture)****应用架构(Application Architecture)****数据架构(Data Architecture)****技术架构(Technology Architecture)*…...

109,【1】攻防世界 web 题目名称-文件包含

进入靶场 直接显示源代码 提示我们通过get方式传递名为filename的参数,同时给出了文件名check.php filenamecheck.php 显示使用了正确的用法,错误的方法 filename./check.php 还是一样的回显 傻了,题目名称是文件包含,需要用到…...

leetcode90 子集II

1. 题意 给一个可能含有重复元素的数组,求这个数组的所有子集。 2. 题解 跟leetcode 72 子集的差别在于,我们需要将重复的元素给去掉。那如何去重呢,实际上我们可以先排序将重复的元素给放在一起。然后在回溯后,找到下一个不与…...

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

PyTorch torch.unbind、torch.split 和 torch.chunk函数介绍

pytorch中 torch.unbind、torch.split 和 torch.chunk等函数可用于张量的拆分操作。 1. torch.unbind 功能说明: torch.unbind 沿指定的维度将张量“解包”为多个张量,返回一个元组。解包后被操作的那个维度会消失,每个输出张量的维度数会比…...

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》061-Vue Router的动态路由

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…...

杭州某小厂面试

问的都是基础知识,主要是三个部分:计网,数据库,java。计网答得挺好,数据答得一般,Java答得一坨。 目录 1.TCP/IP协议的5层模型 2.3次握手和4次挥手 3.操作系统中的进程和线程的区别 4.lunix top 命令看…...

C基础寒假练习(8)

一、终端输入10个学生成绩&#xff0c;使用冒泡排序对学生成绩从低到高排序 #include <stdio.h> int main(int argc, const char *argv[]) {int arr[10]; // 定义一个长度为10的整型数组&#xff0c;用于存储学生成绩int len sizeof(arr) / sizeof(arr[0]); // 计算数组…...

设计模式 ->模板方法模式(Template Method Pattern)

模板方法模式 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义一个操作的算法骨架&#xff0c;而将一些步骤延迟到子类中实现。它允许子类在不改变算法结构的情况下重新定义算法中的某些步骤 特点 算法骨架&#xff1a; 在基类中定义算法的框架延迟实现&…...

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...

MySQL开窗函数种类和使用总结

在 MySQL 中&#xff0c;开窗函数&#xff08;Window Functions&#xff09; 是一种强大的功能&#xff0c;能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入&#xff0c;可以基于数据的某个分组&#xff08;窗口&#xff09;来执行计算&#xf…...

DeepSeek——DeepSeek模型部署实战

摘要 文章主要介绍了DeepSeek大模型的本地部署方法、使用方式以及API接入相关内容。首先指出可通过下载Ollama来部署DeepSeek-R1模型&#xff0c;并给出了模型不同参数版本及存储信息。接着说明了如何通过Chatbox官网下载并接入DeepSeek API&#xff0c;以及如何接入本地部署模…...

zsh: command not found: pip

当你在终端输入 pip install ipykernel 时出现 zsh: command not found: pip 错误&#xff0c;这表明系统无法找到 pip 命令&#xff0c;下面为你详细分析可能的原因以及对应的解决办法。 可能的原因 Python 未安装&#xff1a;pip 是 Python 的包管理工具&#xff0c;若你的…...

机器学习数学基础:16.方程组

一、方程组基础概念 &#xff08;一&#xff09;定义 方程组是由若干个包含未知数的方程组合而成的集合。例如&#xff0c; { 3 x 2 y − z 7 2 x − y 3 z 5 x 4 y − 2 z 3 \begin{cases}3x 2y - z 7\\2x - y 3z 5\\x 4y - 2z 3\end{cases} ⎩ ⎨ ⎧​3x2y−z7…...

即梦(Dreamina)技术浅析(四):生成对抗网络

即梦(Dreamina) 的生成对抗网络(GAN,Generative Adversarial Network)技术是其核心功能之一,用于生成高质量的图像、文本和视频内容。GAN 是一种深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,通过对抗训练的方式不断提升生成内容的质量。 …...

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步&#xff0c;测试方法也在演变。企业需要紧跟新兴趋势&#xff0c;以提升软件质量、提高测试效率&#xff0c;并确保安全性&#xff0c;在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...

Vue混入(Mixins)与插件开发深度解析

Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析 Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析1. Vue混入&#xff08;Mixins&#xff09;核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.

报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符&#xff0c;最后运行&#xff1a;npm run lint --fix...