-1

我想为我的系统实施电子邮件黑名单。在该列表中,我想存储无法送达的电子邮件。

当我的系统无法发送电子邮件时,我想保存它,以后再也不会发送它们。

我可以看到两种可能最简单的解决方案:

当收件人不存在时,

  1. 我可以在用户表中设置标记
  2. 或在特定表中收集此类不良电子邮件

在我看来,第二个解决方案更简单(因为更容易被缓存),但是有一个关于选择方法的问题......

在 MyMail 功能中,我将首先调用在不良电子邮件列表(表)中搜索当前电子邮件,然后如果不存在则将其发送出去,否则取消发送。

所以主要问题是什么可以更快: 1. 每次向数据库查询以搜索特定的键,例如,SELECT 1 FROM table WHERE email='checking_email'。当然,该表将只有一个字段email,并且该字段将被索引(唯一)。我只会使用严格的比较。2.或将该表内容缓存在一个数组中并查询数组以检查特定元素|键是否存在?

如果错误的电子邮件列表可能很长,例如 1000 万条记录。

什么会更快?更适合高负载项目?

PS 我知道 PHP 数组会占用太多内存,但是在开始发送时事通讯时进行大量 DB 查询也不是很好。

PPS 我将把坏邮件缓存在一个变量中,这就是为什么在 PHP 中它会以数组的形式出现。

PPS 另一种方法是在每个缓存键中缓存每封坏电子邮件,并仅检查缓存中是否存在此类键,但在这种情况下,清除缓存会更加复杂。我认为这是最好的解决方案。缓存中的键可以是 bad_email_。该预发送调用的逻辑可能是:检查缓存中是否存在所需的电子邮件,如果不存在,则检查数据库,如果它不存在并且也存在,那么它就是好电子邮件。从另一个角度来看,如果系统检测到错误的电子邮件,那么它将同时保存在数据库和缓存中。

4

2 回答 2

0

与其担心数组中的查找是否更快,不如担心将存储该数组的位置。它需要在脚本未运行时在某处进行序列化,然后在需要时将其加载到内存中。在这样做的时间里,您可能已经对数据库运行了数千个查询。如果您的数组可能真的增长到数百万个条目,那么纯 PHP 数组是一个糟糕的解决方案。

如果您担心对数据库的查询过多,请将它们批处理。一次查询数百或数千封电子邮件。使用准备好的语句,这会更快。

于 2012-11-07T08:36:47.723 回答
0

我肯定会使用某种缓存。如果您可以探索更多选项,我建议您使用 Redis(内存中的键/值数据库),它几乎就是为这种目的而设计的,而且速度非常快。http://redis.io/

于 2012-11-07T08:39:49.247 回答