用redis阻塞队列,实现消息传递

延时任务定时发布,基于 Redis 与 DB 实现 没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件,任务可以立即执行,也可以延迟。订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单;如果期间下单成功,则任务取消。接口对接出现网络问题,1分钟后重试,如果失败,2分钟重试,直到出现阈值终止。有固定周期的,有明确的触发时间。 阅读详情

在网络服务器运行的时候,可能会碰到这样的需求,主程序处理会很耗时,

           1,网络流量很大,但有紧急情况需要发送邮件通知别人,这时如果在程序中发送邮件,将会很费时,

               但又必须做

           2,处理客户端请求后,剩下的事情跟正常逻辑没有关系,但有些耗时的操作需要完成

遇到这样的情况,可以有几种办法:

           1,开一个线程跑这些数据,主程序继续处理其他的任务

           2,用redis阻塞队列,将消息传到队列中,其他的事情由别的程序来重redis中读取队列中的消息,

               并进行处理


1,开一个线程处理:

           如果这样的操作很多的话,对程序影响很大的,因为每次涉及到线程资源的申请和销毁,这些都

           要占用一些主程序时间,并且这样破坏了主要逻辑的流程

2,用redis的阻塞队列实现:

           先说一下环境:处理客户端请求用php,处理redis的消息队列用python脚本

           实现方法:由php向redis中写人的队列写入消息,由python脚本读redis中的队列中的消息,可能

                               有朋友会考虑说让python这样一直跑不也占系统资源吗,但redis中有一个阻塞队列,

                               使用该方法,当python读取队列 的时候,如果为空,则阻塞,如果有消息,则唤醒并

                               执行,效果很好

           补充:

                     redis中,python调用的一个方法为blpop(key, timeout) 

                     当把timeout致为0时表示永久不超时,这样的话,这个python进程就是类似一个监听进程,

                      当有消息的时候他就努力工作,没有的时候就看着

示例代码:

                    

#! /usr/bin/python
#-*- coding:utf-8 -*-
#Filename: hh.py
#Author: xiaobing
#E-mail: xiaobingzhang29@gmail.com
#Date: 2013-11-26
#Description: 
import redis
import sendgrid
class Sendmess():

    def __init__(self):

        self.redis = redis.Redis(host= 'localhost', port=6739, password = 'ps', db= 0)
        self.queue = 'messagequeue'

    def sendmess(self):
        """接收消息message,并发送邮件
                
           邮件信息格式:
           message形式为:             
           to=mailaddr&title=mailtitle&plainContent=plaincontent&htmlContent=htmlcontent
        """
       
        while True:
            mess = self.redis.blpop(self.queque, 0)[1]
            params = {}
            params = {'plainContent':'', 'htmlContent':''}
            for item in maillist:
                temlist = item.split('=')
                params[temlist[0]] = temlist[1]

            #print params
            self.sendEmail(title = params['title'], mail_list = [params['to']], \
                        plainContent = params['plainContent'], htmlContent = params['htmlContent'])
            
    def sendEmail(mail_list, title, plainContent = '', htmlContent = ''):        
        """发送邮件
            @params mail_list   接收人邮件列表
            @params title       发送邮件的标题
            @params plainContent普通内容文本
            @params htmlContent html内容文本
    
            notice:
                plainContent 和 htmlContent同时存在时,只发送htmlContent
        """
        s = sendgrid.Sendgrid('user', 'password', secure = True)
        message = sendgrid.Message('from@example.com', title, plainContent, htmlContent)
        message.add_to(mail_list)
        s.smtp.send(message)

if __name__ == '__mail__':
    sendmess = Sendmess()
    sendmess.sendmess()

