我正在设计一个使用MongoDB进行存储的应用程序。您可能知道mongo提供的ObjectId数据类型是12字节十六进制。我想向用户展示一个更加用户友好的ID。
我研究了几个选项,比如PHP的uniqid()及其中的几个变体,但由于随机性的冲突,我不相信它们(参见Birthday Problem)。
对于这种操作,Redis看起来对我很有吸引力(见INCR)。这需要Web应用程序在每次需要创建新记录时调用redis。我只需要在redis中使用大约15-20个计数器,这些计数器的占用空间很小,因此复制永远不会成为问题。此外,应用程序可以使用套接字连接到它,以避免tcp开销。
我是否以错误的方式思考?还有什么我应该考虑的吗?
谢谢, 亚历
答案 0 :(得分:5)
“应该”是一个如此强烈的词......
我会说,如果你保持redis无论如何,你可以用它作为计数器。您可能会发现它对其他事情也很有用。但是如果你考虑为原子计数器安装和维护redis,那么这似乎有点过头了。
显然,Mongo也可以从How to make an auto incrementing field:
做原子计数器使用“计数器模型”,例如:
db.counters.insert({_id: "userId", next: 0});
var userCounter = db.findAndModify({
query: {_id: "userId"},
update: {$inc: {next: 1}}
});
您现在可以使用userCounter.next
作为您的身份。
话虽如此,如果我是你,我想我会将_id
保留为Mongo ObjectID
,并为自动增加的id保留一个单独的属性。