高性能延时队列应用,这还不会怎么参加面试

redis深度经典面试题 1、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来? 阅读详情

写在最前:(推荐大家阅读一下下啦)

一、延时队列的应用 什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 1、订单成功后,在30分钟内没有支付,自动取消订单 2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。 3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存 4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等 。。。。 上边的这些场景都可以应用延时队列解决。

基于Redis Zset 实现

实现原理

Redis由于其自身的Zset数据结构,也同样可以实现延时的操作。 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加元素时候可以指定,每次指定score后,Zset会自动重新按新的值调整顺序。

  1. 如果score代表的是想要执行时间的时间戳,在某个时间将它插入Zset集合中,它会按照时间戳大小进行排序,也就是对执行时间前后进行排序。
> ZADD delay_queue 1581309229  taskId_1
(integer) 1
> ZADD delay_queue 1581309129  taskId_2
(integer) 1
> ZADD delay_queue 1581309329  taskId_3
(integer) 1
  1. 不断地进行取第一个key值,如果当前时间戳大于等于该key值的socre就将它取出来进行消费删除,就可以达到延时执行的目的。 注意不需要遍历整个Zset集合,以免造成性能浪费。
> ZRANGE delay_queue 0 -1 withscores
1) "taskId_2"
2) "1581309129"
3) "taskId_1"
4) "1581309229"
5) "taskId_3"
6) "1581309329"

使用注意

  • 遍历逻辑,删除逻辑,注意使用 Redis Lua 封装,确保原子性操作。更要注意 Redis Lua 在 Redis Cluster 的伪集群问题。
  • 若是JAVA 语言可以直接使用 redisson,封装了 DelayedQueue 的实现。

源码逻辑 org/redisson/RedissonDelayedQueue.java

Beanstalkd 消息队列

Beanstalkd,一个高性能、轻量级的分布式内存队列系统。支持过有9.5 million用户的Facebook Causes应用。后来开源,现在有PostRank大规模部署和使用,每天处理百万级任务。

部署使用

  • Linux 安装 || docker 部署
yum install beanstalkd

||

docker run -d -p 11300:11300 pig4cloud/beanstalkd
  • 客户端使用,pom 依赖
<!--封装了 官方的 java sdk,只支持 springboot 2.X-->
<dependency>
    <groupId>com.pig4cloud.beanstalk</groupId>
    <artifactId>beanstalkd-client-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</dependency>
  • 默认配置

  • 代码使用
@Autowired
private JobProducer producer;

/**
 * @param delay    是一个整形数,表示将job放入ready队列需要等待的秒数
 * @param ttr      time to run—是一个整形数,表示允许一个worker执行该job的秒数。这个时间将从一个worker 获取一个job开始计算。
 *                 如果该worker没能在<ttr> 秒内删除、释放或休眠该job,这个job就会超时,服务端会主动释放该job。
 *                 最小ttr为1。如果客户端设置了0,服务端会默认将其增加到1。
 * @param priority 优先级 0~2**32的整数,最高优先级是0
 */
@Test
public void testSend() {
	String taskId = "1";// 业务对象信息
    producer.putJob(0, 10, 10, taskId.getBytes());
}
@Component
public class DemoJobConsumer extends AbstractTubeConsumerListener {

    @Override
    public void work(JobConsumer consumer) {
        // 阻塞多少秒获取一次 Job
        Job job = consumer.reserveJob(1000L);

        // 消费此Job
        consumer.deleteJob(job.getId());

        // 执行延时的业务逻辑
        String biz = new String(job.getData());
    }
}

扩展

  • 数据库,利用定时任务轮询实现,业务量大会性能瓶颈。
  • 延时队列的其他实现,比如 rabbitmq 利用ttl特性可以实现。无法取消已放入队列里面的数据,使用时特别注意死信队列的配置等。
  • 还可以自己根据 时间轮片的算法 自行实现 。
  • 总之一切,都要有补偿的逻辑,无论是业务人员手动触发还是自动补偿。
【Java多线程】JUC之并发容器—深入剖析并发队列DelayQueue(六) - **DelayQueue**: 一个`内部使用优先级队列PriorityQueue(二叉小顶堆)`实现**延迟读取** 的`无界阻塞队列`,该队列中每个元素均有*过期时间*,当从队列获取元素时,`只有过期元素才会出队列`。`队列头元素是最块要过期的元素`。**内部使用ReentrantLock和Condition实现。** - 使用**PriorityQueue**来实现队列,所以以`二叉小顶堆`结构维**护元素顺序**,**这样`剩余时间最小的元素就在堆顶`,每次出队其实就是删除剩余时间≤0的最小元 阅读详情

相关推荐

Redis面试题及详细答案100道(71-85) --- 综合篇

