最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis統(tǒng)計(jì)APP在線人數(shù)的實(shí)例

 更新時(shí)間:2020年11月24日 11:16:16   作者:宛十八  
這篇文章主要介紹了redis統(tǒng)計(jì)APP在線人數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

最近有個(gè)需求,需要統(tǒng)計(jì)APP的在線人數(shù),其實(shí)以前也統(tǒng)計(jì)過(guò),采取的是上線發(fā)送一個(gè)請(qǐng)求$this->cache->incr()加1,下線的時(shí)候$this->cache->decr()減1,可是這樣做的后果是,發(fā)現(xiàn)在線人數(shù)錯(cuò)的離譜,幾千人同是在線。

why?原來(lái)APP端如果卸載的時(shí)候,那么就不會(huì)發(fā)請(qǐng)求,還有如果非正常終止的時(shí)候,也不會(huì)發(fā)送下線請(qǐng)求?

于是乎找一個(gè)準(zhǔn)備的統(tǒng)計(jì)方式

1:客戶端十分鐘發(fā)送一次請(qǐng)求,帶上序列號(hào),服務(wù)器端set('前綴.序列號(hào)',過(guò)期時(shí)間),然后服務(wù)器端統(tǒng)計(jì) keys 前綴*

可是你看keys之后的數(shù)據(jù)格式:

var_dump(); 

array (size=2)
 0 => string 'c_001dddddddddddddddddddddddddddddddd' (length=37)
 1 => string 'c_001ddddddddddddddddddddddddddddddddd' (length=38)
 print_r();
 Array( [0] => c_001dddddddddddddddddddddddddddddddd [1] => c_001ddddddddddddddddddddddddddddddddd)

數(shù)據(jù)keys *之后數(shù)據(jù)格式亂糟糟的,不是數(shù)組,根本沒有辦法處理。也許可以把他看成一個(gè)文件,然后正則匹配,再出處理,可是這樣有多慢呢,keys *本來(lái)就有些慢,還存入文件,正則匹配,然后循環(huán),獲取數(shù)組長(zhǎng)度,就更加慢了。

keys *之后出來(lái)是列表吧,更本不是數(shù)字,redis也沒有這種獲取某個(gè)特殊的鍵前綴的數(shù)量的函數(shù)。

如果APP就一個(gè)的話,大家可以把這個(gè)鍵值存儲(chǔ)到一個(gè)庫(kù)里面,然后用dbsize()直接獲取庫(kù)數(shù)量,這個(gè)庫(kù)不存儲(chǔ)其他的鍵值。

可是現(xiàn)在我要統(tǒng)計(jì)六個(gè)APP的在線情況,不可能一個(gè)APP存儲(chǔ)一個(gè)庫(kù)吧

2:利用序列,

$date = date("Ymdh",time()); $this->_cache->sadd($date.$head,$client,7200);

獲取當(dāng)前時(shí)間,之后加上客戶端類型前綴,作為鍵,存入序列,本次方法是一個(gè)小時(shí)存取一次,就是一個(gè)小時(shí)之內(nèi)的都算在線人數(shù),具體多久算在線人數(shù),大家可以自我把握。

存的時(shí)候:

$date = date("Ymdh",time());

$this->_cache->sadd($date.$head,$client,7200);//存入集合 1個(gè)小時(shí)存入一次

取數(shù)量的時(shí)候

$date = date("Ymdh",time());//當(dāng)前時(shí)間
$hour = date("Ymdh",time()-3600);//上一個(gè)小時(shí)時(shí)間
$score = date("i",time());//當(dāng)前時(shí)間分?jǐn)?shù)
$datedata= $this->_cache->scard($date.$head);//這個(gè)小時(shí)數(shù)量
$hourdata= $this->_cache->scard($hour.$head);//上個(gè)小時(shí)數(shù)量
if($score == '00'){
 $online = $hourdata;//如果當(dāng)前時(shí)間是整點(diǎn),那么一個(gè)小時(shí)人數(shù),就是上個(gè)小時(shí)人數(shù)
}else{
 $online = intval(((60-$score)/60)*$hourdata)+ $datedata;//如果不是整點(diǎn),那么計(jì)算當(dāng)前多少分鐘,當(dāng)前的數(shù)量,加上上個(gè)小時(shí)比例數(shù)量 湊夠一個(gè)小時(shí)數(shù)量
}

$online就是在線數(shù)量

補(bǔ)充知識(shí):redis命中率計(jì)算

redis提供了INFO這個(gè)命令,能夠隨時(shí)監(jiān)控服務(wù)器的狀態(tài),只用telnet到對(duì)應(yīng)服務(wù)器的端口,執(zhí)行命令即可:

telnet localhost 6379

info

在輸出的信息里面有這幾項(xiàng)和緩存的狀態(tài)比較有關(guān)系:

keyspace_hits:14414110
keyspace_misses:3228654
used_memory:433264648
expired_keys:1333536
evicted_keys:1547380

通過(guò)計(jì)算hits和miss,我們可以得到緩存的命中率:14414110 / (14414110 + 3228654) = 81% ,一個(gè)緩存失效機(jī)制,和過(guò)期時(shí)間設(shè)計(jì)良好的系統(tǒng),命中率可以做到95%以上

有個(gè)ruby gem叫redis-stat,它利用INFO命令展現(xiàn)出更直觀的信息報(bào)表,推薦:

https://github.com/junegunn/redis-stat

以上這篇redis統(tǒng)計(jì)APP在線人數(shù)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

定州市| 进贤县| 铁岭县| 杭锦旗| 余干县| 广饶县| 绥宁县| 黄冈市| 肇源县| 三江| 元氏县| 昌江| 衡阳市| 喀喇沁旗| 乌拉特中旗| 长宁县| 蕉岭县| 武清区| 梅州市| 南和县| 日照市| 巴彦县| 色达县| 双城市| 廉江市| 崇信县| 顺昌县| 静宁县| 扎赉特旗| 大关县| 龙泉市| 剑川县| 阜阳市| 新龙县| 城步| 厦门市| 壶关县| 卫辉市| 湄潭县| 永清县| 临颍县|