python下使用redis实现一个简单的队列
使用 redis 构建一个简单的多生产者、多消费者 Queue,其接口类似于 python 标准库队列。
使用这个队列,可以轻松地在多个进程之间共享数据,或者将耗时的计算放到多个进程。
为了存储数据,我们使用redis列表数据类型。Redis 列表存储的是按插入顺序排序的简单字符串。
redis用到的命令:
rpush 在列表的末尾插入一个元素
blpop 从列表开头获取一个元素,如果列表是空则 阻塞
lpop 从列表开头获取一个元素,如果列表是空 则返回空
llen 返回列表的长度
import redis
class RedisQueue(object):
"""Simple Queue with Redis Backend"""
def __init__(self, name, namespace='queue', **redis_kwargs):
"""The default connection parameters are: host='localhost', port=6379, db=0"""
self.__db= redis.Redis(**redis_kwargs)
self.key = '%s:%s' %(namespace, name)
def qsize(self):
"""Return the approximate size of the queue."""
return self.__db.llen(self.key)
def empty(self):
"""Return True if the queue is empty, False otherwise."""
return self.qsize() == 0
def put(self, item):
"""Put item into the queue."""
self.__db.rpush(self.key, item)
def get(self, block=True, timeout=None):
"""Remove and return an item from the queue.
If optional args block is true and timeout is None (the default), block
if necessary until an item is available."""
if block:
item = self.__db.blpop(self.key, timeout=timeout)
else:
item = self.__db.lpop(self.key)
if item:
item = item[1]
return item
def get_nowait(self):
"""Equivalent to get(False)."""
return self.get(False)
用法:
>>> from RedisQueue import RedisQueue
>>> q = RedisQueue('test')
>>> q.put('hello world')
现在如果我们用redis-cli客户端查看一下redis数据库,就会显示出预期的结果。
redis 127.0.0.1:6379> keys * 1) "queue:test" redis 127.0.0.1:6379> type queue:test list redis 127.0.0.1:6379> llen queue:test (integer) 1 redis 127.0.0.1:6379> lrange queue:test 0 1 1) "hello world"
我们可以从另一个脚本中得到这个条目:
>>> from RedisQueue import RedisQueue
>>> q = RedisQueue('test')
>>> q.get()
'hello world'
接下来的 q.get ()调用将阻塞,直到另一个调用将新项放入 Queue。
参考:
http://peter-hoffmann.com/2012/python-simple-queue-redis-queue.html

浙公网安备 33010602011771号