投票するとリアルタイムの投票ケースを見るために億人のユーザーを達成するためのPHPの組み合わせRedisのプロジェクト

シーン:そのプロジェクトのための投票システムを実行するサイトは、ユーザーがリアルタイム投票完成投票を見ることができます願って、オンライン投票のプロジェクトの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

おすすめ

転載: www.cnblogs.com/clubs/p/11806603.html