日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

腾讯在线人数统计_PHP + REDIS 实践:统计在线人数的几种方案分析

發布時間:2025/3/20 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腾讯在线人数统计_PHP + REDIS 实践:统计在线人数的几种方案分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(給PHP開發者加星標,提升PHP技能)

轉自:餅bing

blog.csdn.net/hao508506/article/details/52496656

在線人數統計業務是我們開發web肯定要設計的業務邏輯,本文就會給出幾種設計方案,來分析下各個方案的優缺點:

  • 使用有序集合

這種方案能夠同時儲存在線的用戶 和 用戶上線時間,能夠執行非常多的聚合計算,但是所消耗的內存也是非常可觀的。

  • 使用集合

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

  • 使用hyperloglog

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

  • 使用bitmap

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

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

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

方案一:使用有序集合

先生成用戶在線記錄數據:

$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?????????$user_id?=?mt_rand(1,?1000000);
????????$redis->zadd('000|online_users_day_'.$i,?mt_rand($day_start_time,?$day_end_time),?$user_id);
????}
}

好了記下來我們就來看看都能統計出哪些信息來吧

//note:?統計每天的在線總人數
for?($i=0;?$i?6;?$i++)?{?
????print_r($redis->zsize('000|online_users_day_'.$i).?"\n");
}

//note:?統計最近6天都在線的人數
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:?統計出近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:?統計某個時間段總共在線用戶
print_r($redis->zcount('000|online_users_day_5',?mktime(13,?0,?0,?9,?10),?mktime(14,?0,?0,?9,?10)));

//note:?統計某個時間段在線用戶名單
print_r($redis->zrangebyscore('000|online_users_day_5',?mktime(13,?0,?0,?9,?10),?mktime(14,?0,?0,?9,?10),?
????array('withscores'?=>?TRUE)));

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

方案二:使用集合

還是先來成用戶在線記錄數據:

//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?????????$user_id?=?mt_rand(1,?1000000);
????????$redis->sadd('001|online_users_day_'.$i,?$user_id);
????}
}

好了記下來我們就來看看都能統計出哪些信息來吧

//note?判斷某個用戶是否在線
var_dump($redis->sIsMember('001|online_users_day_5',?100030));

//note?每天在線用戶總量的統計
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?對指定的時間段的在線用戶名單進行統計
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

先來成用戶在線記錄數據:

//?note?HyperLogLog?只需要知道在線總人數
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?????????$user_id?=?mt_rand(1,?1000000);
????????$redis->pfadd('002|online_users_day_'.$i,?[$user_id]);
????}
}

這種方案,我們來看看都能實現哪些業務呢

$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'));

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

方案四:使用bitmap

筆者對這種方案其實挺喜歡的,消耗的內存空間不多, 統計的信息卻挺多的,還是老步驟,先來生成數據:

//note?bitmap?綜合前面3個的優缺點
for?($i=0;?$i?6;?$i++)?{
????$online_user_num?=?mt_rand(100000,?300000);?????//online?user?between?100000?and?300000?

????for?($j=1;?$j?????????$user_id?=?mt_rand(1,?1000000);
????????$redis->setbit('003|online_users_day_'.$i,?$user_id,?1);
????}
}

接下來我們看看能滿足的統計信息吧

//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'));

怎么樣?是不是集合能統計的 這家伙也能統計出來?而且消耗的內容還少。

對于這幾種方案其實各有各的好處, 根據業務統計信息 來取相應的方案來實施吧,這樣內存利用也就更合理了

- EOF -

推薦閱讀??點擊標題可跳轉

1、如何在 PHP 中進行會話處理?

2、PHP下kafka的實踐

3、PHP 內存泄漏問題解析

看完本文有收獲?請分享給更多人

推薦關注「PHP開發者」,提升PHP技能

點贊和在看就是最大的支持??

總結

以上是生活随笔為你收集整理的腾讯在线人数统计_PHP + REDIS 实践:统计在线人数的几种方案分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 网友自拍第一页 | 99re热视频| 中文字幕欲求不满 | 米奇av | 精品无码一级毛片免费 | 国产精品一级 | 伊人久久影视 | 黄色仓库av| 亚洲国产成人在线视频 | 双性受孕h堵精大肚生子 | 免费无码一区二区三区 | 蜜乳av一区 | 好男人www日本 | 日韩精品视频在线免费观看 | 久青草视频在线观看 | 欧美日韩一区二区视频在线观看 | 色导航| 最新视频 - 8mav | 欧美色香蕉 | 精品一区二区三区国产 | 操操插插 | 肥熟女一区二区三肥熟女 | 海角社区在线 | 成人禁污污啪啪入口 | 亚洲天堂av一区二区三区 | 青青操网 | 国产在线网站 | 欧美高跟鞋交xxxxxhd | h网站免费在线观看 | 午夜视频在线免费播放 | 国产美女黄网站 | 娇妻被肉到高潮流白浆 | 青青草成人在线 | 91热久久| 亚洲精品乱码久久久久99 | 色哟哟国产 | 免费av网站大全 | 精品丝袜一区 | 国产成人无码精品久久久电影 | 2014亚洲天堂| 亚洲制服一区二区 | 91欧美一区二区三区 | 黑鬼巨鞭白妞冒白浆 | 天天操天天射天天舔 | 欧美精品免费播放 | 色视频免费在线观看 | 中文字幕在线视频精品 | 在线观看的免费 | 五月天激情影院 | 91 免费看片 | 欧美第二区| 亚洲另类色综合网站 | 不卡视频免费在线观看 | 亚洲av综合永久无码精品天堂 | 欧美在线观看免费高清 | 老司机精品视频在线播放 | 伊人网在线观看 | 久久午夜鲁丝片午夜精品 | 日韩网站在线观看 | 五月天激情视频在线观看 | 在线天堂1| 亚洲成人精品av | 双性人做受视频 | 国产精品无套 | 色多多视频在线 | 亚洲精品国产精品国自产网站 | 日韩女优网站 | 亚洲综合一二三区 | 香蕉日日 | 国产精品一国产精品 | 亚洲社区一区二区 | av5566 | 久久亚洲AV无码 | 农村妇女毛片 | 看污片网站 | 亚洲成人国产精品 | 麻豆系列 | 国产精品无码人妻一区二区在线 | 伊人天堂网 | 亚洲爽片 | 夜夜夜网 | 少妇一级视频 | 午夜香蕉视频 | 国产剧情一区二区 | 免费观看亚洲视频 | 成人tv| 天天摸夜夜爽 | 亚洲人成人一区二区在线观看 | 国产精品无码网站 | 操女网站 | 久久色av | 91久久国产综合久久91 | 久综合 | 视频免费在线 | 午夜精品福利一区二区蜜股av | xxxxx毛片 | 日韩欧美v | 米奇狠狠干| 激情小说图片视频 |