本文介绍了Redis在前后端开发中的常见面试题,包括适用场景、项目优势、Java客户端对比及使用示例。主要内容为:Redis适用于缓存、会话存储、计数器等场景;其高性能和丰富数据类型能显著提升系统效率;对比了Jedis、Lettuce等Java客户端的特点和适用场景;详细说明了Jedis的基本使用方法和连接池优化;最后介绍了Redis实现异步队列的原理。文章为开发者提供了Redis技术选型和实践指导。

大剑师兰特的GIS世界 469

【2020面试必备】聊聊高性能延时队列应用

延时队列的应用场景: 下单后,30分钟内未付款就自动取消订单等; 支付后,24小时未评论自动好评; 在我们实际开发过程中,应用场景很多... 基于Redis Zset 实现 实现原理 Redis由于其自身的Zset数据结构,也同样可以实现延时的操作。 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加元素时候可以指定,每次指定...

公众号【Java大蜗牛】 446

用pyqtgraph 和pyqt5绘制股票K线图

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'QWidget_plot.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost!...

qq_23114283的博客 5430

Redisson延迟队列剖析

上篇文章讲到了,使用redisson实现延迟队列,本文主要对其设计原理进行分析。 redisson实现延迟队列,有三个队列组成,其中一个zset类型的延迟队列,另外两个都是list类型的堵塞队列。 整体结构图如下: 一.实例化延迟队列 实例RedissonDelayedQueue操作,主要设置了一些队列名称,以及创建一个任务 protected RedissonDelayedQueue(QueueTransferService queueTransferService, Codec codec, f

起风 2604

CTP接口入门

该文章主要讲什么 这篇文章的面向对象是有一些C++基础,并且想用C++来做程式化交易的同学。 这篇文章可以算是我的程式化学习笔记中的一篇。其中介绍了CTP的简单的使用方式,并且附上了一些代码以及我在试用的时候遇到的一些小坑。 什么是CTP CTP是上海期货推出的一套可供程序调用的交易接口。就好比官方给程序化交易提供了的一个专门的业务窗口。 接口相关文件下载 CTP接口可以在上期...

weizehua的专栏 4万+

PSOC Creator 入门教程超详细

最近工作原因需要使用到赛普拉斯的一款芯片,奈何以前没有用过,所以趁这次也学习了一些简单的用法,总结一下,希望能帮到有需要朋友,因为网上关于这方面的文章少的可怜,详细点的更是少之又少!废话少说,正文开始.

qm_mq的博客 5747

高性能队列——Disruptor

背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。...

美团技术团队 3506

图生文【学习中】

图生文:提供图像,把图像对应的信息用文本描述出来

qq_19072921的博客 1787

通过java的延迟队列(DelayQueue)对数据提交进行性能优化

DelayQueue优化视频网站记录用户播放进度的思路:每次需要记录用户的播放进度时,现将当前进度的数据记录到redis而不是直接放入数据库,保证redis永远保存最新的播放进度数据,同时将当前的进度放入队列中,并设定等待时间为20毫秒。当到达等待时间后,将队列中的进度拿出并对比redis记录的最新播放进度,如果两个记录一致,有一段时间没有向redis提交新记录了,此时可向数据库提交更新,否则说明当前用户仍然在观看视频,无需去数据库更新记录。缓存中的对象,超过了空闲时间,需要从缓存中移出。

2401_84371076的博客 487

ESP32连接OneNet云平台实现多设备联动控制完整示例

通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。

weixin_42360733的博客 548

【面试必备】聊聊高性能延时队列应用

延时队列的应用场景: 下单后,30分钟内未付款就自动取消订单等;支付后,24小时未评论自动好评;在我们实际开发过程中,应用场景很多... 基于Redis Zset 实现 实现原理 Redis由于其自身的Zset数据结构,也同样可以实现延时的操作。Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加元素时候可以指定,每次指定score后...

冷冷的博客 1474

UE5垃圾回收优化实战:定位GC卡顿与内存泄漏

垃圾回收(GC)是Unreal Engine 5中保障UObject内存安全的核心机制,其基于引用图的标记-清除原理决定了性能高度依赖引用结构合理性。当GC频繁触发或单次耗时突增,往往映射出蓝图强引用冗余、C++根对象管理失控或资源生命周期设计缺陷等底层问题。技术价值在于降低主线程阻塞、稳定60帧体验、抑制内存异常增长;典型应用场景包括关卡切换卡顿、UI打开后持续GC、打包后内存不释放等。本文聚焦UE5特有的Full GC模式、UObject生命周期约束及GC触发时机不可见性,提供从蓝图变量规范、TSoft

weixin_31995251的博客 363

面试官灵魂拷问:Redis 如何实现延时队列?有遇到过什么坑吗?

面试官:“你项目中的 Redis 如何实现延时队列?有遇到过什么坑吗?” 这个问题是不是很熟悉?在订单超时取消、任务调度、延迟消息等场景中,延时队列是不可或缺的组件,而 Redis 作为高性能缓存和存储中间件,自然是实现延时队列的热门选择。那么,Redis 到底有哪些方式可以实现延时队列?它们各自的优缺点是什么?哪种方式更适合你的业务场景?Redis 提供了 Keyspace Notifications 机制,可以在 key 过期或被删除时触发通知事件。

pitt1997的博客 1747

[STC32G144K246入门第一步]点亮LED

STC32G144K246是一款高性能32位8051单片机,集成了丰富外设资源,适用于工业控制和复杂算法处理。该芯片支持双模式内核,内置硬件加速器,提供246KB Flash和144KB SRAM存储空间。文章详细介绍了开发环境搭建步骤、寄存器配置方法,并给出了LED驱动示例代码,通过推挽输出控制P42口实现闪烁效果。虽然开发环境相比ARM存在不足,但通过合理配置仍可满足项目需求。该教程为开发者快速上手STC32G144K246提供了实用参考。

sinat_58149788的博客 800

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis延时队列,这次彻底给你整明白了,java面试项目中你遇到的难题

用上面睡眠的办法可以解决问题。同时如果只有 1 个消费者,那么这个延迟就是 1s。如果有多个消费者,这个延迟会有所下降,因 为每个消费者的睡觉时间是岔开来的。 有没有什么办法能显著降低延迟呢? ==================================================================================== 那就是 blpop/brpop。 这两个指令的前缀字符 b 代表的是 blocking,也就是阻塞读。 阻塞读在队列没有数据的时候,会立即进入休眠状

m0_65321095的博客 262

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Redis延时队列,这次彻底给你整明白了,java数据结构面试常见问题

总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友会持续更新**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)[外链图片转存中…(img-7bMFbK3p-1712104944868)]总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友。

