久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      PHP+REDIS實踐:統(tǒng)計在線人數(shù)的幾種方案分析

      在線人數(shù)統(tǒng)計業(yè)務(wù)是我們開發(fā)web肯定要設(shè)計的業(yè)務(wù)邏輯,本文就會給出幾種設(shè)計方案,來分析下各個方案的優(yōu)缺點:

      • 使用有序集合

      這種方案能夠同時儲存在線的用戶 和 用戶上線時間,能夠執(zhí)行非常多的聚合計算,但是所消耗的內(nèi)存也是非??捎^的。

      • 使用集合

      這種方案能儲存在線的用戶,也能夠執(zhí)行一定的聚合計算,相對有序集合,所消耗的內(nèi)存要小些,但是隨著用戶量的增多,消耗內(nèi)存空間也處于增加狀態(tài)

      • 使用hyperloglog

      這種方案無論統(tǒng)計多少在線用戶, 消耗的內(nèi)存都是12k,但是只能給出在線用戶的統(tǒng)計信息,無法獲取準確的在線用戶名單

      • 使用bitmap

      這種方案還是比較好的,在盡可能節(jié)省內(nèi)存空間情況下,記錄在線用戶的情況,而且能做一定的聚合運算

      下面我們就用實際例子來說明:

      我們先以每天會有10w~30w的小量用戶, 100w的用戶群來說明下面的幾種方案

      方案一:使用有序集合

      先生成用戶在線記錄數(shù)據(jù):

      $start_time = mktime(0, 0, 0, 9, 5);    //monday for ($i=0; $i < 6; $i++) {     $day_start_time  = $start_time + 86400 * $i;    //every day begin time     $day_end_time =  $day_start_time + 86400;       //every day end time     $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000      for ($j=1; $j < $online_user_num; $j++) {          $user_id = mt_rand(1, 1000000);         $redis->zadd('000|online_users_day_'.$i, mt_rand($day_start_time, $day_end_time), $user_id);     } }

      好了記下來我們就來看看都能統(tǒng)計出哪些信息來吧

      //note: 統(tǒng)計每天的在線總?cè)藬?shù) for ($i=0; $i < 6; $i++) {      print_r($redis->zsize('000|online_users_day_'.$i). "n"); } //note: 統(tǒng)計最近6天都在線的人數(shù) var_dump($redis->zInter('000|online_users_day_both_6',      [     '000|online_users_day_0',      '000|online_users_day_1',      '000|online_users_day_2',      '000|online_users_day_3',      '000|online_users_day_4',      '000|online_users_day_5'     ]     )); //note: 統(tǒng)計出近6天中共有多少上線 $redis->zunion('000|online_users_day_total_6', ['000|online_users_day_0', '000|online_users_day_1', '000|online_users_day_2', '000|online_users_day_3', '000|online_users_day_4', '000|online_users_day_5']); //note: 統(tǒng)計某個時間段總共在線用戶 print_r($redis->zcount('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10))); //note: 統(tǒng)計某個時間段在線用戶名單 print_r($redis->zrangebyscore('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10),      array('withscores' => TRUE)));

      不單單只有這些, 我們還能統(tǒng)計出早, 中, 午, 晚 等等時間段的用戶在線情況,還有很多其他的,這就讓我們發(fā)揮想象吧,是不是挺多的?只是確實也相當耗費內(nèi)存空間

      【推薦:PHP視頻教程】

      方案二:使用集合

      還是先來成用戶在線記錄數(shù)據(jù):

      //note set 一般聚合 for ($i=0; $i < 6; $i++) {     $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000      for ($j=1; $j < $online_user_num; $j++) {          $user_id = mt_rand(1, 1000000);         $redis->sadd('001|online_users_day_'.$i, $user_id);     } }

      好了記下來我們就來看看都能統(tǒng)計出哪些信息來吧

      //note 判斷某個用戶是否在線 var_dump($redis->sIsMember('001|online_users_day_5', 100030)); //note 每天在線用戶總量的統(tǒng)計 for ($i=0; $i < 6; $i++) {      print_r($redis->ssize('001|online_users_day_'.$i). "n"); } //note 對不同時間段的在線用戶名單進行聚合 print_r($redis->sInterStore('001|online_users_day_both_4and5', '001|online_users_day_4', '001|online_users_day_5'). "n"); //note 對指定的時間段的在線用戶名單進行統(tǒng)計 print_r($redis->sUnionStore('001|online_users_day_total_4add5', '001|online_users_day_4', '001|online_users_day_5'). "n"); //note 哪天上線哪天沒上線 print_r($redis->sDiffStore('001|online_users_day_diff_4jian5', '001|online_users_day_4', '001|online_users_day_5'). "n");

      是不是也挺不錯的,先不要著急, 我們接著往下看

      方案三:使用hyperloglgo

      先來成用戶在線記錄數(shù)據(jù):

      // note HyperLogLog 只需要知道在線總?cè)藬?shù) for ($i=0; $i < 6; $i++) {     $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000      var_dump($online_user_num);     for ($j=1; $j < $online_user_num; $j++) {          $user_id = mt_rand(1, 1000000);         $redis->pfadd('002|online_users_day_'.$i, [$user_id]);     } }

      這種方案,我們來看看都能實現(xiàn)哪些業(yè)務(wù)呢

      $count = 0; for ($i=0; $i < 3; $i++) {      $count += $redis->pfcount('002|online_users_day_'.$i);     print_r($redis->pfcount('002|online_users_day_'.$i). "n"); } var_dump($count); //note  3 days total online num var_dump($redis->pfmerge('002|online_users_day_both_3', ['002|online_users_day_0', '002|online_users_day_1', '002|online_users_day_2'])); var_dump($redis->pfcount('002|online_users_day_both_3'));

      好少啊,是的, 這種方案僅僅只能統(tǒng)計出某個時間段在線人數(shù)的總量, 對在線用戶的名單卻無能為力,但是卻挺節(jié)省內(nèi)存的,對統(tǒng)計數(shù)據(jù)要求不多情況下 ,我們便可以考慮這種方案。

      方案四:使用bitmap

      筆者對這種方案其實挺喜歡的,消耗的內(nèi)存空間不多, 統(tǒng)計的信息卻挺多的,還是老步驟,先來生成數(shù)據(jù):

      //note bitmap 綜合前面3個的優(yōu)缺點 for ($i=0; $i < 6; $i++) {     $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000      for ($j=1; $j < $online_user_num; $j++) {          $user_id = mt_rand(1, 1000000);         $redis->setbit('003|online_users_day_'.$i, $user_id, 1);     } }

      接下來我們看看能滿足的統(tǒng)計信息吧

      //note userid today whether online  var_dump($userid = mt_rand(1, 1000000)); var_dump($redis->getbit('003|online_users_day_5', $userid)); //note how many user is online var_dump($redis->bitcount('003|online_users_day_5')); //note 6 days both online var_dump($redis->bitop('AND', '003|online_users_day_both_6', '003|online_users_day_0', '003|online_users_day_1', '003|online_users_day_2', '003|online_users_day_3', '003|online_users_day_4', '003|online_users_day_5')); var_dump($redis->bitcount('003|online_users_day_both_6')); //note 6 days total online var_dump($redis->bitop('OR', '003|online_users_day_total_6', '003|online_users_day_0', '003|online_users_day_1', '003|online_users_day_2', '003|online_users_day_3', '003|online_users_day_4', '003|online_users_day_5')); var_dump($redis->bitcount('003|online_users_day_total_6')); //note 6 days only one online var_dump($redis->bitop('XOR', '003|online_users_day_only_one_6', '003|online_users_day_0', '003|online_users_day_1', '003|online_users_day_2', '003|online_users_day_3', '003|online_users_day_4', '003|online_users_day_5')); var_dump($redis->bitcount('003|online_users_day_only_one_6'));

      怎么樣?是不是集合能統(tǒng)計的 這家伙也能統(tǒng)計出來?而且消耗的內(nèi)容還少。

      對于這幾種方案其實各有各的好處, 根據(jù)業(yè)務(wù)統(tǒng)計信息 來取相應(yīng)的方案來實施吧,這樣內(nèi)存利用也就更合理了

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號