redis统计APP在线人数的实例

作者:宛十八 时间:2023-11-24 23:56:54 

最近有个需求,需要统计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:14414110
keyspace_misses:3228654
used_memory:433264648
expired_keys:1333536
evicted_keys:1547380

通过计算hits和miss,我们可以得到缓存的命中率:14414110 / (14414110 + 3228654) = 81% ,一个缓存失效机制,和过期时间设计良好的系统,命中率可以做到95%以上

有个ruby gem叫redis-stat,它利用INFO命令展现出更直观的信息报表,推荐:

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

来源:https://blog.csdn.net/kdchxue/article/details/51023183

标签:redis,在线,人数
0
投稿

猜你喜欢

  • Java switch关键字原理及用法详解

    2023-04-16 23:29:49
  • SpringBoot注入自定义的配置文件的方法详解

    2021-12-24 02:28:06
  • Flutter实现笑嘻嘻的动态表情的示例代码

    2023-02-13 21:39:51
  • C# 使用Fiddler捕获本地HttpClient发出的请求操作

    2022-06-28 04:10:34
  • Java操作Redis详细介绍

    2023-07-27 06:53:04
  • 深入了解Hadoop如何实现序列化

    2023-10-13 10:33:43
  • Mybatis-plus实现主键自增和自动注入时间的示例代码

    2022-11-05 00:22:51
  • c# 进程和线程的区别与联系

    2023-05-04 23:18:36
  • Java 使用poi把数据库中数据导入Excel的解决方法

    2022-09-19 14:18:52
  • 解决idea check out 切换分支时找不到需要的分支问题

    2023-04-04 09:12:57
  • 详解JAVA 弱引用

    2022-03-12 01:30:29
  • 详解JAVA中的Collection接口和其主要实现的类

    2021-06-20 19:14:08
  • 超详细的Intellij IDEA 看源码必备技能

    2021-10-27 09:03:16
  • Java泛型的使用限制实例分析

    2023-05-07 20:14:52
  • Java Kafka分区发送及消费实战

    2022-08-17 20:27:58
  • Android View自定义锁屏图案

    2021-11-21 14:48:20
  • IDEA新手必备之各种快捷键详解

    2023-02-13 15:27:31
  • springMVC利用FastJson接口返回json数据相关配置详解

    2023-02-24 10:51:58
  • C#中实现Json序列化与反序列化的几种方式

    2021-11-06 01:31:07
  • C#中Request.Cookies 和 Response.Cookies 的区别分析

    2023-07-10 07:24:59
  • asp之家 软件编程 m.aspxhome.com