我有大约 1000 万以上的用户使用电子邮件和电话号码。两者都指向一个用户 ID。我创建了 2 个哈希。一个用于电子邮件,另一个用于电话号码,例如
//A single user with Both Email and Phone number pointing to same User ID
$redis->hSet('email-users', 'abc@xyz.com', 1);
$redis->hSet('phone-users', '+192938384849', 1);
现在大约有数百万用户,Hash
变得重载,我也想搜索这些 Hashes。就像我想从来自电子邮件用户哈希的电子邮件中获取用户 ID。
因为我发现应该使用 ZipList 在 Redis — best way to store a large map (dictionary) 维护哈希值并分成固定大小的较小桶,例如单个哈希中最多 10000 个键。
因此,如果我将我的 1000 万用户分成 10000 个 key 的桶,那么电子邮件将有大约 1000 个哈希值,电话号码将有 1000 个哈希值。
我的问题是,我应该将我的用户分成这 1000 个桶吗?如果是,那么我如何搜索这 1000 个桶?或者有更好的选择吗?
附言我正在使用 PHP
并获取所有 1000 个哈希并循环遍历它们可能会占用大量资源,我担心使用错误的方法也会破坏 Redis
的实际性能 Power .
顺便提一下,我认为我们可以创建一些算法,如 libketama,用于一致性哈希,以将 key 放置在随机服务器中。
此外,如果很难在 alphabats 上工作,我们可以先将每封电子邮件转换为数字,如 a=1、b=2、c=3 ... z=26,并附加 0(零)以使其唯一且+s 用于 @ 和 .人物。例如
abcd@gmail.com -> 10203040+901301090+3015013
因此,现在我们有了数字,可以更轻松地应用任何计算。
最佳答案
你可以做的是根据第一个或前几个字母/数字分配字母和数字。
您可以像这样创建您的散列;电子邮件首字母、电话号码首位或首两位数
- email-users-a
- email-users-b
- 电子邮件用户-c
- 电话用户 10
- 电话用户 11
当您执行 hset/hget 时,您是在代码级别安排它。
编辑:
假设我们将使用前两位数
作为电话号码,前两位
作为电子邮件地址;
然后我们将有如下键;
- email-users-aa
- email-users-ab
- 电话用户 11
- 电话用户 12
当我们收到像 ersoy@gmail.com
这样的电子邮件时,我们将转到 er
电子邮件哈希组,即 email-users-er
并执行 hget email-users-er ersoy@gmail.com
。
当我们有像 123456789
这样的电话号码时,我们将转到 12
电话哈希组,即 phone-users-12
并执行 hget phone-users-12 123456789
.
关于php - 通过Redis Hash存储和查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61363584/