2013-02-18 72 views
2

我必須在集羣環境(許多無狀態的基於Java的應用服務器+ Mongodb)範圍內(0-100.000)生成隨機數 - 因此每個用戶請求會得到一些唯一的號碼,並會在接下來的幾個請求中保留它。在集羣環境中生成一個範圍內(0-100k)的隨機數

據我所知,我有兩個選擇: 1.有一些數字持續在mongo和incrementAndGet它 - 但它不是原子 - 不好的選擇。 2.使用Redis - 它是原子和支持計數器。 3.任何想法?使用UUID併爲其設置範圍安全嗎? 4. Hazelcast?

其他呢?

感謝

+5

預先生成隨機數,將它們全部存儲起來,然後按順序爲每個用戶分配數組/列表/表/其他數據中的「下一個」數字? – 2013-02-18 00:03:33

+1

如果唯一性是真正的要求,順序是好的,請使用規範的http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/方法。 – JohnnyHK 2013-02-18 00:47:03

回答

2

我會充分利用現有MongoDB的基礎設施和使用MongoDB的findAndModify命令做一個單位遞增,並獲取操作。

對於shell命令將看起來像。

var result = db.ids.findAndModify({ 
          query: { _id: "counter" }, 
          sort: { rating: 1 }, 
          new : true, 
          update: { $inc: { counter: 1 } }, 
          upsert : true 
         }); 

'new:true'在更新後返回文檔。如果文件丟失,Upsert會創建文件。

10gen supported driverAsynchronous Driver都包含用於查找和修改命令的輔助方法/構建器。