【发布时间】:2020-04-22 11:06:03
【问题描述】:
我有大约 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 正在变得超载,我也想搜索这些哈希。就像我想从电子邮件用户哈希的电子邮件中获取用户 ID。
我发现哈希应该使用Redis — best way to store a large map (dictionary) 的 ZipList 维护,并分成固定大小的较小存储桶,例如单个哈希中最多 10000 个键。
因此,如果我将我的 1000 万用户划分为包含 10000 个键的存储桶,那么电子邮件的哈希值大约为 1000,电话号码的哈希值约为 1000。
我的问题是,我应该将我的用户分成这 1000 个桶吗?如果是,那么我该如何搜索这 1000 个存储桶?还是有更好的选择?
附:我正在使用 PHP 并获取所有 1000 个哈希并遍历它们可能会占用大量资源,而且我担心使用错误的方法也会降低 Redis Power 的实际性能。
顺便说一句,我认为我们可以创建一些像 libketama 这样的算法来实现一致的散列,从而将密钥放置在随机服务器中。
此外,如果很难处理字母表,我们可以先将每封电子邮件转换为数字,例如 a=1、b=2、c=3 ... z=26,并附加 0(零)以使其唯一并且+s 表示 @ 和 .人物。例如
abcd@gmail.com -> 10203040+901301090+3015013
所以,现在我们有了可以更轻松地应用任何计算的数字。
【问题讨论】:
-
电话号码总是以
+开头吗? -
@Ersoy 是的,电话号码总是以 + 开头
标签: php hash redis pagination