redis统计APP在线人数的实例

 更新时间:2020年11月24日 11:16:16   作者:宛十八  
这篇文章主要介绍了redis统计APP在线人数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近有个需求,需要统计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

以上这篇redis统计APP在线人数的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java打印出菱形图案实例详解

    java打印出菱形图案实例详解

    在本篇文章里小编给大家分享的是关于java打印出菱形图案实例详解,需要的朋友们可以学习下。
    2020-02-02
  • Java实现简单的扫雷图

    Java实现简单的扫雷图

    这篇文章主要为大家详细介绍了Java实现简单的扫雷图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • SpringBoot集成Lettuce客户端操作Redis的实现

    SpringBoot集成Lettuce客户端操作Redis的实现

    本文主要介绍了SpringBoot集成Lettuce客户端操作Redis的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Spring boot2X Consul如何使用Feign实现服务调用

    Spring boot2X Consul如何使用Feign实现服务调用

    这篇文章主要介绍了spring boot2X Consul如何使用Feign实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java实现将文件或者文件夹压缩成zip的详细代码

    Java实现将文件或者文件夹压缩成zip的详细代码

    这篇文章主要介绍了Java实现将文件或者文件夹压缩成zip的详细代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • Java 递归查询部门树形结构数据的实践

    Java 递归查询部门树形结构数据的实践

    本文主要介绍了Java 递归查询部门树形结构数据的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • IDEA常量字符串过长问题及解决方案

    IDEA常量字符串过长问题及解决方案

    在编译Java项目时遇到“常量字符串过长”错误,可以通过修改编译器设置解决,具体方法是进入IDE的设置(File>>Settings>>Build, Execution, Deployment>>Compiler>>Java Compiler),将使用的编译器更改为Eclipse,如果问题依旧
    2024-10-10
  • 详解springboot 使用c3p0数据库连接池的方法

    详解springboot 使用c3p0数据库连接池的方法

    本篇文章主要介绍了springboot 使用c3p0数据库连接池的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 一个依赖搞定 Spring Boot 接口防盗刷的流程分析

    一个依赖搞定 Spring Boot 接口防盗刷的流程分析

    kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的反爬虫组件,这篇文章主要介绍了一个依赖搞定 Spring Boot 接口防盗刷,需要的朋友可以参考下
    2022-06-06
  • 利用反射实现Excel和CSV 转换为Java对象功能

    利用反射实现Excel和CSV 转换为Java对象功能

    将Excel或CSV文件转换为Java对象(POJO)以及将Java对象转换为Excel或CSV文件可能是一个复杂的过程,但如果使用正确的工具和技术,这个过程就会变得十分简单,在本文中,我们将了解如何利用一个Java反射的库来实现这个功能,需要的朋友可以参考下
    2023-11-11

最新评论