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

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

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

[root@~/wade/nodejs]# git clone git@github.com: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. 推荐阅读:

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

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

    swoole+Redis将实时数据的推送 一 实现功能 设计师订单如果设计师未抢单,超时(5分钟)设计订单时时给设计师派送, 设计师公众号中收到派单信息 设计发布者收到派单成功信息 环境 centos ...

  2. 基于socket.io的实时在线选座系统

    基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...

  3. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  4. 基于tomcat获取在线用户数

    https://blog.csdn.net/smallnetvisitor/article/details/84697505 需求: 统计某应用的在线用户数 实现方案: 1.基于session监听(复 ...

  5. Feathers JS – 基于 Express 构建数据驱动的服务

    Feathers 是一个轻量的 Web 应用程序框架,基于 NodeJS 最流行​​的 Web 框架——Express.这使得它很容易使用 socket.io 来创建 RESTful Web 服务和实 ...

  6. websocket 无需通过轮询服务器的方式以获得响应 同步在线用户数 上线下线 抓包 3-way-handshake web-linux-shell 开发

    https://code.google.com/archive/p/phpwebsocket/source/default/source The WebSocket API (WebSockets) ...

  7. 基于express框架的应用程序骨架生成器介绍

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样使用express-generator工具高速生成基于express框架的应用程序骨架: 1. 安装express-gener ...

  8. 基于PCIe的高速接口设计

    基于PCIe的高速接口设计 由 judyzhong 于 星期四, 03/03/2016 - 13:49 发表 作者:李晓宁,姚远程,秦明伟 2016年微型机与应用第1期 摘要:PCIe总线是第三代I/ ...

  9. FPGA和DSP间基于SRIO的高速通信系统设计

    作者:陈婷,岳强,汪洋 解放军信息工程大学 摘要: 现代信号处理系统通常需要在不同处理器之间实现高速数据通信,SRIO协议由于高效率.低延时的特性被广泛使用.本文研究了在FPGA和DSP两种处理器之间 ...

随机推荐

  1. Ncomputering 安装及参数设置

    1.加域 2.添加用户:系统属性---远程

  2. ubuntu 装tensorflow出现 conda install ERROR missing write permission错误

    通过搜索tensorflow然后运行,例如:$ conda install --channel https://conda.anaconda.org/jjh_cio_testing tensorflo ...

  3. linux在线添加硬盘、扫盘

    1:查看scsi 硬盘设备[root@web02 ~]# ls /sys/class/scsi_host host0 host1 host2 2:检查本机现有硬盘 [root@web02 ~]# fd ...

  4. keepalived的功能及DR模式搭建笔记

    一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...

  5. 【codeforces 128C】Games with Rectangle

    [题目链接]:http://codeforces.com/problemset/problem/128/C [题意] 让你一层一层地在n*m的网格上画k个递进关系的长方形;(要求一个矩形是包含在另外一 ...

  6. Failed to initialize connector [Connector[HTTP/1.1-443]]

    Failed to initialize connector [Connector[HTTP/1.1-443]] 出现如上错误时,是因为443端口被占用, 所以tomcat的https协议无法使用, ...

  7. Qt之QTimer

    简述 QTimer类提供了重复和单次触发信号的定时器. QTimer类为定时器提供了一个高级别的编程接口.很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用sta ...

  8. Android面试精华

    SIM卡的EF文件有什么作用? SIM卡里的全部文件按树来组织: 主文件MF(Master File)--主文件仅仅有文件头,里面存放着整个SIM卡的控制和管理信息 专用文件DF(Dedicated ...

  9. 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图

    [Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料   由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...

  10. 17.查找效率最高的unorderd_set(替代hash_set)

    #include <string> #include <iostream> //查询性能最高(不允许重复数据) #include <unordered_set> u ...