2401_83974783的博客 564

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

已拿腾讯后台开发岗 offer,简单说下自己的面试经历和学习路线,2024年最新java软件工程师面试题目汇总

你期望的薪资是多少?去的腾讯滨海大厦面试,大楼的现代化程度很高,不过需要提醒一下的是,腾讯的滨海大厦分为南塔和北塔。没有参与开源项目的经验,工作中做的项目也很一般,项目这块我实在没什么太多拿的出手的,不过还是要挖掘一下,毕竟这一块是逃不掉。一个接口原来有性能问题,比如你做了一个小的优化,将其 TP99 的耗时从原来的 500ms 优化至多少 200ms。如果你做的项目中有复杂的地方,即使不是你做的,也可以拿来说,前提是你要搞得非常清楚来。锁的实现原理 互斥锁,自旋锁 ,乐观锁,悲观锁,分布式锁。

2401_87555420的博客 1184

面试--延迟队列

无

qq_24223159的博客 264

Redis 高级业务实战:排行榜、延时队列、简易消息队列

摘要:本文深入解析Redis三种核心数据结构的实战应用:1)ZSet实现实时排行榜,通过score权重排序支持百万级数据毫秒响应,提供完整Java代码及生产优化方案;2)ZSet构建延时队列,利用时间戳排序特性处理超时任务,配套生产者-消费者实现;3)List与Stream实现消息队列,对比轻量队列与可靠队列的适用场景。文章包含代码实例、生产踩坑经验及选型建议,涵盖排行榜、延时任务、消息队列等高频互联网场景,是中小规模业务的高性能解决方案集锦。

2402_87794035的博客 15

Redis面试题

主题 链接 Java基础知识 面试题 Java集合框架 面试题 Java并发编程 面试题 文章目录什么是RedisRedis有哪些优缺点为什么要用 Redis为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快Redis有哪些数据类型Redis 有哪几种数据淘汰策略?Redis 集群方案应该怎么做?都有哪些方案?什么是缓存穿透?如何避免?什...

qq_26761587的博客 3789

经典高频面试题:使用MQ的时候,怎么确保消息100%不丢失?

一、在使用 MQ 的时候,怎么确保消息 100% 不丢失? 二、怎么解决消息被重复消费的问题? 三、消息积压怎么解决? 四、如何选择消息中间件? 五、延时队列怎么实现?

架构师小冯的专栏 1298

阿里Java岗竟然被redis“虐”了!意外收到面试官突如其来的一个惊喜

前些日子,我信心满满的面试了某大厂的高级后端开发岗位,迎面走来一位干练中年男子,头上真的很亮!!!然后说了句“不好意思,让你久等了”,直接进入正题:看了你的简历,觉得你对redis应该掌握的不错,我们今天就来讨论下redis……”。 Redis是什么 面试官:你先来说下redis是什么吧 我:(心想:总结下redis的定义和特点,这个简单) Redis是一个由ANSI C语言编写,...

xingduan5153的博客 176

【Java八股文】13-中间件面试篇

【Java八股文】13-中间件面试篇

bblb的博客 1591
上一篇: 消息队列面试,面试官连环攻势下你还好吗?
下一篇: 这份“SSM”面试集锦,让你轻松应对框架轰炸
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值