《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()  # 队列已空
>>>

Tip

本文摘录自《Redis应用实例》一书。
欢迎访问书本主页以了解更多Redis使用案例:huangz.works/rediscookbook/
../_images/rediscookbook-banner.png