一个Redis消息队列实现

原创 2017年07月14日 23:39:10

消息队列

某次在某乎上看到有人提到消息队列的问题,然后有人在回答里提到了Redis,接着便有人在评论里指出:Redis是缓存,不是消息队列。

但不幸的是,Redis的确提供一个简易的消息队列机制,可以用于一些要求不那么高的场合。

方法就是利用Redis的列表类型的push和pop操作。

我对前文所介绍的Redis Cache作了一点简单的扩展,增加了消息队列功能。

实现

代码基本就这么点:

class RedisMQ(RedisCache):
    def __init__(self, dbname, host='localhost', port=6379, db=0):
        super(RedisMQ, self).__init__(dbname, host, port, db)

    def push(self, channel, data):
        ch = self._getkey("channel", channel)
        self.db.lpush(ch, self.SERIALIZER.dumps(data))

    def pop(self, channel, timeout=5):
        ch = self._getkey("channel", channel)
        msg = self.db.brpop(ch, timeout)
        return self.SERIALIZER.loads(msg[1]) if msg else None


class Channel(object):
    MQ = RedisMQ("msgqueue")

    def __init__(self, channel):
        self.channel = channel

    def push(self, **kwargs):
        Channel.MQ.push(self.channel, kwargs)

    def pop(self):
        return Channel.MQ.pop(self.channel)

用法

消息生产者

ch = Channel("test")
ch.push(a=123,b="hello")

消息消费者,可能是另一个线程,甚至是另一个进程,甚至是另外一台主机——只要它们共用同一个redis即可。

ch = Channel("test")
while msg=ch.pop():
    # msg: {"a": 123, "b": "hello"}
# ch is empty

redis 实现消息队列,秒杀功能实现小测试

消息队列(mq) 一些列的操作,把它保存到一个容器中,这个结构的特点,是一个一个进行排队操作。 ①添加任务消息到队列中 ②消费(消耗)队列中的消息  (执行任务操作) redis实现消息队列的结...
  • weixin_38849871
  • weixin_38849871
  • 2017年09月17日 22:42
  • 302

Redis实现消息队列

基于Redis消息队列-实现短信服务化1.Redis实现消息队列原理常用的消息队列有RabbitMQ,ActiveMQ,个人觉得这种消息队列太大太重,本文介绍下基于Redis的轻量级消息队列服务。 ...
  • JaCman
  • JaCman
  • 2016年04月25日 22:48
  • 29653

基于Redis实现分布式消息队列(1)

为什么需要消息队列?使用消息队列有和好处?为何需要分布式?分布式环境需要考虑哪些因素?实现思路?...
  • stationxp
  • stationxp
  • 2015年05月09日 04:32
  • 14718

基于Redis实现分布式消息队列(汇总目录)

1、缘起;2、分布式消息队列功能设计;3、Redis功能分析;4、代码实现。
  • stationxp
  • stationxp
  • 2015年05月15日 01:41
  • 5195

基于Redis实现分布式消息队列(3)

Redis是什么鬼?性能如何?是否有便于实现队列的数据类型?“事务隔离级别”如何控制?如何实现HA和Sharding?持久化方面会有哪些问题?...
  • stationxp
  • stationxp
  • 2015年05月14日 07:23
  • 27131

Redis 消息队列运用

1、本实例采用的是Spring-data-Redis体系      网上有使用redis做消息队列,采用发布订阅模式,同样如此,这里不同的是,我配置的监听有多个,对多个主题(Topic)进行监听。  ...
  • zuo_qin_bo
  • zuo_qin_bo
  • 2016年01月06日 10:48
  • 791

基于Redis实现分布式消息队列(4)

纯代码干货:访问Redis的工具类;队列接口;队列的Redis实现类;获取队列实例的工具类;向队列中添加任务的代码;从队列中取出任务执行的代码。...
  • stationxp
  • stationxp
  • 2015年05月15日 01:31
  • 9249

使用jedis实现Redis消息队列(MQ)的发布(publish)和消息监听(subscribe)

前言: 本文基于jedis 2.9.0.jar、commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis连接池需要依赖commons-pool2包,js...
  • eguid_1
  • eguid_1
  • 2016年09月20日 22:08
  • 16801

利用Redis 实现消息队列

1.用redis中的List可以实现队列,这样可以用来做消息处理和任务调度的队列 2.代码模拟 代码结构 生产者模拟程序 /** * */...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2015年12月11日 19:27
  • 47916

php+redis消息队列抢购实现

  • linlin_xia
  • linlin_xia
  • 2017年04月01日 15:22
  • 957
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个Redis消息队列实现
举报原因:
原因补充:

(最多只允许输入30个字)