欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP+REDIS如何統(tǒng)計(jì)在線人數(shù)

小編給大家分享一下PHP+redis如何統(tǒng)計(jì)在線人數(shù),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)倉山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

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

  • 使用有序集合

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

  • 使用集合

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

  • 使用hyperloglog

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

  • 使用bitmap

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

下面我們就用實(shí)際例子來說明:

我們先以每天會(huì)有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)計(jì)出哪些信息來吧

//note: 統(tǒng)計(jì)每天的在線總?cè)藬?shù)
for ($i=0; $i < 6; $i++) { 
    print_r($redis->zsize('000|online_users_day_'.$i). "\n");
}
//note: 統(tǒng)計(jì)最近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)計(jì)出近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)計(jì)某個(gè)時(shí)間段總共在線用戶
print_r($redis->zcount('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10)));
//note: 統(tǒng)計(jì)某個(gè)時(shí)間段在線用戶名單
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)計(jì)出早, 中, 午, 晚 等等時(shí)間段的用戶在線情況,還有很多其他的,這就讓我們發(fā)揮想象吧,是不是挺多的?只是確實(shí)也相當(dāng)耗費(fèi)內(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)計(jì)出哪些信息來吧

//note 判斷某個(gè)用戶是否在線
var_dump($redis->sIsMember('001|online_users_day_5', 100030));
//note 每天在線用戶總量的統(tǒng)計(jì)
for ($i=0; $i < 6; $i++) { 
    print_r($redis->ssize('001|online_users_day_'.$i). "\n");
}
//note 對(duì)不同時(shí)間段的在線用戶名單進(jìn)行聚合
print_r($redis->sInterStore('001|online_users_day_both_4and5', '001|online_users_day_4', '001|online_users_day_5'). "\n");
//note 對(duì)指定的時(shí)間段的在線用戶名單進(jìn)行統(tǒng)計(jì)
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");

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

方案三:使用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]);
    }
}

這種方案,我們來看看都能實(shí)現(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)計(jì)出某個(gè)時(shí)間段在線人數(shù)的總量, 對(duì)在線用戶的名單卻無能為力,但是卻挺節(jié)省內(nèi)存的,對(duì)統(tǒng)計(jì)數(shù)據(jù)要求不多情況下 ,我們便可以考慮這種方案。

方案四:使用bitmap

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

//note bitmap 綜合前面3個(gè)的優(yōu)缺點(diǎn)
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)計(jì)信息吧

//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)計(jì)的 這家伙也能統(tǒng)計(jì)出來?而且消耗的內(nèi)容還少。

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

以上是“PHP+REDIS如何統(tǒng)計(jì)在線人數(shù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站題目:PHP+REDIS如何統(tǒng)計(jì)在線人數(shù)
當(dāng)前路徑:http://aaarwkj.com/article44/pdiihe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化微信公眾號(hào)、用戶體驗(yàn)軟件開發(fā)、搜索引擎優(yōu)化外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
福利在线视频一区二区| 女同三人按摩高潮喷出| 免费无码不卡av一区二区| 亚洲永久免费在线观看| 久久免费看少妇高潮av| 日韩一日韩一区二区三电影在线观看| av资源中文字幕在线天堂| 久久精品午夜福利一区| 日本中文有码视频在线观看| 久久精品国产亚洲av高清观看| 亚洲av成人免费在线| 麻豆精品国产免费av影片| 日韩人妻中文字幕在线视频| 在线观看亚洲毛片网站| 国产日韩精品综合一区| 人妻少妇偷人精品免费看| 国模一区二区三区视频| 亚洲成人日韩成人av| 乡村丰满的大屁股熟妇| 国产日韩精品专区一区| 91精品国产综合久久香蕉麻豆| 欧美亚洲午夜精品久久久| 欧美a级黄片免费在线观看| 男女性视频在线免费观看| 国产精品主播自拍视频| 国语自产精品视频在线不卡| 中高龄夫妇五十路六十路| 国产综合永久精品日韩鬼片| 国产精品av国产精华液| 国产av剧情精品麻豆| 日本一区二区高清网址| 男人自拍天堂在线观看| 日韩精品一区二区三区都在看| 欧美日韩精品人妻中文| 巨乳中文乱码国产一区二区| 激情内射日本一区二区三区| 亚洲图文一区二区三区四区| 国产精品果亚洲av无人区一区| 国产美女主播视频一区二区三区| 亚洲一区乱码精品中文| 日本在线精品在线观看|