基于express+redis高速实现实时在线用户数统计

  作者:zhanhailiang 日期:2014-11-09

本文将介绍怎样基于express+redis高速实现实时在线用户数统计。

1. 在github.com上创建项目uv-tj。将其同步到本地:

[root@~/wade/nodejs]# git clone [email protected]:billfeller/uv-tj.git

2. 使用npm init初始化node项目(本例不须要复杂的操作,所以暂不使用express工具来生成express应用程序骨架):

[root@~/wade/nodejs/uv-tj]# npm init

3. 向package.json加入应用程序启动命令。例如以下:

{
  "name": "uv-tj",
  "version": "1.0.0",
  "description": "uv tj demo",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/billfeller/uv-tj.git"
  },
  "keywords": [
    "uv",
    "tj",
    "demo"
  ],
  "author": "billfeller",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/billfeller/uv-tj/issues"
  },
  "homepage": "https://github.com/billfeller/uv-tj",
  "dependencies": {
    "express": "^4.10.1",
    "redis": "^0.12.1"
  }
}

4. 加入app.js文件。代码例如以下:

// 创建express对象和一个redisclient连接
var express = require(‘express‘);
var redis = require(‘redis‘);
var db = redis.createClient();
var app = express();
 
// 纪录用户在线的中间件
// 这里使用user-agent作为用户标识符
// 这里使用sorted sets,以便查询近期N毫秒内在线的用户;
app.use(function(req, res, next) {
    var ua = req.headers[‘user-agent‘];
    db.zadd(‘online‘, Date.now(), ua, next);
});
 
// 通过 zrevrangebyscore 来查询上一分钟在线用户。
// 我们将能得到从当前时间算起在 60,000 毫秒内活跃的用户。

app.use(function(req, res, next) {
    var min = 60 * 1000;
    var ago = Date.now() - min;
    db.zrevrangebyscore(‘online‘, ‘+inf‘, ago, function (err, users) {
        if (err) {
            return next (err);
        }
 
        req.online = users;
        next ();
    });
});
 
// 从不同浏览器进入就能够看到同一时候在线用户数不断添加
app.get(‘/‘, function(req, res){
    res.send(req.online.length + ‘ users online‘);
});
 
app.listen(3000);

5. 启动应用程序:

[root@~/wade/nodejs/uv-tj]# npm start
 
> uv-tj@1.0.0 start /root/wade/nodejs/uv-tj
> node app.js

訪问结果例如以下:

6. 总结:

使用此方法能够非常方便计算相似的统计量,如PV,UV。订单数等等。

个人觉得涉及计数器的需求都能够通过此方案来解决

7. 完整代码请见:

8. 推荐阅读:

时间: 2024-10-10 04:54:32

基于express+redis高速实现实时在线用户数统计的相关文章

基于swoole+Redis的消息实时推送通知

swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos6.10 redis-4.0.2 swoole-src-4.4.12 php-7.1.5 MYsyql5.7 在centos6默认是gcc-4.7,安装swoole的时候需要升级到gcc-4.8 二 实现流程 1.开启swoole server端监听 2.开启swoole client连接执行定时执

实时在线查询sql

场景:经过处理入库的记录都是当时在线的用户数,即一个唯一的uuid就可以表示这是一个当时的在线用户.现在要求查询出 实时在线用户数,这个"实时"肯定是最近的一个时间区间.我们取这个时间区间为5分钟. 数据也是5分钟入一次库.更精确的说法是,我们的"实时数据"是最近一次完整的5分钟区间.为什么要强调完整呢?因为入库的 时间并不能和刷新的时间做到同步,有可能页面正在刷新数据的时候,此时最近一次还没有完全入库.假设最后一次5分钟end5min 和倒数第二个5分钟last5

并发和在线用户数的思考

首先,在线用户数和并量之间的关系 需要搞清楚. 根据先思考业务,得出业务特点 在系统架构时期不要着急去想那个地方会是瓶颈,怎么去优化,而是先根据业务逻辑进行分析系统的特点如下, 业务的特点如是否上班时间使用? 业务处理是否集中在某个固定的时间点,如早上9点为高峰期,临下班10分钟为高峰期? 在线用户的活动特点,是半小时都不动,还是会不停的操作? 操作的内容是什么有什么特点,是集中的系统的某一个模块还是整个系统平均承担点击? 用户主要获取的内容是什么,纯文本.图片.视频? 系统需要具备什么的服务水

“并发用户数”、“系统用户数”和“同时在线用户数”的计算公式

与并发用户数相关的概念还包括“并发用户数”.“系统用户数”和“同时在线用户数”,下面用一个实际的例子来说明它们之间的差别.         假设有一个OA系统,该系统有2000个使用用户——这就是说,可能使用该OA系统的用户总数是2000名,这个概念就是“系统用户数”,该系统有一个“在线统计”功能(系统用一个全局变量记数所有已登录的用户),从在线统计功能中可以得到,最高峰时有500人在线(这个500就是一般所说的“同时在线人数”),那么,系统的并发用户数是多少呢?         根据我们对业务

关于系统用户数,并发用户数,在线用户数,吞吐量

1.  关于系统用户数,并发用户数和在线用户数 系统用户数 侠义上来说,可以理解为系统注册用户数:广义上来说,可以理解为所有访问过系统的用户数 在线用户数 侠义上来说,可以理解为已登录系统的用户数:广义来说,可以理解为当前时间访问系统的用户数. 并发用户数 可以分两种: 1)同一时间点,执行同一(业务)操作的用户数 2)同一时间点,执行不同(业务)操作的用户数 注意:服务器实际承受的压力并不完全取决于并发用户数,详情见下面的例子. 例子(以51测试论坛为例): 作为专业软件测试论坛,会有很多测试

基于matlab的音频波形实时采集显示 v0.1

robj = audiorecorder(44100,16,1); %设置采样频率.采样位数.通道数 recordblocking(robj,1); %采集初步数据(1s长度) rdata = getaudiodata(robj); %获取音频数据 plot(rdata); %绘制波形 axis([1,44100,-0.1,0.1]); %设置固定坐标轴 drawnow %刷新显示 n = 100; %设定后续的采样更新次数,n与m可联合计算后续更新时间长度 m = 0.1; %设定更新间隔,m

sersync基于rsync+inotify实现数据实时同步

一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192.168.1.243 实时同步/var/atlassian目录到从服务器. 二.实施 1.从服务器192.168.1.243 rsync服务搭建 1.1安装软件包 wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz tar xf r

车道线检测文献解读系列(一) 基于机器视觉的高速车道标志线检测算法的研究_李晗

作者背景 基于机器视觉的高速车道标志线检测算法的研究_李晗 东北大学车辆工程硕士学位论文 2006年 [GB/T 7714]李晗. 基于机器视觉的高速车道标志线检测算法的研究[D]. 东北大学, 2006. DOI:10.7666/d.y852642.` 论文结构一览 预处理 灰度化 [亮点]模式判别 选择日间模式还是夜间模式: 在每个检测周期开始时,首先判断采用日间模式还是夜间模式工作.摄像机视野中的上半部分为天空背景,天空亮度可以显著区分日间和夜间环境.由于天空的颜色为蓝离,日间天空的蓝色分

【性能优化】懒、懒加载、懒动画 --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调

/* * * 扩展jq原型: 懒.懒加载.懒动画 * --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调 * * $jq.viewChange( {top:100,bottom:100,change:function(status){}} ) --- status: 'in'/'out' * $jq.viewChange('off') * * $jq[n].viewChange.status = 'in'/'out' ----- 状态为'