参考Redis实现简单消息队列

Redis提供了两种方式来作消息队列。一个是使用生产者消费模式模式,另外一个方法就是发布订阅者模式。前者会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听。后者也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是ping的。

生产消费模式

主要使用了redis提供的blpop获取队列数据,如果队列没有数据则阻塞等待,也就是监听。

  1. #coding:utf-8
  2. """
  3. 生产者-消费者模式中的消费者
  4. """
  5. import redis
  6. class Task(object):
  7. def __init__(self):
  8. self.rcon = redis.StrictRedis(host='localhost', db=5)
  9. self.queue = 'task:prodcons:queue'
  10. def listen_task(self):
  11. while True:
  12. task = self.rcon.blpop(self.queue, 0)[1]
  13. print "Task get", task
  14. if __name__ == '__main__':
  15. print '监听任务队列'
  16. Task().listen_task()

发布订阅模式

使用redis的pubsub功能,订阅者订阅频道,发布者发布消息到频道了,频道就是一个消息队列。

  1. #coding:utf-8
  2. """
  3. 发布订阅模式中的订阅者
  4. """
  5. import redis
  6. class Task(object):
  7. def __init__(self):
  8. self.rcon = redis.StrictRedis(host='localhost', db=5)
  9. self.ps = self.rcon.pubsub()
  10. self.ps.subscribe('task:pubsub:channel')
  11. def listen_task(self):
  12. for i in self.ps.listen():
  13. if i['type'] == 'message':
  14. print "Task get", i['data']
  15. if __name__ == '__main__':
  16. print '监听任务频道'
  17. Task().listen_task()

提供生产者和消息发布者

这里使用Flask做一个简单的页面作为生产者和消息发布者

  1. # coding:utf-8
  2. """
  3. 提供一个页面作为生产者/消息发布者
  4. """
  5. import redis
  6. import random
  7. import logging
  8. from flask import Flask, redirect
  9. app = Flask(__name__)
  10. rcon = redis.StrictRedis(host='localhost', db=1)
  11. prodcons_queue = 'task:prodcons:queue' #生产者消费者队列名称
  12. pubsub_channel = 'task:pubsub:channel' #发布订阅频道名称
  13. @app.route('/')
  14. def index():
  15. html = """
  16. <br>
  17. <center><h3>Redis Message Queue</h3>
  18. <br>
  19. <a href="/prodcons">生产消费者模式</a>
  20. <br>
  21. <br>
  22. <a href="/pubsub">发布订阅者模式</a>
  23. </center>
  24. """
  25. return html
  26. #生产者
  27. @app.route('/prodcons')
  28. def prodcons():
  29. elem = random.randrange(10)
  30. rcon.lpush(prodcons_queue, elem)
  31. logging.info("lpush {} -- {}".format(prodcons_queue, elem))
  32. return redirect('/')
  33. #消息发布者
  34. @app.route('/pubsub')
  35. def pubsub():
  36. ps = rcon.pubsub()
  37. ps.subscribe(pubsub_channel)
  38. elem = random.randrange(10)
  39. rcon.publish(pubsub_channel, elem)
  40. return redirect('/')
  41. if __name__ == '__main__':
  42. app.run(debug=True)

测试

将三短代码分别保存在三个脚本文件中启动.

打开浏览器,会看到如下页面:



点击其中的两个超链接,两个一直在监听的消费者和订阅者会立即得到消息

消费者



订阅者

Redis使用总结(3):实现简单的消息队列的更多相关文章

  1. Java编程的逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  2. Redis实现简单的消息队列

    1.问:什么是消息队列?  答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...

  3. Java语言快速实现简单MQ消息队列服务

    目录 MQ基础回顾 主要角色 自定义协议 流程顺序 项目构建流程 具体使用流程 代码演示 消息处理中心 Broker 消息处理中心服务 BrokerServer 客户端 MqClient 测试MQ 小 ...

  4. Spring + JMS + ActiveMQ实现简单的消息队列(监听器异步实现)

    首先声明:以下内容均是在网上找别人的博客综合学习而成的,可能会发现某些代码与其他博主的相同,由于参考的文章比较多,这里对你们表示感谢,就不一一列举,如果有侵权的地方,请通知我,我可以把该文章删除. 1 ...

  5. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

  6. 用 Redis 实现 PHP 的简单消息队列

    参考:PHP高级编程之消息队列 消息队列就是在消息的传输过程中,可以保存消息的容器. 常见用途: 存储转发:异步处理耗时的任务 分布式事务:多个消费者消费同一个消息队列 应对高并发:通过消息队列保存任 ...

  7. redis(五)---- 简单消息队列

    消息队列一个消息的链表,是一个异步处理的数据处理引擎.不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失.一般用于邮件发送.手机短信发送,数据表单提交.图片生成.视频转换.日志储存等. red ...

  8. 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

    因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...

  9. Redis笔记(七)Java实现Redis消息队列

    这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...

随机推荐

  1. 关于使用ABP框架搭建的项目升级时需要注意的问题汇总

    ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 说明 升级方法 问题_01:Log4Net导致编译不成功 2015/12/18更新 ...

  2. 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.7,优化视频聊天、控制更多相关细节

    在广域网中,由于网络的结构纷繁复杂.而且其实时状况又是千变万化的,所以,要使广域网中的视频聊天达到一个令人满意的效果,存在诸多挑战.这次发布的GG 3.7版本尝试在这一方向上做一些努力,据我自己测试, ...

  3. 图解集合5:不正确地使用HashMap引发死循环及元素丢失

    问题引出 前一篇文章讲解了HashMap的实现原理,讲到了HashMap不是线程安全的.那么HashMap在多线程环境下又会有什么问题呢? 几个月前,公司项目的一个模块在线上运行的时候出现了死循环,死 ...

  4. 自己写一个java.lang.reflect.Proxy代理的实现

    前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...

  5. 一个App完成入门篇(二)-搭建主框架

    通过第一课的学习,你已经掌握了如何通过debug调试器来跟PC上的设计器联调来实时查看UI设计效果.调试代码了,接下来通过一系列的demo开发教学你将很快上手学习到如何开发一个真正的App. 要开发A ...

  6. npm穿墙

    GWF 很给力,很多东西都能墙掉,但是把 npm 也纳入黑名单,不知道 GWFer 是怎么想的.FQ翻了好多年了,原理其实也挺简单的,proxy 嘛! » 方法一 A) 国内源,http://cnpm ...

  7. js中各种跨域问题实战小结(二)

    这里接上篇:js中各种跨域问题实战小结(一) 后面继续学习的过程中,对上面第一篇有稍作休整.下面继续第二部分: -->5.利用iframe和location.hash -->6.windo ...

  8. Unity3D热更新全书-何谓热更新,为何热更新,如何热更新

    首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...

  9. EF架构~为EF DbContext生成的实体添加注释(T5模板应用)

    回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...

  10. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...