redis統(tǒng)計(jì)APP在線人數(shù)的實(shí)例
最近有個(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ù)組,根本沒(méi)有辦法處理。也許可以把他看成一個(gè)文件,然后正則匹配,再出處理,可是這樣有多慢呢,keys *本來(lái)就有些慢,還存入文件,正則匹配,然后循環(huán),獲取數(shù)組長(zhǎng)度,就更加慢了。
keys *之后出來(lái)是列表吧,更本不是數(shù)字,redis也沒(méi)有這種獲取某個(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è)參考,也希望大家多多支持腳本之家。
- 解決RedisTemplate調(diào)用increment報(bào)錯(cuò)問(wèn)題
- window環(huán)境redis通過(guò)AOF恢復(fù)數(shù)據(jù)的方法
- Docker 部署Mysql 服務(wù)和Redis 服務(wù)的方法
- 利用spring-data-redis實(shí)現(xiàn)incr自增的操作
- 基于Redis位圖實(shí)現(xiàn)系統(tǒng)用戶登錄統(tǒng)計(jì)
- 使用redis的increment()方法實(shí)現(xiàn)計(jì)數(shù)器功能案例
- Redis密碼設(shè)置與訪問(wèn)限制實(shí)現(xiàn)方法
相關(guān)文章
SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn)
本文主要介紹了SpringBoot集成Lettuce客戶端操作Redis的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11Spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用
這篇文章主要介紹了spring boot2X Consul如何使用Feign實(shí)現(xiàn)服務(wù)調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼
這篇文章主要介紹了Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11Java 遞歸查詢部門樹(shù)形結(jié)構(gòu)數(shù)據(jù)的實(shí)踐
本文主要介紹了Java 遞歸查詢部門樹(shù)形結(jié)構(gòu)數(shù)據(jù)的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09IDEA常量字符串過(guò)長(zhǎng)問(wèn)題及解決方案
在編譯Java項(xiàng)目時(shí)遇到“常量字符串過(guò)長(zhǎng)”錯(cuò)誤,可以通過(guò)修改編譯器設(shè)置解決,具體方法是進(jìn)入IDE的設(shè)置(File>>Settings>>Build, Execution, Deployment>>Compiler>>Java Compiler),將使用的編譯器更改為Eclipse,如果問(wèn)題依舊2024-10-10詳解springboot 使用c3p0數(shù)據(jù)庫(kù)連接池的方法
本篇文章主要介紹了springboot 使用c3p0數(shù)據(jù)庫(kù)連接池的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09一個(gè)依賴搞定?Spring?Boot?接口防盜刷的流程分析
kk-anti-reptile 是適用于基于 spring-boot 開(kāi)發(fā)的分布式系統(tǒng)的反爬蟲(chóng)組件,這篇文章主要介紹了一個(gè)依賴搞定?Spring?Boot?接口防盜刷,需要的朋友可以參考下2022-06-06利用反射實(shí)現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對(duì)象功能
將Excel或CSV文件轉(zhuǎn)換為Java對(duì)象(POJO)以及將Java對(duì)象轉(zhuǎn)換為Excel或CSV文件可能是一個(gè)復(fù)雜的過(guò)程,但如果使用正確的工具和技術(shù),這個(gè)過(guò)程就會(huì)變得十分簡(jiǎn)單,在本文中,我們將了解如何利用一個(gè)Java反射的庫(kù)來(lái)實(shí)現(xiàn)這個(gè)功能,需要的朋友可以參考下2023-11-11