(三)延时任务篇——通过redis的zset数据结构,实现延迟任务实战

前言

在前一篇内容中我们介绍了如何使用redis key过期失效的监控,完成任务延时关闭的功能,同时官方并不支持使用此种方式实现,由于其安全性较低,存在数据丢失的情况。本节内容是对延迟任务的又一实现方案,通过redis zset的数据结构完成延迟任务。使用一个常量order作为key,订单id作为value值,任务的过期时间作为score值,通过定时任务取前100名的数据,比较score值和当前时间的大小,如果该值小于当前时间,则证明该订单已过期,完成关单的操作,并将该订单数据在redis中删除。

正文

  • 项目集成redis,可参考上一节内容

- 引入redis的pom依赖

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

- 在application.yml中添加redis的配置信息

spring:data:redis:host: 127.0.0.1port: 6379database: 0connect-timeout: 30000timeout: 30000lettuce:pool:enabled: truemax-active: 200max-idle: 50max-wait: -1min-idle: 10shutdown-timeout: 100
  •  创建订单测试接口
    @Operation(summary = "创建订单-redis-zset")@PostMapping("saveOrderByRedisZet")public ApiResponse saveOrderByRedisZet() {String orderId = String.valueOf(IdWorker.getId());stringRedisTemplate.opsForZSet().add("order", orderId, System.currentTimeMillis() + 60000);return ApiResponse.ok();}

  •  开启定时任务,监控订单的状态
package com.yundi.xyxc.tps.job;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.Set;@Slf4j
@EnableScheduling
@Component
public class OrderJob {@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 注意:如果是分布式架构,这里需要使用分布式任务的方式,例如xxl-job或者使用分布式锁+定时任务*/@Scheduled(cron = "0/5 * * * * ?")public void createOrder() {ZSetOperations<String, String> operations = stringRedisTemplate.opsForZSet();//查询过期排名前100的订单Set<ZSetOperations.TypedTuple<String>> top100 = operations.rangeWithScores("order", 0, 99);assert top100 != null;for (ZSetOperations.TypedTuple<String> tuple : top100) {log.info("Member: {}, Score: {}", tuple.getValue(), tuple.getScore());//订单小于当前时间,订单过期,删除该订单if (tuple.getScore() < System.currentTimeMillis()) {log.info("订单过期,删除订单:{}", tuple.getValue());operations.remove("order", tuple.getValue());}}log.info("--------------------------------------------------------------");}}

PS: 此处需要注意的是,如果是分布式系统,此处需要使用分布锁+@Scheduled定时任务,保证数据的安全性,以免产生并发问题。同时需要保证定时任务的执行时间合理根据任务的实际完成时间。

  • 启动项目,通过接口调用订单创建接口

