-1

システムに電子メールのブラックリストを実装したいと考えています。そのリストに、配信できないメールを保存したいと思います。

システムがメールを配信できない場合、メールを保存しておき、後で二度と送信しないようにしたいと考えています。

私が見ることができる最も簡単な解決策は2つあります。

受信者が存在しない場合、

  1. ユーザーテーブルでそれについてマークを設定できます
  2. または、特定のテーブルでそのような悪いメールを収集します

2番目の解決策はより簡単に思えますが(簡単にキャッシュできるため)、選択したアプローチについて質問があります...

MyMail 関数では、最初に不良メール リスト (テーブル) で現在のメールを検索する呼び出しを実装し、そこにない場合は送信し、そうでない場合は送信をキャンセルします。

主な質問は何ですか? 1. DB に毎回クエリを作成して、SELECT 1 FROM table WHERE email='checking_email'. もちろん、そのテーブルにはフィールドが1つしかなくemail、そのフィールドにはインデックスが付けられます(一意)。そして、厳密な比較のみを使用します。2.またはそのテーブルの内容を1つの配列にキャッシュし、特定の要素|キーが存在するかどうかを確認するために配列にクエリを作成しますか?

たとえば、1000 万レコードなど、不適切なメーリング リストが長くなる可能性がある場合。

何が速くなりますか?高負荷プロジェクトに適していますか?

PS PHP 配列が大量のメモリを消費することは知っていますが、ニュースレターの送信が開始された場合に備えて多くの DB クエリを実行することもあまり良くありません。

PPS 悪いメールを 1 つの変数にキャッシュします。これが、PHP で配列として存在する理由です。

PPS もう 1 つの方法は、各キャッシュ キーに各不良メールをキャッシュし、そのようなキーがキャッシュに存在するかどうかのみをチェックすることですが、その場合、キャッシュのパージはより複雑になります。これが最善の解決策だと思います。キャッシュ内のキーは、bad_email_ のようになります。そして、その事前送信呼び出しのロジックは次のようになります。必要な電子メールがキャッシュに存在するかどうかを確認し、存在しない場合はデータベースに存在しないかどうかを確認し、そこにも存在する場合、それは適切な電子メールです。システムが悪い電子メールを検出した場合、別のポイントから、DB とキャッシュに同時に保存されます。

4

2 に答える 2

0

配列内のルックアップが高速かどうかを心配するのではなく、その配列をどこに格納するかを心配します。スクリプトが実行されていないときにどこかでシリアル化して、必要なときにメモリにロードする必要があります。それを行うのにかかる時間内に、データベースに対しておそらく数千のクエリを実行できたはずです。配列が実際に数百万のエントリに成長する可能性がある場合、純粋なPHP配列は悪い解決策です。

データベースへのクエリが多すぎることが心配な場合は、それらをバッチ処理してください。一度に数百または数千の電子メールを照会します。プリペアドステートメントを使用すると、これがさらに高速になります。

于 2012-11-07T08:36:47.723 に答える
0

私は間違いなくある種のキャッシュを使用します。さらにオプションを検討できる場合は、Redis (メモリ内のキー/値 DB) を使用することをお勧めします。これは、この種の目的のために設計されたものであり、非常に高速です。http://redis.io/

于 2012-11-07T08:39:49.247 に答える