Redis异步消息队列_redis订阅发布模式无消息时进行休眠-程序员宅基地

技术标签: 延时队列  异步消息队列  Redis  redis  

使用list实现异步消息队列

Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush和lpush操作入队列,使用lpop 和 rpop来出队列。客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。

可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。这就是浪费生命的空轮询。为了解决这个问题,当lpop没有消息的时候,可适当sleep后重试。

睡眠会导致消息的延迟增大。如果只有 1 个消费者,那么这个延迟就是 1s。如果有多个消费者,这个延迟会有所下降,因为每个消费者的睡觉时间是岔开来的。 有没有什么办法能显著降低延迟呢?当然也有,那就是 blpop/brpop。 这两个指令的前缀字符b代表的是blocking,也就是阻塞读。 阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来,消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop,就完美解决了上面的问题。

如果线程一直阻塞在哪里,Redis 的客户端连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用。这个时候blpop/brpop会抛出异常来,因此编写客户端消费者的时候要小心,注意捕获异常。也可以直接使用延时队列解决这个问题

使用发布-订阅模式实现异步消息队列

pub/sub的主题订阅者模式的优缺点:

  • 优点:可实现生产一次消费多次,实现1:N的消息队列。
  • 缺点:在消费者下线的情况下,生产的消息会丢失,需要专业的消息队列如rabbitMQ。

使用ZSet实现延时队列

延时队列可以通过 Redis 的 ZSet(有序列表) 来实现。时间戳为score,消息内容为key,调用zadd来生产消息,消费者用zrangebyscore指令获取数据轮询进行处理

为了保障可用性,也可以使用多个消费者线程用zrangebyscore指令获取数据轮询进行处理。多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理。因为有多个线程,所以需要考虑并发争抢任务,确保任务不能被多次执行。 Redis 的 zrem 方法是多线程多进程争抢任务的关键,它的返回值决定了当前实例有没有抢到任务,因为 loop 方法可能会被多个线程、多个进程调用,同一个任务可能会被多个进程线程抢到,通过 zrem 来决定唯一的属主。 同时,我们要注意一定要对 handle_msg 进行异常捕获,避免因为个别任务处理问题导致循环异常退出。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/TABE_/article/details/123775215

智能推荐

C语言 使用FFT得到信号幅度谱_fft谐波分析程序c语言-程序员宅基地

文章浏览阅读8.3k次,点赞7次,收藏39次。前面的一篇文章我们介绍了使用DFT得到信号的幅度谱的方法,现在我们来看一下FFT实现信号幅度谱。这里我们使用的FFT源程序是徐士良老师的C语言算法程序——快速傅里叶变换。另外,本文也会对DFT以及FFT实现信号幅度谱计算时,所需要的计算量以及花费的时间进行比较。1.FFT原理FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法,也就是快速傅里叶变换..._fft谐波分析程序c语言

CentOS8安装Memcached数据库_centos8安装memcache目录-程序员宅基地

文章浏览阅读835次。想要学习分布式,所以选择从memcached数据库开始入手,在做学习的准备工作时,一定要先学会如何配置和安装Linux系统和memcached数据库。Linux版本本人采用了CentOS系统,并且是最新版本的centos8。对于一个Linux和分布式小白来讲,在安装memcached数据库的时候突然出现无可预料的错误,真的是措手不及。 下面我将描述一下如何使用CentOS8系统进行memcached数据库的安装以及遇到问题的解决方法。1、先进入到Linux系统的/usr/local/src/文件..._centos8安装memcache目录

PPP/PPPOE源码阅读笔记_ppp_start_xmit+0x1a4/0x228-程序员宅基地

文章浏览阅读4.1k次,点赞9次,收藏35次。一.缘起 本人工作与网关产品有关,经常会接触到pppoe协议,但对ppp和pppoe是如何实现的不甚了解。在网上查找相关的文章大多是描述ppp/pppoe协议的具体内容和数据流大的流程,而未过多的涉及内核中pppoe驱动和ppp驱动代码实现的细节,正好这段时间在看毛德操和胡希明老师的《Linux内核源代码情景分析》,看了内核中的终端驱动,遂决定仔细学习一下PPP/PPPOE驱动这一..._ppp_start_xmit+0x1a4/0x228

主流的CPU架构_cpu体系架构-程序员宅基地

