Php 这是从联系人列表中分离成员和非成员的正确方法吗?

Php 这是从联系人列表中分离成员和非成员的正确方法吗?,php,mysql,performance,caching,memcached,Php,Mysql,Performance,Caching,Memcached,场景 几乎每个社交应用都会这样做,它们会记录你的联系人列表,告诉你其中谁是该服务的成员,谁不是。据我所见,他们这样做的速度非常快 为了简单起见,假设联系人只是电子邮件,我将执行一个select查询,如select COUNT(*)FROM account WHERE email=”abc@xyz.com“。现在,这种方法导致了非常大的响应时间,而且看起来也不是一种有效的方法 因此,我采取的下一种方法是,在每次注册时,我将电子邮件id存储为密钥,并将注册后生成的帐户id存储为memcached中的

场景

几乎每个社交应用都会这样做,它们会记录你的联系人列表,告诉你其中谁是该服务的成员,谁不是。据我所见,他们这样做的速度非常快

为了简单起见,假设联系人只是电子邮件,我将执行一个select查询,如
select COUNT(*)FROM account WHERE email=”abc@xyz.com“
。现在,这种方法导致了非常大的响应时间,而且看起来也不是一种有效的方法

因此,我采取的下一种方法是,在每次注册时,我将
电子邮件id
存储为密钥,并将注册后生成的
帐户id
存储为memcached中的值。这样,我就不用费心去做SQL查询了,我只做了一个<代码> MyCase- >获取(电子邮件)< /代码>每个电子邮件,如果我得到一个<代码> false <代码>响应,我会认为他是一个非成员,如果我得到响应,他就是一个成员。这使得整个过程几乎快了10倍

对于帐户表中约400个联系人的联系人列表和超过100000行的数据集,SQL方法大约需要13秒,而对于相同的数据,Memcache方法只需要1-2秒

现在,memcache方法在速度方面带来了两个问题。第一,如果memcache被刷新(出于任何原因,升级或维护,或内存已满等),即使是一个成员也会被隔离为非成员。为此,我使用了一个memcache预热脚本,它将获取所有成员,并在每次刷新缓存时设置所需的键值

问题

我需要回答的主要问题是,如果memcache get返回
false
,我无法100%确定他不是成员,因为
键可能已刷新,或者连接到memcache服务器时可能出现错误等。
那么,每个人是如何如此高效和快速地进行检查的呢?Whatsapp、谷歌Allo等

目前,我正在使用PHP5.4、MySQL和Memcache,但我对任何编程语言都持开放态度,只要它能有效地完成这项工作。
另外,请注意,该表已正确索引以优化查询。

正确的方法完全取决于您的项目。还有1k+rep,您不知道最好是标记除MySQL之外的每个操作系统,并包含一个MySQL查询作为示例代码。我只是代表iOS社区发言——这与此无关,您应该知道不要要求代码审查。stackexchange上还有另一个网站是这样做的。@soulshined如果它与您无关,那么您可以把它放在一边,我把ios和android放在一边,因为可能有开发人员做了这件事,因为最终,移动端参与了这件事。此外,我没有标记mysql,因为它是问题中最不重要的东西,所以我不允许标记超过5个。不管怎样,对于这个建议,我也会寻找你提到的网站。你可以尝试使用子查询在MySQL中模拟INTERSECT调用。移动通常是最容易在项目中使用的东西,只要你有你的BaaS I点和t点。在我看来。任何移动操作系统都可以发出与云相关的请求,不管语法是什么,但是你的问题已经标记了iOS,所以我回答了。但更重要的是,我只是回答你的问题,什么是正确的取决于你的项目。“他们”如何做到这一点取决于许多事情。服务器位置、免费率限制、应用程序的设计方式等。通常应用程序一次只显示x行。因此,对于iOS,您可以异步加载它们,而不是collectively@soulshined我懂了。这看起来更像是针对stackexchange站点的问题/讨论。“正确”的方式完全取决于您的项目。还有1k+rep,您不知道最好是标记除MySQL之外的每个操作系统,并包含一个MySQL查询作为示例代码。我只是代表iOS社区发言——这与此无关,您应该知道不要要求代码审查。stackexchange上还有另一个网站是这样做的。@soulshined如果它与您无关,那么您可以把它放在一边,我把ios和android放在一边,因为可能有开发人员做了这件事,因为最终,移动端参与了这件事。此外,我没有标记mysql,因为它是问题中最不重要的东西,所以我不允许标记超过5个。不管怎样,对于这个建议,我也会寻找你提到的网站。你可以尝试使用子查询在MySQL中模拟INTERSECT调用。移动通常是最容易在项目中使用的东西,只要你有你的BaaS I点和t点。在我看来。任何移动操作系统都可以发出与云相关的请求,不管语法是什么,但是你的问题已经标记了iOS,所以我回答了。但更重要的是,我只是回答你的问题,什么是正确的取决于你的项目。“他们”如何做到这一点取决于许多事情。服务器位置、免费率限制、应用程序的设计方式等。通常应用程序一次只显示x行。因此,对于iOS,您可以异步加载它们,而不是collectively@soulshined我懂了。这看起来更像是编程stackexchange站点的问题/讨论。