我想知道是否可以用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队列。所以也许我正在以错误的方式解决这个问题。
答案 0 :(得分:2)
我在Java中为mongo实现了一个FIFO队列。您应该使用原子操作findAndModify从队列集合中查找最早的条目,并删除文档(remove = true)或设置状态字段。
另外要注意的是,您应该只在MasterOnly读取时执行此操作,或者将写入数设置为等于写入时的节点数。否则,由于复制延迟,您可能会得到不一致的结果。