2012-08-28 204 views
1

我不知道是否有可能創建一個與MongoDB和紅寶石(mongoid)的FIFO隊列。MongoDB 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

你看過tailable遊標嗎? –

回答

2

我在Java中爲mongo實現了一個FIFO隊列。您應該使用原子操作findAndModify從隊列集合中查找最早的條目,並刪除文檔(remove = true)或設置狀態字段。

另一件要小心的事情是,您應該只在MasterOnly讀取時執行此操作,或將您的寫入編號設置爲等於寫入時的節點數。否則,由於複製延遲,您可能會得到不一致的結果。