  • 查看关单输出,过期的订单被关单并删除

结语

使用redis的zset数据结构完成延迟任务,相较于监控key失效更加安全,不会出现数据的丢失,同时相较于某些mq消息中间件的延迟对列,更加灵活,可以设置任意时间的延迟过期任务。关于使用redis的zset数据结构,实现延迟任务的内容到这里就结束了。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281541.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

多线程上下文切换:详解与优化

多线程上下文切换&#xff1a;详解与优化 一、什么是多线程上下文切换&#xff1f;二、对性能的影响2.1 优点2.2 缺点 三、优化策略 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、什么是多线程上下文切换&#xff1f; 多线程上下文切…

使用pfld模型进行表盘读数检测

目录 1. 下载项目和数据集2. 配置环境3. 训练和测试3.1 训练3.2 测试 4. 参考 使用pfld模型对压力表进行读表检测 1. 下载项目和数据集 下载项目&#xff1a; git clone https://github.com/zhouayi/pfld.git下载数据集&#xff1a; wget https://github.com/zhouayi/pfld/r…

钢琴模拟器

文章目录 钢琴模拟器代码结构HTML结构CSS样式JavaScript功能 源码效果图 钢琴模拟器 代码结构 HTML结构 <html>: HTML文档的根元素。 <head>: 包含文档的元数据。 <base>: 指定相对URL的基准。 <title>: 指定页面的标题。 <style>: 包含嵌入的…

Linux中进程间通信和理解管道

管道文件为内存及文件&#xff0c;没有名称&#xff08;匿名管道&#xff09; 如何让两个进程看到同一个管道文件&#xff1f; 通过fork创建子进程完成。 匿名管道可以用于父子进程之间的通信。 匿名管道是一个固定大小的缓冲区&#xff0c;写端写满后就会阻塞&#xff0c;…

Python自动发送邮件如何设置邮件内容格式?

Python自动发送邮件时&#xff0c;如何自动化发送HTML格式邮件&#xff1f; Python是一种功能强大且灵活的编程语言&#xff0c;广泛用于各种自动化任务&#xff0c;其中包括自动发送邮件。AokSend将介绍在使用Python自动发送邮件时&#xff0c;如何设置邮件内容的格式&#x…

Mongodb集合操作

文章目录 1、进入容器2、如果数据库不存在&#xff0c;则创建数据库&#xff0c;否则切换到指定数据库3、在 MongoDB 中&#xff0c;创建集合不是必须操作。当你插入一些文档时&#xff0c;MongoDB 会自动创建集合。4、查看数据库列表5、查看集合6、显示创建集合7、删除集合 1、…

创新突破 | OpenCSG发布StarShip CodeReview v1.0.0 Beta版

1. 代码审查很关键但耗时耗力 在软件开发过程中&#xff0c;代码审查是确保代码质量的关键环节。代码审查有助于维护代码标准和发现潜在错误&#xff0c;但也常常耗费大量时间和精力。审查者不仅需要深入理解代码逻辑&#xff0c;还要在繁复的逻辑中识别Bug&#xff0c;这个过…

Python_Flask学习笔记

1.配置 查询字符串的形式传参 app.route(/book/list) def book_list():page request.args.get(page,default1,typeint)return f"您获取的是{page}的图书列表&#xff01;"if __name__ __main__:app.run()3.HTML模版渲染 from flask import Flask,render_templa…

C#知识|对象序列化与反序列化

哈喽,你好啊,我是雷工! 前面练习了将数据存储到TXT文件,今天接着学习对象系列化与XML文件基础的应用, 以下为学习笔记。 01 对象的序列化 序列化是在开发中非常常见的,无论是WinForm开发,还是Web开发都会用得到序列化。 1.1、文本保存对象的缺点 txt文件可以用记事本直…

【p-export-excel】一个轻松实现Excel文件导出的JavaScript插件

p-export-excel&#xff08;github&#xff1a;https://github.com/pbstar/p-export-excel&#xff09;是一个功能强大的JavaScript插件&#xff0c;专门用于导出Excel文件。它支持xlsx和csv两种格式&#xff0c;且提供了丰富的配置选项&#xff0c;允许开发者根据实际需求进行…

贝斯和吉他的区别,怎么打贝斯谱子?一来看看贝斯和吉他的区别,怎么打贝斯谱子的相关内容

在音乐的浩瀚宇宙中&#xff0c;贝斯与吉他作为两大支柱性乐器&#xff0c;虽外观相仿&#xff0c;实则内在差异显著&#xff0c;各自以独特的音色与演奏技法在乐队中发挥着不可或缺的作用。 首先&#xff0c;从音乐功能来看&#xff0c;贝斯以其深沉有力的低音线条&#xff0c…

飞书打卡 快捷指令

使用快捷指令定时飞书打卡 在网上找了一圈&#xff0c;只有钉钉打卡的快捷指令&#xff0c;但是公司换飞书&#xff0c;哪个打工人不怕忘记打卡呢&#xff0c;所以自己研究了一下&#xff0c;其实也很简单。 找url 问题的最关键是打开飞书的打卡界面 如果只是打开飞书APP 很…

iPhone 上的误删的联系人去哪了?如何从 iPhone 上找回联系人的 4 种方法

如果您丢失了所有 iPhone 联系人&#xff0c;那将是一场灾难&#xff0c;因为许多人没有记住电话号码的习惯。iPhone 联系人恢复可以让整个过程变得更容易。如果您仍然对如何在 iPhone 上恢复联系人感到困惑&#xff0c;您可以找到有关 5 个出色解决方案的更多详细信息。只需阅…

C++11 可变参数模板

C11的新特性可变参数模板能够创建可以接受可变参数的函数模板和类模板&#xff0c;相比C98/03&#xff0c;类模版和函数模版中只能含固定数量的模版参数&#xff0c;可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象&#xff0c;使用起来需要一定的技巧&#x…

书面表达优化助手

大家在写文章时肯定被自己的文章写的不够好而烦恼&#xff0c;但是自己又往往看不出问题在哪里&#xff0c;那么有没有一款工具可以根据自己写的文章&#xff0c;给出一个内容优化建议呢&#xff1f; 下面给大家介绍一下书面表达优化助手&#xff0c;它可以根据你的文章给出一个…

已经10岁的K8S,在很多方面仍需努力

/ K8S 已经 10 岁了&#xff0c;但仍然有许多方面要继续努力 / Kubernetes 于 2014 年 6 月推出&#xff0c;自那时起&#xff0c;它在推广云原生应用设计和支持更多微服务部署方面发挥了巨大作用。容器部署的增长非常迅速&#xff0c;而 Kubernetes 对于企业管理这些部署至关重…

FlashAttention解析——大预言模型核心组建

论文名称&#xff1a;FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址&#xff1a;https://arxiv.org/abs/2205.14135 一、研究FlashAttention的Motivate FlashAttention技术在现在的主流大语言模型中均有应用&#x…

Java--多态和抽象类

目录 多态实现多态的条件重写重写和重载静态绑定和动态绑定向上转型和向下转型向上转型向下转型instanceof 抽象类 多态 在Java中多态就是在完成一件事的时候&#xff0c;不同人去完成产生的结果不同 比方说打印&#xff0c;我们就是要打印一个东西&#xff0c;如果我们交给彩色…

性能提升20%,字节跳动HTTPDNS从中心下沉到边缘

摘要&#xff1a;本文介绍了HTTPDNS服务从中心迁移至边缘详细的落地过程。主要内容为&#xff1a; HTTPDNS下沉边缘实践遇到的挑战&#xff0c;包括服务放置、流量调度 HTTPDNS下沉边缘解决方案 从性能、成本出发&#xff0c;谈谈HTTPDNS下沉边缘后的收益 传统的DNS流程中…

微信小程序-获取手机号:HttpClientErrorException: 412 Precondition Failed: [no body]

问题&#xff1a; 412 异常就是你的请求参数获取请求头与服务器的不符&#xff0c;缺少请求体&#xff01; 我的问题&#xff1a; 我这里获取微信手机号的时候突然给我报错142&#xff0c;但是代码用的是原来的代码&#xff0c;换了一个框架就噶了&#xff01; 排查问题&am…