iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP+REDIS如何统计在线人数
  • 236
分享到

PHP+REDIS如何统计在线人数

2023-06-14 05:06:41 236人浏览 泡泡鱼
摘要

小编给大家分享一下PHP+REDIS如何统计在线人数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在线人数统计业务是我们开发WEB肯定要设计的业务逻辑,本文就会给

小编给大家分享一下PHP+REDIS如何统计在线人数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在线人数统计业务是我们开发WEB肯定要设计的业务逻辑,本文就会给出几种设计方案,来分析下各个方案的优缺点:

这种方案能够同时储存在线的用户 和 用户上线时间,能够执行非常多的聚合计算,但是所消耗的内存也是非常可观的。

  • 使用集合

这种方案能储存在线的用户,也能够执行一定的聚合计算,相对有序集合,所消耗的内存要小些,但是随着用户量的增多,消耗内存空间也处于增加状态

  • 使用hyperloglog

这种方案无论统计多少在线用户, 消耗的内存都是12k,但是只能给出在线用户的统计信息,无法获取准确的在线用户名单

  • 使用bitmap

这种方案还是比较好的,在尽可能节省内存空间情况下,记录在线用户的情况,而且能做一定的聚合运算

下面我们就用实际例子来说明:

我们先以每天会有10w~30w的小量用户, 100w的用户群来说明下面的几种方案

方案一:使用有序集合

先生成用户在线记录数据:

$start_time = mktime(0, 0, 0, 9, 5);    //mondayfor ($i=0; $i < 6; $i++) {    $day_start_time  = $start_time + 86400 * $i;    //every day begin time    $day_end_time =  $day_start_time + 86400;       //every day end time    $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000     for ($j=1; $j < $online_user_num; $j++) {         $user_id = mt_rand(1, 1000000);        $Redis->zadd('000|online_users_day_'.$i, mt_rand($day_start_time, $day_end_time), $user_id);    }}

好了记下来我们就来看看都能统计出哪些信息来吧

//note: 统计每天的在线总人数for ($i=0; $i < 6; $i++) {     print_r($redis->zsize('000|online_users_day_'.$i). "\n");}//note: 统计最近6天都在线的人数var_dump($redis->zInter('000|online_users_day_both_6',     [    '000|online_users_day_0',     '000|online_users_day_1',     '000|online_users_day_2',     '000|online_users_day_3',     '000|online_users_day_4',     '000|online_users_day_5'    ]    ));//note: 统计出近6天中共有多少上线$redis->zuNIOn('000|online_users_day_total_6', ['000|online_users_day_0', '000|online_users_day_1', '000|online_users_day_2', '000|online_users_day_3', '000|online_users_day_4', '000|online_users_day_5']);//note: 统计某个时间段总共在线用户print_r($redis->zcount('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10)));//note: 统计某个时间段在线用户名单print_r($redis->zrangebyscore('000|online_users_day_5', mktime(13, 0, 0, 9, 10), mktime(14, 0, 0, 9, 10),     array('withscores' => TRUE)));

不单单只有这些, 我们还能统计出早, 中, 午, 晚 等等时间段的用户在线情况,还有很多其他的,这就让我们发挥想象吧,是不是挺多的?只是确实也相当耗费内存空间

【推荐:php视频教程

方案二:使用集合

还是先来成用户在线记录数据:

//note set 一般聚合for ($i=0; $i < 6; $i++) {    $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000     for ($j=1; $j < $online_user_num; $j++) {         $user_id = mt_rand(1, 1000000);        $redis->sadd('001|online_users_day_'.$i, $user_id);    }}

好了记下来我们就来看看都能统计出哪些信息来吧

//note 判断某个用户是否在线var_dump($redis->sIsMember('001|online_users_day_5', 100030));//note 每天在线用户总量的统计for ($i=0; $i < 6; $i++) {     print_r($redis->ssize('001|online_users_day_'.$i). "\n");}//note 对不同时间段的在线用户名单进行聚合print_r($redis->sInterStore('001|online_users_day_both_4and5', '001|online_users_day_4', '001|online_users_day_5'). "\n");//note 对指定的时间段的在线用户名单进行统计print_r($redis->sUnionStore('001|online_users_day_total_4add5', '001|online_users_day_4', '001|online_users_day_5'). "\n");//note 哪天上线哪天没上线print_r($redis->sDiffStore('001|online_users_day_diff_4jian5', '001|online_users_day_4', '001|online_users_day_5'). "\n");

是不是也挺不错的,先不要着急, 我们接着往下看

