时间:2021-05-19
最近有个需求,需要统计APP的在线人数,其实以前也统计过,采取的是上线发送一个请求$this->cache->incr()加1,下线的时候$this->cache->decr()减1,可是这样做的后果是,发现在线人数错的离谱,几千人同是在线。
why?原来APP端如果卸载的时候,那么就不会发请求,还有如果非正常终止的时候,也不会发送下线请求?
于是乎找一个准备的统计方式
1:客户端十分钟发送一次请求,带上序列号,服务器端set('前缀.序列号',过期时间),然后服务器端统计 keys 前缀*
可是你看keys之后的数据格式:
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)数据keys *之后数据格式乱糟糟的,不是数组,根本没有办法处理。也许可以把他看成一个文件,然后正则匹配,再出处理,可是这样有多慢呢,keys *本来就有些慢,还存入文件,正则匹配,然后循环,获取数组长度,就更加慢了。
keys *之后出来是列表吧,更本不是数字,redis也没有这种获取某个特殊的键前缀的数量的函数。
如果APP就一个的话,大家可以把这个键值存储到一个库里面,然后用dbsize()直接获取库数量,这个库不存储其他的键值。
可是现在我要统计六个APP的在线情况,不可能一个APP存储一个库吧
2:利用序列,
$date = date("Ymdh",time()); $this->_cache->sadd($date.$head,$client,7200);
获取当前时间,之后加上客户端类型前缀,作为键,存入序列,本次方法是一个小时存取一次,就是一个小时之内的都算在线人数,具体多久算在线人数,大家可以自我把握。
存的时候:
$date = date("Ymdh",time());
$this->_cache->sadd($date.$head,$client,7200);//存入集合 1个小时存入一次
取数量的时候
$date = date("Ymdh",time());//当前时间$hour = date("Ymdh",time()-3600);//上一个小时时间$score = date("i",time());//当前时间分数$datedata= $this->_cache->scard($date.$head);//这个小时数量$hourdata= $this->_cache->scard($hour.$head);//上个小时数量if($score == '00'){ $online = $hourdata;//如果当前时间是整点,那么一个小时人数,就是上个小时人数}else{ $online = intval(((60-$score)/60)*$hourdata)+ $datedata;//如果不是整点,那么计算当前多少分钟,当前的数量,加上上个小时比例数量 凑够一个小时数量}$online就是在线数量
补充知识:redis命中率计算
redis提供了INFO这个命令,能够随时监控服务器的状态,只用telnet到对应服务器的端口,执行命令即可:
telnet localhost 6379
info
在输出的信息里面有这几项和缓存的状态比较有关系:
keyspace_hits:14414110keyspace_misses:3228654used_memory:433264648expired_keys:1333536evicted_keys:1547380通过计算hits和miss,我们可以得到缓存的命中率:14414110 / (14414110 + 3228654) = 81% ,一个缓存失效机制,和过期时间设计良好的系统,命中率可以做到95%以上
有个ruby gem叫redis-stat,它利用INFO命令展现出更直观的信息报表,推荐:
https://github.com/junegunn/redis-stat
以上这篇redis统计APP在线人数的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP实现统计在线人数的方法。分享给大家供大家参考,具体如下:我记得ASP里面统计在线人数用application这个对象就可以了。PHP怎么设计
一个统计当前在线用户的解决方案在做一个在线交流的网站时,有个问题很令我头疼,就是关于实时统计在线用户的问题,客户要求:统计当前在线人数、游客人数、会员人数、在线
可以实现在线人数统计,日访问量统计,月访问量统计。。。。。
本文实例讲述了php模仿aspApplication对象在线人数统计实现方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下:/*用法:applica
本文实例讲述了jsp利用application统计在线人数的方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下:application简单的页面访问