一个Redis消息队列实现

来源:互联网 发布:java 小游戏源代码 编辑:程序博客网 时间:2024/06/14 00:33

消息队列

某次在某乎上看到有人提到消息队列的问题,然后有人在回答里提到了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 Noneclass 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
原创粉丝点击