3

ストレージに MongoDB を使用するアプリケーションを設計しています。おそらくご存じのとおり、mongo が提供する ObjectId データ型は 12 バイトの 16 進数です。代わりに、よりユーザーフレンドリーな ID をユーザーに表示したいと思います。

PHP の uniqid() のようないくつかのオプションとそのいくつかのバリエーションを調べましたが、ランダム性に伴う衝突のためにそれらを信頼していません (誕生日の問題を参照)。

Redis は、この種の操作には非常に魅力的です ( INCRを参照)。これには、新しいレコードを作成する必要があるたびに、Web アプリケーションが redis を呼び出す必要があります。フットプリントが小さいので、レプリケーションが問題になることはありません。また、アプリはソケットを使用して接続して、tcp オーバーヘッドを回避できます。

私はそれについて間違った方法で考えていますか?他に考慮すべきことはありますか?

ありがとう、アレックス

4

1 に答える 1

5

「しなければならない」というのはとても強い言葉です...

とにかくredisを維持すれば、カウンターに使用できると思います。おそらく、他のことにも役立つでしょう。しかし、アトミック カウンターのためだけに redis をインストールして維持することを考えると、それは少しやり過ぎに思えます。

どうやら、Mongo は自動インクリメント フィールドの作成方法からアトミック カウンターも実行できます。

次のような「カウンターモデル」を使用します。

db.counters.insert({_id: "userId", next: 0});

var userCounter = db.findAndModify({
  query: {_id: "userId"},
  update: {$inc: {next: 1}}
});

userCounter.nextIDとして使えるようになりました。

そうは言っても、私があなただったら_id、 を Mongo として保持ObjectIDし、自動インクリメント ID 用に別のプロパティを保持すると思います。

于 2012-09-12T07:58:34.907 に答える