我拥有超过1000万数量不断增长的用户,他们都有相对应的电子邮件和电话号码,这两者都指向一个用户ID。我创建了两个散列值。一个是用于电子邮件,另一个是用于电话号码,例如:
//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
已经过载,我也想通过这些Hash搜索。比如说我想从email-users哈希中获取电子邮件对应的用户ID。我发现应该使用ZipList维护哈希表,参见Redis - 存储大型映射(字典)的最佳方式,并将其分成较小的桶,每个桶容量固定为10000个键,如果我将我的1000万用户分成10000个键的桶,那么电子邮件将有约1000个哈希表,电话号码也有1000个哈希表。
我的问题是:我应该将我的用户分成这1000个桶吗?如果是,那么我如何搜索这1000个桶?还是有更好的选择?
附言:我正在使用
PHP
,获取所有1000个哈希表并循环遍历它们可能非常耗费资源,我担心使用错误的方法也会影响到Redis的实际性能。另外,我认为我们可以创建一些算法,例如libketama用于一致性哈希,以在随机服务器上放置键。
如果难以处理字母,我们可以先将每个电子邮件转换为数字,例如a=1,b=2,c=3......z=26,并在其后附加0(零)使其成为唯一值,@和.字符可以用+号代替。例如:
abcd@gmail.com -> 10203040+901301090+3015013
现在我们有数字,这使得应用任何计算更加容易。