シーン:そのプロジェクトのための投票システムを実行するサイトは、ユーザーがリアルタイム投票完成投票を見ることができます願って、オンライン投票のプロジェクトの1時間以内に投票100万人のユーザーを持つことが期待されています
このシナリオでは、解決するために使用Redisの+ MySQLのホットとコールドデータ交換することができます。
ホットとコールドデータ交換とは何ですか?
コールドデータ:現在使用されているデータ:熱データを使用して前のデータ。
取引所:MySQLのRedisのにサイクルに格納されたデータ
業務プロセス
ユーザーの投票の後、最初の投票のRedisへのデータの保存、データは定期的にその後、ホットデータであり、(例えば5秒)の熱を保存するためのMySQLへのデータ、データが冷えたデータとなり、そのデータはRedisの中で寒さから削除されます、何度も何度も、一時間の終わりに投票することを知っています。
プログラム構造。
index.htmlをファイル
それは投票に家である、3つの投票ボタンがあり、投票に3人のユーザにアナログ、ボタンをクリックして、AJAX呼び出しvote.phpファイルを使用して
<!DOCTYPE用HTML PUBLIC " - // W3C // DTD XHTML 1.0厳格// EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > < HTML のxmlns = "のhttp:/ /www.w3.org/1999/xhtml」XML:LANG = "EN" > < 頭> < メタHTTP-当量= "Content-Typeの" コンテンツ= "text / htmlの;のcharset = UTF-8" > < タイトル>ドキュメント</ タイトル> </ ヘッド> < スクリプトSRC = "http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js" ボディ> < P > < スパンID = "UID1" > 0 </ スパン> < 入力タイプ= "ボタン" 値= "用户1" のonclick = "投票(1);" /> </ P > < P > < スパンID = "UID2" > 0 </ スパン> < 入力タイプ= "ボタン" 値= "用户2" のonclick = "投票(2);" /> </ P > <0 </ スパン> < 入力タイプ= "ボタン" 値= "用户3" のonclick = "投票(3);" /> </ P > </ ボディ> < スクリプト> 関数票(I){ $に.get(' ./vote.php?uid= ' + I、機能(RS){ VARのスパン= 'が#uid ' + I ; $(スパン)の.html(RS); }); } </ スクリプト> <
vote.php
このファイルには、論理票の主な成果です。まず、Redisのサーバーを接続し、ユーザごとに記録されたキー票として有権者のID、その後、有権者IDを保存し、その後のindex.htmlファイルに戻り、最後のキーglobal_voteidレコードとして使用得票数の合計は、自己成長のMySQLとして使用することができますキー。その後、UID、IP、時間などのデータを記録しました。
フォーマットは、一定の要件を持っていることに注意してください。
voteid 3は、IPを記録した場合、キーは投票:3:IP:127.0.0.1
<?PHP $のRedis = 新新Redisの(); $のRedis - >接続( '127.0.0.1'、6379 ); $のRedis - >認証( '123456' ); $のRedis - > SELECT(1); // データベースの選択図1は、 //ユーザ毎の投票の合計数を計算 $ UID = INTVAL($ _GET [ 'UID' ]); // $をUID = mt_rand(1,3); //指定されたランダム投票技術、ストレステストが容易に エコー $ Redisの - > INCR($ UID ); $ voteid = $のRedis - > INCR( 'global_voteid' ); $のRedis - > SET( '投票'。$ voteid ':UID'、。UID $ )。 $ IP = $ _SERVER [ 'REMOTE_ADDR' ]; $ Redisの - >セット( '投票'。$のvoteid ':IP'。$ IP )。 $ Redisの - >セット( '投票'。$のvoteid ':時間'、。時間());
ハイライト
このファイルには、ホットとコールドのデータ交換、最初の接続MySQLデータベースの主な成果であり、サーバをRedisの、その後、5秒ごとにはwhileループに投票mysqlの主キー(位置)に挿入され、主キーと最後の投票の成長から得たwhileループを実行します。すべての挿入が完了した場合、再挿入が存在しない場合、位置が挿入されているかどうかを決定する、それは完全に、挿入進行を挿入しない場合は、待機します。
<?PHP // データベースへの接続 $ PDO = 新しい新しい PDO( 'MySQLの:ホスト= 39.98.81.13; DBNAME =試して'、 '試し'、 'yn3emW6ksYhwwseh' ); $ PDO - >クエリ( '名前SET UTF8' ); / / 接続Redisの $のRedis = 新新Redisの(); $のRedis - >接続( '127.0.0.1'、6379 ); $のRedis - >認証( '123456' ); $ Redisの - >を選択し(1); // 選択したデータベース1 $時間 = 時間()+ 3600; // 時間は1時間後に設定されている //無限ループ しながら($時間 >時間()){ $で= $ Redisの - > GET( 'global_voteid'); // プライマリキー以来成長 $最終 = $のRedis - > GET( '最終'); // 最後の投票が挿入されているMySQLの主キー //データベースに挿入されていない場合は、初めtrueに肯定 IF(!$最終){ $最終 ; = 0 // 0にセット } // すべてのデータは、MySQLに挿入された場合には IF($ VID == $最終){ エコー "待ち\ N-" ; // 出力待ち } 他{ // データベース操作への挿入 $ SQL = 'INSERT INTO投票(VID、UID、IP、時間)の値' ; 用($ I = $ VID ; $に私 > $最後 ; $ I - ){ $ K1 = '投票'。私は$。':UID' ; $ K2 = '投票'。私は$。':IP' ; $ K3 = '投票'。私は$。「:時間」。 $行 = $ Redisの - > MGET([ $ K1、$ K2、$ K3 ])。 $ SQL =「($ I、$行 [0]、 ' $行 [1]'、$行 "、[2]); $ Redisの - >削除($ K1、$ K2、$ K3 ); } $ SQL = SUBSTR($ SQL、0、-1 ); $ PDO - > Execの($ SQL )。 Redisの$ - > SET( '最終'、$ VID); //は、主キーの挿入位置設定 エコー 'OK'を; } SLEEP(20); // 20秒ごとに実行サイクル }
表の投票
TABLE `CREATE(vote` ` id` INT( NOT符号なし11)NULL AUTO_INCREMENT COMMENT '主キーID'、 'vid` INTを( 11)NOT符号なしNULLを、 `uid` INT( 11)DEFAULTの NULL、 ` ip` CHAR( 20 )DEFAULTの NULL、 ` 時間。` int型(11)符号なしのDEFAULT NULL、 PRIMARY KEY ( `id`) )ENGINE = 27 = InnoDBのAUTO_INCREMENTにDEFAULT CHARSET = UTF8 COMMENT = 'PHPはRedisのは、1,000,000ユーザーの投票エントリテーブルを実現結合';
実行手順:
1、実行swap.phpファイルには、モニターの投票をRedisの
Linuxシステムswap.phpを呼び出すために、PHPのコマンドラインツールを使用して(推奨される方法)
投票へ2.アナログ要求
ビューRedisのライブラリは、レコードを要求しました
20代のデータベース、投票MySQLへのデータ同期
リンクします。https://mp.weixin.qq.com/s/7_5ICy-9ZbOD-BcFG2reZQ