文章浏览阅读1.1w次,点赞14次,收藏53次。主流CPU架构_cpu体系架构

jzoj3692. 【SRM 611】ElephantDrinking-程序员宅基地

文章浏览阅读205次。题目描述Description这里有一个n*n 的平原,其中一些格子有泉水。你会得到一个string 字符串组,作为地图被用于描述平原。string 有n 个字符串,每个字符串长度为n,每个字符为0 到9 的数字。数字0 代表这个格子没有水;数字1 到9 代表泉水,并且数字为泉眼出水的速率。例如,数字5 表示一个每单位时间产生5 单位水的泉水。平原周围有4n 头大象:绕着平原的边缘,每一格边...

7,城市气候与海洋的关系研究-程序员宅基地

文章浏览阅读456次。导入包import numpy as npimport pandas as pdfrom pandas import Series,DataFrameimport matplotlib.pyplot as plt%matplotlib inline# 设置显示汉字import sysreload(sys)sys.setdefaultenco..._(1)分析城市气温与海洋距离的关系,并画图显示

随便推点

Practical_RichFaces要点Chapter05 (二)_rich:suggestionbox能使用回车对象吗-程序员宅基地

文章浏览阅读2k次。Chapter05 InputComponents (2) 昨天对于rich:的输入类控件还存有几个疑问,今天用几个小例子,试了一下,清楚了不少。特补充进来,以防忘记。 1. 的onXXXXXX类属性 1) 这些属性包_rich:suggestionbox能使用回车对象吗

深度学习环境搭建入门环境搭建(pytorch版本)_深度学习pytorch搭建-程序员宅基地

文章浏览阅读474次,点赞3次,收藏3次。本文介绍了如何从零开始如何搭建深度学习环境的过程。先是介绍了Anaconda的安装,这是一个用于创建Python虚拟环境的工具,使环境管理更加便捷。接下来是PyCharm的安装,这是一个Python集成开发环境,适用于编码和项目管理。同时请关注显卡驱动、Python版本、深度学习框架版本和CuDNN版本之间的兼容性,还介绍了Jupyter Notebook,一种交互式编程环境,用于实验和笔记,并且讨论了在GitHub上创建代码库和协同工作的过程。_深度学习pytorch搭建

【Excel】用excel生成矩阵_excel 共现矩阵-程序员宅基地

文章浏览阅读1.3w次。1、使用sql语句生成group by数据,复制到Excel Sheet中例如A B 3B D 4C A 2D B 12、创建新sheet,粘贴上述数据到新sheet2.1 分别选中第一列、第二列,进行操作:数据--》删除重复项,得到矩阵的横坐标和纵坐标的数据2.3 制作矩阵的坐标轴:复制第二列数据,右键单元格:选择性粘贴--》转置2.4 生成数据,例如_excel 共现矩阵

【ESP8266-01】MQTT连接百度云-进阶(物可视)_百度云物可视-程序员宅基地

文章浏览阅读4.7k次。上一章 【ESP8266-01】MQTT连接百度云(天工物接入)ESP8266-01 MQTT连接百度云-进阶(物可视)前言前边我们讲了MQTT连接百度云了,也学会了如何上传数据,那么我们要玩一些更高大上的,让这些数据用模型替代出来,同时看起来也更加的美观,就像下图所示。好了,本章节我们就来学习如何让数据可视化起来。1.创建工程1.1 打开“物联网数据可视化”1.2 创建工作区工作区的名称自行命名;我这里命名为“hello”;1.3 创建仪表盘为仪表盘命名,下边有多个模板可以选择_百度云物可视

蒙特卡洛算法及简单应用_给定曲线和曲线,曲线的交点为:、。曲线围成平面有限区域,用蒙特卡罗方法计算区域-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏69次。基本概念蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。基本思想:当所求问题的解是某个事件的概率,或者是某个随机变量的数学期望,_给定曲线和曲线,曲线的交点为:、。曲线围成平面有限区域,用蒙特卡罗方法计算区域

java 调用 rar压缩文件-程序员宅基地

文章浏览阅读385次。[code="java"]public static boolean winrar(String winrarfile, String foler) { //winrar软件的安装路径 String rarPath = "C:\\Program Files\\WinRAR\\WinRAR.exe"; String cmd=""; // cmd=r..._java调用winrar提示未知选项mx10385760