日韩性视频-久久久蜜桃-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 实践:统计在线人数的几种方案分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 青青草视频免费 | 夜色快播| 国产91在线观看 | 欧美韩国日本一区 | 成人av资源在线 | 欧美成人免费网站 | 26uuu欧美日本 | 一道本无吗一区 | 色老头综合 | 蜜桃精品视频 | 少妇xxxxxx| 91毛片在线观看 | 国产亚洲精品一区二区三区 | 欧美成人第一页 | 国产精品一品二区三区的使用体验 | 亚洲欧美在线一区二区 | 成年人网站在线观看视频 | 91最新地址永久入口 | 久草福利资源在线观看 | 精品人妻一区二区三区香蕉 | 国产成人综合在线视频 | www.色视频| 欧美大片免费高清观看 | 97xxx| 欧美日韩啪啪 | 男人的天堂免费av | 国产欧美精品一区二区在线播放 | 免费黄色在线播放 | 国产精品人妖 | 人妻aⅴ无码一区二区三区 阿v免费视频 | 亚洲综合五月 | 91精品91 | 外国av在线| 天天搞天天搞 | 国产在线观看不卡 | 黄色片高清 | 国产又粗又猛又爽视频 | 中文字幕在线观看三区 | 日本做爰全过程免费看 | 超碰97av| 最近中文字幕在线mv视频在线 | 欧美在线视频播放 | 胖女人做爰全过程 | 99这里有精品视频 | 92久久| 双性受孕h堵精大肚生子 | 在线播放av片| 国内自拍真实伦在线观看 | 任你操精品 | 久久亚洲国产 | 伊人久久成人 | 美日韩免费 | www.毛片com | 日韩欧美爱爱 | 日本一区二区色 | 欧美激情爱爱 | 亚洲二区在线观看 | 特级西西www444人体聚色 | 中国字幕一色哟哟 | 亚洲tv在线观看 | 香蕉视频污在线观看 | 丁香婷婷成人 | 色悠悠在线视频 | 黄色仓库av| 99午夜视频 | 欧美成人中文字幕 | 亚洲另类图区 | 色综合社区 | 玖玖视频网 | 久久发布国产伦子伦精品 | 日本在线免费观看 | 九九热伊人 | 欧美丰满bbw| 午夜一区在线 | 久久99精品国产麻豆婷婷洗澡 | 免费三级黄色 | 青草视频污 | 日本性欧美 | 亚欧综合在线 | 亚洲av中文无码乱人伦在线视色 | 精品一区二区精品 | 91在线网站| av生活片| 日色网站| 欧美精品一二三区 | 国产高清在线免费 | 久久乐av | 最新视频 - x88av | 精品99久久久 | 国产精品丝袜一区 | 国产18精品乱码免费看 | 男同精品 | 亚洲欧洲日产av | 欧美天天影院 | 伊人成人在线 | 亚洲精品福利视频 | 秋霞伦理一区二区 | 萌白酱喷水视频 | 涩涩资源站 |