散列电子邮件(或用户名)以存储在redis散列桶中

时间:2013-12-03 17:16:51

标签: javascript node.js hash redis buckets

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

我目前将用户数据(电子邮件,密码,创建日期等)放在名为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

然后当我需要为电子邮件thisguy@somedomain.com查找此uid时,我使用了类似的程序:

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. 将这些哈希组织成桶的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

  1. 它可能不会那么重要。 Redis没有整数类型,所以你只需要节省几个字节(每次你的计数器翻到下一个数字时都会减少)。做一些餐巾纸数学,在一百万用户中,实际存储的差异将是~50 mbs。使用硬盘驱动器< $ 1 / gb范围,它不值得花时间实施。
  2. 作为一项思考实验,您可以维护一个当前用户计数器的密钥,每次添加新用户时只需GETINCR

答案 1 :(得分:-1)

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

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