3

我正在设计一个使用 MongoDB 进行存储的应用程序。您可能知道 mongo 提供的 ObjectId 数据类型是 12 字节的十六进制。我想向我的用户展示一个对用户更友好的 ID。

我研究了几个选项,如 PHP 的 uniqid() 及其几个变体,但我不相信它们,因为随机性所带来的冲突(参见生日问题)。

对于这种操作,Redis 看起来对我很有吸引力(请参阅INCR)。这要求 Web 应用程序在每次需要创建新记录时调用 redis。我在 redis 中只需要大约 15-20 个计数器,它们占用的空间很小,因此复制永远不会成为问题。此外,应用程序可以使用套接字连接到它,以避免 tcp 开销。

我想错了吗?还有什么我应该考虑的吗?

谢谢,亚历克斯

4

1 回答 1

5

“应该”是一个很强烈的词……

我想说,如果你仍然保留redis,你可以将它用于计数器。您可能会发现它对其他事情也很有用。但是,如果您考虑仅为原子计数器安装和维护 redis,那似乎有点过头了。

显然,Mongo 也可以做原子计数器,来自How to make a auto incrementing field

使用“计数器模型”,例如:

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

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

您现在可以userCounter.next用作您的 id。

话虽如此,如果我是你,我想我会保留_id作为 MongoObjectID并为自动递增的 id 保留一个单独的属性。

于 2012-09-12T07:58:34.907 回答