php - 通过Redis Hash存储和查找

标签 php hash redis pagination

我有大约 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/

相关文章:

php - 当使用 PHP 选择值 'other' 时如何显示 HTML 输入字段

javascript - PHP 代码 - 在一台 PC 上保存变量,而不仅仅是 cookie

algorithm - 日志时间的 HRW 会合散列?

C 表示任意对象(类型 void *)作为整数(计算出的标识符)

c# - 无法解析 ASP.Net Core 中类型“ServiceStack.Redis.Generic.IRedisTypedClient”的服务

php - laravel - 如何显示与多个模型相关的数据

php - mySQL 按时间和定义变量的 10 个最近行

algorithm - 如何计算哈希算法中发生冲突的几率?

php - 在 Redis 上,最好将一个键与 JSON 数据存储为值,还是将多个键存储为单个值?

python - Canonical Celery 单文件 hello world