Web サイトは分散展開を採用しており、読み取りと書き込みが分離されており、書き込みデータベース サーバーが複数あります。現在、ログインおよび登録サーバーが 1 つあり、各テーブルには 2,000 万のエントリが格納されると予想されます。
すみません:
1. ユーザーが登録するときに、ユーザー名がすでに存在するかどうかを確認するにはどうすればよいですか?何か良い効果的な解決策はあるのでしょうか?
2. ユーザーを対応するテーブルに保存するソリューションを設計するにはどうすればよいですか?
3. ユーザーがログインするとき、そのユーザーがどのテーブルに属しているかをどのように知ることができますか?
この問題は難しく、緊急ですので、各界の専門家にご協力いただき、回答していただければ幸いです。
返信内容:
これは言うのは簡単ですが、実践するのは複雑です。イベントの整合性に関する Wiki ページを参照することをお勧めします。
10 個のテーブルを確認すると、N 年間変更されません。それは単純すぎます。ユーザー名を 16 進数 (26 文字 + 10 桁の数字) として扱い、10 を直接変更して余りを取り、どのユーザー テーブルに読み書きするかを決定します。
しかし、まずこれの落とし穴がどこにあるのかを知る必要があります...イベントの一貫性を具体的に見てみましょう...
この問題はこれで終わりにさせていただきます。
通常、ユーザーはユーザー名または電子メール + パスワードを使用してログインし、ログイン確認を要求します。
user_0、user_1、user_2、... user_9 の 10 個のテーブルがあるとします。
複数のユーザーがいるとします。ユーザー名は username1、nameuser2123、username 12、God of Death です。
ユーザー「Ai Tiansha Shen」がログインを要求したとき、ユーザー名が存在するかどうかをどのように確認すればよいでしょうか?まずユーザー名の int ハッシュを作成します。これは md5 と同様です。md5 はデータを 32 ビットの 16 進文字列に変換しますが、int ハッシュはデータを int 値に変換します。 int hash 参照: ハッシュ アルゴリズム - hqd_acm の列
次に、この int ハッシュ値の残りを取得し、0 ~ 9 の数値を取得します。この時点で、次の 3 つの問題が解決されました。
1. ユーザー登録時に、そのユーザー名が既に存在するかどうかをどのように確認するか?何か良い効果的な解決策はあるのでしょうか?
2. ユーザーを対応するテーブルに保存する計画を設計するにはどうすればよいですか?
3. ユーザーがログインするとき、そのユーザーがどのテーブルに属しているかをどのように知ることができますか?
コードを表示:
<code class="language-php"><span class="x">function get_user_table_name($username, $prefix = 'user_', $count = 10){</span>
<span class="x"> return $prefix . abs(crc32($username)) % $count;</span>
<span class="x">}</span>
<span class="x">var_dump(get_user_table_name('username1'));</span>
<span class="x">var_dump(get_user_table_name('nameuser2123'));</span>
<span class="x">var_dump(get_user_table_name('用户名12'));</span>
<span class="x">var_dump(get_user_table_name('逆天杀神'));</span>
<span class="x">/**</span>
<span class="x"> * dump:</span>
<span class="x"> * string(6) "user_2"</span>
<span class="x"> * string(6) "user_8"</span>
<span class="x"> * string(6) "user_5"</span>
<span class="x"> * string(6) "user_9"</span>
<span class="x"> */</span>
</code>
ログイン後にコピー
下剤、、、
============
MD5 + hexdec、上記の答えと組み合わせると、十分なヒントがあります~
ユーザー名をハッシュし、それを変更してどのテーブルに含めるべきかを確認します。
その後、ユーザー名が存在するかどうかを確認するために一度だけチェックする必要があります。
----------------------------------------------- --------------------
この嫌味な発言の風潮はどこから来たのですか?
役に立たない回答に反対票を投じました + 役に立ちません
最初の質問は、保存するときにハッシュを使用して、すぐに見つけられるようにすることです。
2 番目の問題は、インデックスを作成することで解決されます。
3 番目の問題は、インデックス クエリを使用すると、ユーザーはどのテーブルやファイル システムにアクセスするかを知る必要がないことです。この側面を扱うためのインデックス。
このレベルではテーブルを分割する必要はありません。Memcached はユーザー名クエリ キャッシュを追加することで問題を解決できます。
分割する必要がある場合は、ハッシュを使用して最初に係数を取得し、それが耐えられない場合は後で分割します。
本当に 2 億項目をテーブルに分割する必要があるのでしょうか? ? ?
パフォーマンスの観点からのみ考えると、Oracle または asm を使用する場合はパーティションさえ必要ありません。
ハハ、これはとても簡単です!
最初の質問については話しません。盗作をチェックする方法はたくさんあります。質問者はすでに解決できるはずです。
2 番目の質問については、次のようになります。各ユーザー名の親の名前を取得し、ユーザー テーブルを 26 に分割し (10 個のテーブルでなければならないことは問題ありません。最悪 1 つのテーブルに 3 つの親が格納されます)、対応するユーザー名を対応するテーブルに入れます。これには多くの利点があります。ユーザー数が多い場合、各ユーザー テーブルのストレージ量は基本的にバランスが保たれ、混乱がなくなり、クエリ速度が向上し、冗長性が軽減されます。はは、質問 2 を通過しても、質問 3 は解決されていません。もう?ユーザーがログインしたら、対応する最初の親テーブルを見つけるだけです。
………………区切り線………………
概要:
問題 2 と 3 を直接解決するには、ユーザー名の最初の文字を分割します。大幅に改善されます。クエリ速度が向上し、テーブルの冗長性が直線的に削減され、テーブルのバランシングの問題も解決されます。
質問 1 の重複チェックの効率にも非常に役立ちます。最初の親に対応するテーブルを直接チェックするため、最適化が行われた場合、総クエリ量は元の 1/26 に削減されます。各テーブルの効率はさらに高くなり、大幅な改善が見られます。
ははは、多分それです!
何かが間違っていると思われる場合は、修正、嫌がらせ、個人的なメッセージを歓迎します...(๑•̀ㅂ•́) ✧
過剰に設計しないでください。2 億人の登録ユーザーを獲得できるプロジェクトはどれですか? ? ?
死んでも数千万しか稼げないなら、そんな贅沢なことはしないでください。
1. キャッシュ出口を使用して、キーとして直接使用できます。
2. (登録) タイムスタンプとその他の情報に基づいて分散固有 ID を生成し、ハッシュモジュロを使用します。テーブルを分割するか、時間間隔を直接使用します。テーブル分割
最も簡単な方法は、ユーザー名を直接ハッシュしてテーブルを分割することです。これにより、3 番目の分割テーブルでの検索が容易になります。
3. 特定のユーザーをチェックするときにテーブルを見つけるにはどうすればよいですか?検索に使用する基準によって異なります。ユーザー名、シンプル。