Fastrq

基于 Redis 的队列和堆栈
授权协议 MIT
开发语言 Python
所属分类 服务器软件、 JMS/消息中间件
软件类型 开源软件
地区 国产
投 递 者 林俊晖
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

基于redis的队列、双向队列、优先队列和堆栈,以及众多增强版本

  1. 支持定长。向满队列PUSH会失败,向容量不足的队列PUSH同样会失败。

  2. 支持可溢出。定长队列长度超过容量限制,元素会从另一端溢出。

  3. PUSH/POP支持批量操作

队列类型:

Queue

  • FIFO

Deque

  • 支持从前端/后端PUSH/POP

Capped Queue/Deque

  • 容量固定

  • 向一个满的队列PUSH会失败

  • 向一个容量不足的队列PUSH会失败

Overflow-able Capped Queue/Deque

  • 队列长度超过容量自动溢出

  • 单向队列从前端溢出

  • 双向队列从PUSH端的另一端溢出

Priority Queue

  • 分值越低,优先级越高

Capped Priority Queue

  • 容量固定

Overflow-able Capped Priority Queue

  • 队列长度超过容量自动溢出

  • 溢出顺序按优先级从低到高

Stack

  • LIFO

Capped Stack

  • 容量固定

源码安装

python setup.py install

pip安装

pip install fastrq

使用

from fastrq.queue import Queue, CappedQueue
from fastrq.deque import Deque
from fastrq.stack import Stack
from fastrq.priorityqueue import PriorityQueue

# queue
q = Queue("fastrq_queue")
q.push(1)
q.push([2, 3])
q.ttl(10)   # set the lifetime in seconds
q.range(0, -1)  # got ['1', '2', '3']
q.range(0, 1)  # got ['1', '2']
q.pop()
q.pop(2)
q.destruct() # destruct the queue
cq = CappedQueue("fastrq_capped_queue", 3)
cq.push(1)
cq.push(2)
cq.push([3, 4]) # got "err_qof"
cq.push(3)
cq.push(4) # got "err_qf"
of_cq = OfCappedQueue("fastrq_of_capped_queue", 3)
of_cq.push(1)
of_cq.push([2, 3, 4])  # "1" would be pushed out


# deque
dq = Deque("fastrq_deque")
dq.push_front([1, 2])
dq.push_back([3, 4])
dq.pop_front()
dq.pop_back()

# priority queue
pq = PriorityQueue("fastrq_priority_queue")
pq.push({'alibaba': 1})
pq.push({'google': 0, 'microsoft': 1})
pq.pop()
pq.pop(2)

# stack
s = Stack("fastrq_stack")
s.push([1,2,3])
s.pop()
 相关资料
  • 在前面的部分中,你了解了称为队列的先进先出数据结构。队列的一个重要变种称为优先级队列。优先级队列的作用就像一个队列,你可以通过从前面删除一个项目来出队。然而,在优先级队列中,队列中的项的逻辑顺序由它们的优先级确定。最高优先级项在队列的前面,最低优先级的项在后面。因此,当你将项排入优先级队列时,新项可能会一直移动到前面。我们将在下一章中研究一些图算法看到优先级队列是有用的数据结构。 你可能想到了几种

  • 数字键盘字母组合问题[M]

  • 问题内容: 我正在尝试根据文档中提供的示例实现优先级队列。文件:priorityQueue 简而言之,它看起来像这样(不包括所有内容): 该文件中: 如您所见,在与示例进行比较时,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列未正确实现接口。 这会给我带来以下问题: 该项目未附加到队列中。 我试图写出队列指针地址,它显示了不同的地址。这就解释了为什么它不起作用,但是切片不是地图长

  • 我正在为我的考试做复习,我遇到了这个问题,我需要在执行以下代码后找到Q1的内容。 数据 普塞多密码 这是我的解决方案 > 如果数字不是0,则将数字推送到堆栈,使堆栈现在变为0 否则,弹出堆栈的前两个元素,因此现在堆栈变为 3.循环堆栈!清空,弹出堆栈并在Q1中排队。所以现在堆栈为空,队列变为空 33是队列中的第一个,5是队列中的最后一个。 我仔细核对了提供的答案,发现我的答案不同 提供的答案 我不

  • 这两种处理堆栈和队列的方法有什么区别?两者都叫什么? 第一种方式: 第二种方式: 它们是否正确?试图学好这些,但互联网上的解释却模糊不清。。

  • 我需要一个简单的FIFO实现的队列来存储一堆整数(我不介意它是泛型实现)。 在或Trove/Guava库中已经为我烘焙了什么?

  • 问题内容: 我的总体问题是: 使用Redis for PubSub,当发布者将消息推送到频道中的速度比订阅者能够阅读它们的速度快时,消息会如何处理? 例如,假设我有: 一个简单的发布者以2 msg / sec的速度发布消息。 一个简单的订户以1 msg / sec的速率读取消息。 我天真的假设是订户只会看到发布到Redis上的消息的50%。为了验证这一理论,我编写了两个脚本: pub.py 子py

  • 因为它是一个队列,所以它将是FIFO,子字符串将导致输出为:OneWour?因为s.substring()是(3),所以不存在任何值。 最后,我在普林斯顿的CS课上发现了两个问题,但我不知道答案是怎么来的 假设客户机执行(queue)、入队和出队操作的混合序列。入队操作将整数0到9按顺序放入队列;出队列操作打印返回值。下列哪个序列不能发生? 假设执行(堆栈)push和pop操作的混合序列。推送按顺