《Redis应用实例》书摘(20):先进先出队列¶
先进先出队列是一种非常常见的数据结构,它允许用户有序地将多个元素推入至队列,然后在有需要的时候再以相反的顺序依次从队列中弹出相应的元素。
在Redis中实现先进先出队列最简单的方法就是使用列表:程序只需要向列表的一端推入元素,并从列表的另一端弹出元素,那么列表自然就会形成一个先进先出队列。
代码清单 CODE_FIFO 展示了使用上述原理实现的先进先出队列。
代码清单 CODE_FIFO 先进先出队列 fifo_queue.py
NON_BLOCK = -1
class FifoQueue:
def __init__(self, client, key):
self.client = client
self.key = key
def enqueue(self, *items):
"""
以先进先出顺序将给定的一个或多个元素推入队列。
返回推入操作执行之后,队列当前的长度作为结果。
"""
return self.client.rpush(self.key, *items)
def dequeue(self, timeout=NON_BLOCK):
"""
以先进先出顺序弹出队列中的一个元素。
如果队列为空则返回None。
可选的timeout参数用于启用/关闭阻塞功能,它的值可以是:
1) NON_BLOCK ,默认值,不启用阻塞功能;
2)0 ,一直等待直到有值可弹出为止;
3)N ,大于0的秒数N,表示等待的最长秒数。
"""
if timeout == NON_BLOCK:
return self.client.lpop(self.key)
else:
ret = self.client.blpop(self.key, timeout)
if ret is not None:
return ret[1] # 从(list, item)元组中获取被弹出元素
def length(self):
"""
返回队列的长度。
"""
return self.client.llen(self.key)
以下代码展示了上述先进先出队列程序的具体用法:
>>> from redis import Redis
>>> from fifo_queue import FifoQueue
>>> client = Redis(decode_responses=True)
>>> queue = FifoQueue(client, "FifoQueue")
>>> queue.enqueue("a") # 元素入队
1
>>> queue.enqueue("b")
2
>>> queue.enqueue("c")
3
>>> queue.dequeue() # 元素出队
'a'
>>> queue.dequeue()
'b'
>>> queue.dequeue()
'c'
>>> queue.dequeue() # 队列已空
>>>