基于 Redis 实现消息队列的深入解析 随着现代分布式系统的广泛应用,消息队列(Message Queue,MQ)作为一种解耦和异步处理的关键技术,扮演着重要角色。消息队列可以用于任务异步处理、服务解耦、流量削峰等多种场景,能够有效提升系统的响应速度和可靠性。在众多消息队列技术中,Redis 凭借其高性能和丰富的数据结构,成为实现消息队列的热门选择之一。本文将深入介绍如何基于 Redis 实现消息队列,并分析其优缺点和应用场景。 阅读详情

相关推荐

SAP 配额修改 + 修改记录写入实现

采购配额修改并写入修改记录 cdhdr 和 cdpos

GAVIN 1098

基于Redis实现的阻塞队列

BaseTask类实现了基础的属性和方法,之后的拓展Task只需要继承BaseTask,覆写其中的run、finish、error方法即可。我这边用的框架是SpringBoot,所以我采用Spring的线程池来实现的,也可以用其他的线程去实现,这个不重要。所以我选择使用redis中间件来实现任务的互通,这样无论怎么更新,无论服务器出了什么样的问题,都不会影响到队列任务的执行。可以注意到,每个任务都独立运行,且互不干涉,至此整个流程算是完成了。我这边开了两个线程池,来模拟多服务的情况。

si_wang_wen_xuan的博客 1572

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 255

Redis消息队列、阻塞队列、延时队列

redis 队列的优点是轻量级,业务足够简单时不需要使用这样专业的消息中间件;缺点是弹出队列中的元素时,即使该消息处理失败也无法再次进行消费Redis队列 List。

夏寻的博客 3515

告别Overleaf!本地LaTeX环境配置:VSCode+TeXLive完全指南(Windows/Mac双平台)

本文详细介绍了如何在Windows和Mac平台上配置本地LaTeX环境,使用VSCode和TeXLive打造高效的专业写作工作流。从TeXLive安装到VSCode插件配置,再到高级技巧与性能优化,帮助用户摆脱Overleaf限制,实现更快速、更私密的学术写作体验。

3c4x5z6v7b的博客 952

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1585

Redis队列和阻塞队列

redis 队列的优点是轻量级,业务足够简单时不需要使用rabbitMq这样专业的消息中间件;缺点是弹出队列中的元素时,即使该消息处理失败也无法再次进行消费 Redis队列 List 简单演示如下 普通的redis队列,为了实现业务,通常会使用while进行循环,这样的话没有消息时依旧会频繁的执行循环,造成cpu的空转,所以一般会在代码中增加sleep来解决该问题,但因此又会造成消息延迟问题。 阻塞队列可以很好的解决这些问题。 Redis阻塞队列 redis队列提供了 “阻塞式” 拉取消息的命令:BR

xdscode的博客 7809

OpenClaw使用ClawHub安装skill网络不稳定?Rate limit exceeded报错?试试这个国内高速镜像工具!

使用 ClawHub 安装 Skill 时遇到 🌐 网络不稳、❌ Rate limit 或命令不可用?使用这个镜像工具,轻松解决skill安装问题,⚡

XiaoqiangClub的博客 1260

Redis之阻塞队列

 redis 命令 blpop key1...keyN timeout BLPOP 是阻塞式列表的弹出原语。 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞。直到有另一个客户端对给定的这些 key 的任意一个执行 LPUSH 或 RPUSH 命令为止。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,...

zl_momomo的博客 1万+

13、控制依赖与切片的新基础及递归While程序的摘要

本文探讨了控制依赖和程序切片的新研究进展,并提出了一种用于递归While程序的广义过程摘要概念和验证框架。文章介绍了控制依赖的新定义及其优势,程序切片的相关工作,以及递归While程序的过程摘要在完全正确性和终止性证明中的应用。通过阶乘和插入排序程序的示例分析,展示了过程摘要的有效性。未来的研究将聚焦于并发程序的依赖计算、依赖关系的语义连接以及时间属性的保留。

kotlin6android的博客 85

【MATLAB代码】基于水声通信(ACOMMS)下的到达时间差(TDOA)定位的AUV自主导航例程,附完整代码