方案三:使用hyperloglgo

先来成用户在线记录数据:

// note HyperLogLog 只需要知道在线总人数for ($i=0; $i < 6; $i++) {    $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000     var_dump($online_user_num);    for ($j=1; $j < $online_user_num; $j++) {         $user_id = mt_rand(1, 1000000);        $redis->pfadd('002|online_users_day_'.$i, [$user_id]);    }}

这种方案,我们来看看都能实现哪些业务呢

$count = 0;for ($i=0; $i < 3; $i++) {     $count += $redis->pfcount('002|online_users_day_'.$i);    print_r($redis->pfcount('002|online_users_day_'.$i). "\n");}var_dump($count);//note  3 days total online numvar_dump($redis->pfmerge('002|online_users_day_both_3', ['002|online_users_day_0', '002|online_users_day_1', '002|online_users_day_2']));var_dump($redis->pfcount('002|online_users_day_both_3'));

好少啊,是的, 这种方案仅仅只能统计出某个时间段在线人数的总量, 对在线用户的名单却无能为力,但是却挺节省内存的,对统计数据要求不多情况下 ,我们便可以考虑这种方案。

方案四:使用bitmap

笔者对这种方案其实挺喜欢的,消耗的内存空间不多, 统计的信息却挺多的,还是老步骤,先来生成数据:

//note bitmap 综合前面3个的优缺点for ($i=0; $i < 6; $i++) {    $online_user_num = mt_rand(100000, 300000);     //online user between 100000 and 300000     for ($j=1; $j < $online_user_num; $j++) {         $user_id = mt_rand(1, 1000000);        $redis->setbit('003|online_users_day_'.$i, $user_id, 1);    }}

接下来我们看看能满足的统计信息吧

//note userid today whether online var_dump($userid = mt_rand(1, 1000000));var_dump($redis->getbit('003|online_users_day_5', $userid));//note how many user is onlinevar_dump($redis->bitcount('003|online_users_day_5'));//note 6 days both onlinevar_dump($redis->bitop('AND', '003|online_users_day_both_6', '003|online_users_day_0', '003|online_users_day_1', '003|online_users_day_2', '003|online_users_day_3', '003|online_users_day_4', '003|online_users_day_5'));var_dump($redis->bitcount('003|online_users_day_both_6'));//note 6 days total onlinevar_dump($redis->bitop('OR', '003|online_users_day_total_6', '003|online_users_day_0', '003|online_users_day_1', '003|online_users_day_2', '003|online_users_day_3', '003|online_users_day_4', '003|online_users_day_5'));var_dump($redis->bitcount('003|online_users_day_total_6'));//note 6 days only one onlinevar_dump($redis->bitop('XOR', '003|online_users_day_only_one_6', '003|online_users_day_0', '003|online_users_day_1', '003|online_users_day_2', '003|online_users_day_3', '003|online_users_day_4', '003|online_users_day_5'));var_dump($redis->bitcount('003|online_users_day_only_one_6'));

怎么样?是不是集合能统计的 这家伙也能统计出来?而且消耗的内容还少。

对于这几种方案其实各有各的好处, 根据业务统计信息 来取相应的方案来实施吧,这样内存利用也就更合理了

以上是“PHP+REDIS如何统计在线人数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: PHP+REDIS如何统计在线人数

