2012-11-07 52 views
-1

我想爲我的系統實現郵件黑名單。在該列表中,我想存儲不可交付的電子郵件。Array or not Array [PHP]

當我的系統無法發送電子郵件時,我想保存它,以後再也不會發送它們。

有兩種可能的最簡單的方法是什麼,我可以看到:

當收件人是不存在的,

  1. 我可以設置標誌有關,在用戶表
  2. 或收集特定這樣惡劣的電子郵件表

第二個解決方案對我來說似乎更容易(因爲更容易可以緩存),但是有一個關於選擇方法的問題...

在MyMail函數中,我將首先實現一個調用來在壞的郵件列表(表)中搜索當前的電子郵件,如果它不在那裏發送它,否則取消發送。

所以主要問題是什麼可以更快: 1.每次查詢數據庫來搜索特定的鍵,如SELECT 1 FROM table WHERE email='checking_email'。當然,該表格只有一個字段email,該字段將被索引(唯一)。我將只使用嚴格的比較。 2.或緩存一個數組中的表內容並且使查詢數組檢查是否存在或不存在特定的元素|鍵?

如果錯誤的電子郵件列表可能長得多,例如1000萬條記錄。

什麼會更快?更好的高負荷項目?

P.S.我知道PHP數組的內存太多了,但是在啓動時事通訊的情況下做了大量的數據庫查詢也不太好。

P.P.S.我將把不好的電子郵件緩存在一個變量中,這就是爲什麼在PHP中它將以數組的形式出現。

P.P.S.另一種方法是緩存每個緩存密鑰中的每個壞電子郵件,並僅檢查緩存中是否存在此密鑰,但在這種情況下,清除緩存將更加複雜。我認爲這是最好的解決方案。緩存中的鍵可以像bad_email_一樣。該預發送呼叫的邏輯可能是:檢查緩存中是否存在所需的電子郵件(如果不存在),然後檢查數據庫是否不存在,以及是否存在,那麼它就是好的電子郵件。從其他角度看,如果系統檢測到錯誤的電子郵件,那麼它將同時保存在數據庫和緩存中。

+0

黑色電子郵件?像尼日利亞垃圾郵件? – GolezTrol

+0

@GolezTrol對不起,沒有。意味着當然在黑名單中的電子郵件。 – user1016265

+0

數組會比mysql比較快,但當您比較至少1000個以上的電子郵件列表時,您會注意到這種差異。 – Serg

回答

0

不用擔心數組中的查找是否更快,您可能擔心要存儲該數組的位置。它需要在腳本未運行時序列化,然後在需要時加載到內存中。在這個過程中,你可能會運行數千個針對數據庫的查詢。如果你的數組可能真的成長爲數以百萬計的條目,純PHP數組是一個不好的解決方案。

如果您擔心對數據庫的查詢過多,請對其進行批處理。一次查詢幾百或幾千封電子郵件。使用準備好的語句,這使得它更快。

+0

但是你怎麼想將它們緩存爲緩存作爲每個電子郵件地址它是自己的緩存密鑰? – user1016265

+0

取決於緩存。平面文件?不,方式太慢。 Memcached的?它是不穩定的,所以您還需要另一個數據存儲*,並將數據首先加載到Memcached中,同樣的問題。像Redis的東西?那麼,你基本上已經在使用一個數據庫... – deceze

+0

緩存將memcache和數據將被保存在MySQL和邏輯如何memcache將填補我在PPS – user1016265

0

我肯定會使用某種緩存。如果你可以探索更多的選擇,我會推薦使用Redis(內存鍵/值DB),它非常適合這種目的,而且速度非常快。 http://redis.io/

+0

不幸的是,我只能使用MySQL和memcache,只能使用它。 – user1016265