1

我正在编写一个依赖redis作为其主数据库的node.js应用程序,用户信息存储在这个数据库中。

我目前将用户数据(电子邮件、密码、创建日期等)保存在名称为user:(incremental uid). email:(email)和一个有价值的钥匙(same incremental uid)

当有人登录时,应用程序会查找与电子邮件匹配的密钥,email:(email)以返回(incremental uid)访问用户数据的user:(incremental uid).

这很有效,但是,如果用户数量达到数百万(可能,但有点遥远的问题),我的数据库大小将急剧增加,我将开始遇到一些问题。

我想知道如何将电子邮件哈希到一个整数,我可以用它来分类像这样的哈希桶(伪代码):

hash(thisguy@somedomain.com) returns 1234  
1234 % 3 or something returns 1
store { thisguy@somedomain.com : (his incremental uid) } in hash emailbucket:1

然后,当我需要为 email 查找这个 uid 时thisguy@somedomain.com,我使用类似的过程:

hash(thisguy@somedomain.com) returns 1234  
1234 % 3 or something returns 1
lookup thisguy@somedomain.com in hash emailbucket:1 returns his (incremental uid)

所以,我的问题以列表形式:

  1. 这是实用的/有更好的方法吗?
  2. 如何将电子邮件散列到几位数字?
  3. 将这些哈希组织到桶中的最佳方法是什么?
4

2 回答 2

0
  1. 它可能最终不会那么重要。Redis 没有整数类型,因此您只需为自己节省几个字节(每次计数器滚动到下一位时会减少)。对一百万用户进行一些餐巾数学运算,实际存储空间的差异约为 50 mbs。使用 < $1 / gb 范围内的硬盘驱动器,不值得花时间来实施。
  2. 作为一个思想实验,您可以维护一个密钥,即您当前的用户计数器,GET并且INCR每次添加新用户时。
于 2013-12-03T20:46:48.670 回答
-1

是的,它是在哈希中保存数百万个键值对的更好方法。您需要自己创建算法。例如 - 您可以使用时间戳来创建一个桶值,该值在每 1000 个值之后更改。. 可以有许多其他方式。

阅读本文以获取更多参考http://instagram-engineering.tumblr.com/post/12202313862/storing-hundreds-of-millions-of-simple-key-value

于 2016-02-12T11:32:43.377 回答