水下AUV导航系统仿真研究 本研究基于到达时间差(TDOA)技术实现了水下自主航行器(AUV)的三维导航仿真系统。系统采用四个声学信标作为定位基准,通过TDOA测量数据迭代求解AUV位置。仿真结果表明: 导航性能:系统能够有效跟踪AUV从起点(30,30,-20)到目标点(70,70,-20)的航行轨迹,定位误差保持在合理范围内。 误差分析:定位误差变化曲线显示系统具有稳定的定位精度,平均误差为0.5米左右。 技术特点:采用两步最小二乘迭代算法求解非线性TDOA方程,提高了定位精度和计算效率。 该仿真系统为

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 320

【redis】redis实现队列的阻塞、延时、发布和订阅

Redis不仅可作为缓存服务器,还可以用作消息队列。它的列表类型天生支持用作消息队列。如下图所示: 由于Redis的列表是使用双向链表实现的,保存了头节点和尾节点,所以在列表的头部和尾部两边插入或获取元素都是非常快的,时间复杂度为O(1)。 普通队列 可以直接使用Redis的list数据类型实现消息队列,只需简单的两个指令lpush和rpop或者rpush和lpop。 lpush+rpop:左进右出的队列 rpush+lpop:左出右进的队列 下面使用redis的命令来模拟普通队列。 使用lpush命

morris 3万+

【WorkBuddy专栏】完结篇暨付费专栏总目录(内容继续更新中)

【WorkBuddy专栏】完结篇和付费内容总目录

AI人人懂 908

python实现阻塞队列_用redis阻塞队列,实现消息传递

在网络服务器运行的时候,可能会碰到这样的需求,主程序处理会很耗时,1,网络流量很大,但有紧急情况需要发送邮件通知别人,这时如果在程序中发送邮件,将会很费时,但又必须做2,处理客户端请求后,剩下的事情跟正常逻辑没有关系,但有些耗时的操作需要完成遇到这样的情况,可以有几种办法:1,开一个线程跑这些数据,主程序继续处理其他的任务2,用redis阻塞队列,将消息传到队列中,其他的事情由别的程序来重redi...

weixin_35775969的博客 1046

android 蓝牙通讯demo

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java阻塞队列 多线程_【并发】8、借助redis 实现多线程生产消费阻塞队列

顾名思义这个就是再消费的时候,不是之前的那哥用yield进行线程切换的操作,而是用线程等待阻塞的方式去执行,说实话我感觉效率不一定有之前那个好,因为我对这种阻塞队列使用的时候,之前有发现阻塞队列,塞着塞着线程就会进入假死状态,这个很奇怪,但是有的时候又是好的,这个也不清楚到底是为什么但是毕竟也是一种实现,我就写出来了看看吧生产者package queue.redisqueue;import que...

weixin_42453050的博客 144

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

如何使用Redis做异步队列

如何使用Redis做异步队列 使用List作为队列,RPUSH生产消息,LPOP消费消息 rpush testlist aaa (integer) 1 rpush testlist bbb (integer) 2 rpush testlist ccc (integer) 3 lpop testlist //弹出队列 "aaa" lpop testlist "ccc" 缺点:没有等待队列里有值就直接消费 弥补:可以通过在应用层引入Sleep机制去调用LPOP重试 BLPOP key [key …] t

罗彬桦的博客 625

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

redis进阶4-消息通知、订阅发布

1 使用LPUSH+RPOP即可实现队列的概念。并通过循环,来读取list中数据。 不足:需要使用循环,每隔1s读取队列。 2 BRPOP,有消息加入队列就发通知。BRPOP会阻塞队列,RPOP不会。 BRPOP返回值介绍: 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key

a314773862的博客 870

Redis list 可以实现的数据结构

