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

本文探讨在网络服务器处理高流量时如何利用Redis阻塞队列进行消息传递。对比了开线程处理和使用Redis队列两种方式,重点介绍了如何通过Python读取Redis队列中的消息,利用blpop()函数实现阻塞读取,从而在消息存在时执行,否则等待,有效节省系统资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

           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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值