1

我想知道是否可以使用 mongodb 和 ruby​​(mongoid) 创建一个 FIFO 队列。

我正在尝试使用上限集合,但我看不到如何弹出队列。集合中似乎没有方法可以做到这一点。

我现在正在做的是:

$fifo = Mongo::Connection.new.db("fifo")

queue = "#{queue_name}_#{queue_type}"
unless $fifo[queue].find.present?
  $fifo.command(create: queue, capped: true, size: 10000000, max: 1000)
end 
$fifo[queue].insert(url: "http://www.example.com/unique001")
$fifo[queue].insert(url: "http://www.example.com/unique002")
$fifo[queue].insert(url: "http://www.example.com/unique003")

这给了我一个看起来像的上限集合(来自控制台)

> db.test001_high.find()
{ "_id" : ObjectId("503c4714236f440e9c000001"), "url" : "http://www.example.com/unique001" }
{ "_id" : ObjectId("503c4714236f440e9c000002"), "url" : "http://www.example.com/unique002" }
{ "_id" : ObjectId("503c4714236f440e9c000003"), "url" : "http://www.example.com/unique003" }

我想知道的是,在 ruby​​ 中有没有办法在这个集合中阻止流行?我必须说我对 mongodb 并不是很熟悉,我只是想像在 redis 中那样创建一个 fifo 队列。所以也许我以错误的方式处理这个问题。

4

1 回答 1

2

我在 Java 中为 mongo 实现了一个 FIFO 队列。您应该使用原子操作findAndModify从队列集合中查找最早的条目,并删除文档 (remove=true) 或设置状态字段。

要注意的另一件事是,您应该只使用 MasterOnly 读取来执行此操作,或者将您的写入数设置为等于写入时的节点数。否则,由于复制延迟,您可能会得到不一致的结果。

于 2012-08-28T15:44:13.393 回答