本文链接: https://www.lsjlt.com/news/268426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP+REDIS如何统计在线人数
    小编给大家分享一下PHP+REDIS如何统计在线人数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在线人数统计业务是我们开发web肯定要设计的业务逻辑,本文就会给...
    99+
    2023-06-14
  • 如何用PHP来统计在线人数
    今天小编给大家分享一下如何用PHP来统计在线人数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 用表统计方式用数据表统计在...
    99+
    2023-07-02
  • PHP四种统计在线人数方式详细介绍
    目录1 用表统计方式2 使用 redis 有序集合实现在线人数统计3 使用 hyperloglog 做统计4 使用 bitmap 统计1 用表统计方式 用数据表统计在线人数,这种方式...
    99+
    2024-04-02
  • JavaWeb Listener 利用Session统计在线人数
    目录一.监听器Listener1.1 Listener的作用1.2 小demo之统计在线人数1.3 统计结果错误原因分析一.监听器Listener 1.1 Listener的作用 L...
    99+
    2024-04-02
  • 如何提升 Discuz 论坛在线人数统计的准确性
    提升 Discuz 论坛在线人数统计的准确性 Discuz 是一款功能强大的论坛系统,广泛应用于各大网站社区。在 Discuz 论坛中,在线人数统计是一个非常重要的指标,可以帮助管理员...
    99+
    2024-03-11
    优化在线人数统计 修复统计错误 论坛在线人数
  • java如何统计当前在线数
    这篇文章主要介绍了java如何统计当前在线数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java统计当前在线数package com.hnedu.stat;import J...
    99+
    2023-06-03
  • PHP之使用swoole统计在线人数和ID案例讲解
    $server->connections // s e ...
    99+
    2024-04-02
  • java web监听器统计在线用户及人数
    在线用户使用HttpSessionListener监听器统计  每当一个session会话建立  在线用户人数+1每当一个session会话销毁 在线用户人数-1使用ServletRequestListener监听器统计...
    99+
    2023-05-31
    java 统计 人数
  • Discuz 在线人数统计功能的设置技巧
    Discuz 在线人数统计功能的设置技巧,需要具体代码示例 随着互联网的发展,网站的在线人数统计功能逐渐成为了网站管理者必备的功能之一。Discuz 是一款非常流行的论坛程序,其在线人...
    99+
    2024-03-10
    数据更新 页面显示 在线人数统计: 统计设置 地理位置
  • SpringSession怎么通过Redis统计在线用户数量
    这篇“SpringSession怎么通过Redis统计在线用户数量”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring...
    99+
    2023-07-05
  • portlet中关于统计在线人数的示例分析
    小编今天带大家了解portlet中关于统计在线人数的示例分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“portlet中关于统计在...
    99+
    2023-06-03
  • Java实现统计在线人数功能的方法详解
    目录1. 监听器的简介2. Java监听器的类型(1)ServletContextListener(2)HttpSessionListener(3)ServletRequestLis...
    99+
    2024-04-02
  • SpringSession通过Redis统计在线用户数量的实现代码
    最近遇到一个比较紧急的任务,要求统计在线用户,目的是配合性能测评,要求证明自己系统的在线用户能够达标,不过系统因为历史原因,并没有这个功能,所以只能去springSession官网和网上搜资料,想到通过统计Redis里缓...
    99+
    2023-04-07
    Redis在线用户数量 SpringSession Redis在线用户
  • php如何统计数组个数
    在php中使用sizeof函数统计数组中元素的个数:sizeof函数是用于计算数组中元素的个数,语法:int sizeof(array,mode);在php中使用sizeof函数统计数组中元素的个数,具体方法如下:sizeof函数作用:ph...
    99+
    2024-04-02
  • SpringBoot使用Redis的zset统计在线用户信息
    目录在线用户统计的实现 基于数据库实现 基于Redis实现 Redis的Zset Zset的部分操作 一个示例 在线用户服务的实现 实现思路 使用示例内存消耗分析 最后 统计在线用户...
    99+
    2024-04-02
  • 怎么在SpringBoot中使用Redis统计在线用户信息
    怎么在SpringBoot中使用Redis统计在线用户信息?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springboot是什么springboot一种全新的...
    99+
    2023-06-14
  • 如何在线学习 PHP 函数?
    使用在线平台(如 w3schools、geeksforgeeks)学习 php 函数,从基本函数(如 echo)开始,逐步探索字符串、数组、日期函数,并练习实战案例(如使用 echo 打...
    99+
    2024-04-12
    函数 php
  • 如何在PHP中使用Redis函数
    Redis是一款高性能的内存数据库,常常被用于缓存、消息队列和会话存储等。而PHP是一种流行的Web编程语言,在实现以上特性时经常会使用Redis作为后端存储。本文将向读者介绍如何在PHP中使用Redis函数,代码示例将基于Redis版本5...
    99+
    2023-05-18
    函数 PHP redis
  • Redis在PHP中的应用:文章结束统计
    Redis是一种高性能的内存数据库,它具有快速响应、高并发、高可扩展性等优点,已经广泛应用于各种互联网应用场景中。而在PHP中,Redis也是非常流行的一种缓存和数据存储解决方案。本文就来介绍一下Redis在PHP中的应用,以及如何利用Re...
    99+
    2023-05-17
    PHP redis 统计。
  • 如何在PHP中实现在线投票系统?
    在现代社会,投票已成为一种非常重要的行为,它与民主、公正、公平等价值观息息相关,其重要性无需多言。对于许多网站和公司来说,为了收集用户群体的意见和决策,实现在线投票系统变得越来越必要。在这篇文章中,我们将会深入探讨如何在PHP中实现一个高效...
    99+
    2023-05-14
    PHP 实现 在线投票系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作