栈(stack) 同向命令 队列(queue) 反向命令, 1.先lpush,后rpop 2.先rpush,后lpop 阻塞,单播队列(FIFO) blpop A 60 A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为60秒,如果时间设置为0表示阻塞时间无限延长 brpop B 60 A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为60秒,如果时间设置为0表示阻塞时间无限延长 brpoplpush A B 60 将A列表的尾元

u010321010的博客 174

Redis学习打卡-Day4-Redis实现消息队列

Redis阻塞队列优化秒杀业务、Redis实现消息队列三种方式:List、PubSub、Stream

SLFG_Ts的博客 920

Redis核心实战:消息队列与Feed流全解析

字面意思就是存放消息的队列。消息队列:存储和管理消息,也被称为消息代理(Message Broker)生产者:发送消息到消息队列消费者:从消息队列获取消息并处理消息流程:生产者判断秒杀时间和库存、校验一人一单后,发优惠券 id 等消息到队列,消费者接收消息完成下单。Redis 提供了三种不同的方式来实现消息队列:•基于 List 结构模拟消息队列基本的点对点消息模型比较完善的消息队列模型拉模式推模式推拉结合写比例低高中读比例高低中用户读取延迟高低低实现难度复杂。

weixin_47125004的博客 2101

Redis 作为消息队列详解

在现代分布式系统中,消息队列是一种常见的应用场景,广泛用于解耦系统各个模块、异步处理任务、提高系统的吞吐量和扩展性。Redis,作为一个高性能的内存数据库,其优秀的性能和灵活的特性使得它成为了构建消息队列的一个理想选择。 本文将详细介绍如何利用 Redis 构建高效的消息队列系统,分析 Redis 在作为消息队列时的特点、常用的消息队列模式、相关的实现策略、以及 Redis 作为消息队列的优势和局限性

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1850

Redis消息队列实现异步秒杀

顾名思义,消费者可以订阅一个或多个channel,生产者向对应的channel发送消息后,所有订阅者都能收到相关的消息。不过要注意的是,当队列中没有消息时RPOP和LPOP操作会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息。其他:根据指定id从pengding-list中获取已消费但未确认的消息,例如0,是从pengding-list中的第一个消息开始。消息队列,字面意思就是存放消息的队列。ID:起始ID标示,$代表队列中最后一个消息,0则代表队列中第一个消息。

weixin_46665411的博客 737

Redis实现消息队列

Redis实现轻量级的消息队列与消息中间件相比,没有高级特性也没有ACK保证,无法做到数据不重不漏,如果业务简单而且对消息的可靠性不是那么严格可以尝试使用。 列表类型 Redis中列表List类型是按照插入顺序排序的字符串链表,和数据结构中的普通链表一样,可以在头部left和尾部right添加新的元素。插入时如果键不存在Redis将为该键创建一个新的链表。如果链表中所有元素均被删除,那么该键也会...

ALIVE 2309

Redis 队列

队列的实现举例: 队列主要用在系统解耦、流量削峰、异步处理、数据顺序处理等场景。新手在使用时可能会犯一些常见的错误。下面讲一个新手容易犯的错误,在这个示例中把队列的入队、出队和Redis存储节点的主从关系给混淆了,示例如下存储: Redis主节点M, 使用数据List类型做为队列,列表名称M (标记为M.L,意为主节点上的List) Redis从节点S,

高广超的博客 583

基于Redis实现原生的消息队列

虽然Redis 的Stream看似完美,但是它还有不足。1. 消息持久化依赖Redis持久化机制,知道Redis持久化的可以知道无法保证万无一失。2. 消息确认机制只支持消费者确认,不支持生产者确认。3. 不支持消息的事务机制4. 多消费者下的消息有序性问题。所以如果对于消息队列,有更严格的要求,建议使用专业的消息队列,比如RabbitMQ、RocketMQ、Kafka等。

2401_82540083的博客 1299
上一篇: python 中闭包理解,及函数string.maketrans(),string.translate()
下一篇: 数据库优化<一>数据库层和硬件层概述
清风乐逍遥
博客等级 码龄14年 42粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值