使用Ruby的MongoDB fifo队列

时间:2012-08-28 04:42:55

标签: ruby mongodb mongoid

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

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

我现在正在做的是:

$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" }

我想知道的是,红宝石中有没有办法在这个系列上设置阻挡弹出?我必须说我对mongodb并不是很熟悉,我只想尝试创建一个像redis一样的fifo队列。所以也许我正在以错误的方式解决这个问题。

1 个答案:

答案 0 :(得分:2)

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

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