这是将成员和非成员与联系人列表分开的正确方法吗?

时间:2016-10-20 07:02:31

标签: php mysql performance caching memcached

方案

几乎每个社交应用都会这样做,他们会收集您的联系人列表,并告诉您哪些人是该服务的成员,哪些不是。从我所看到的情况来看,他们非常快。

为简单起见,我们假设联系人只是电子邮件,我会选择SELECT COUNT(*) FROM account WHERE email="abc@xyz.com"之类的选择查询。现在,这种方法产生了非常大的响应时间,并且它看起来也不是一种有效的方法。

所以,我采取的下一个方法是,在每次注册时,我将email_id作为密钥存储,并将注册后生成的account_id存储为memcached中的值。通过这种方式,我没有打扰做SQL查询,我只为每封电子邮件做memcache->get(email),如果我得到false回复,我会认为他是非会员如果我收到回复,他就是会员。这使得整个过程快了近10倍。

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

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

问题

我需要回答的主要问题是,如果memcache得到返回false,我不能100%确定他不是成员,因为key可能是刷新或连接到memcache服务器等可能有错误。 那么,每个人如何有效和快速地进行检查呢? Whatsapp,Google Allo等?

目前,我使用的是PHP 5.4,MySQL和Memcache,但我对任何编程语言都是开放的,只要它能有效地完成工作。 另请注意,表格已正确编入索引以优化查询。

0 个答案:

没有答案