是否应该使用redis生成自动递增值?

时间:2012-09-12 06:49:23

标签: redis

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

我研究了几个选项,比如PHP的uniqid()及其中的几个变体,但由于随机性的冲突,我不相信它们(参见Birthday Problem)。

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

我是否以错误的方式思考?还有什么我应该考虑的吗?

谢谢, 亚历

1 个答案:

答案 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保留一个单独的属性。