基于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对象和一个redis客户端连接
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

访问结果如下:

基于express+redis快速实现实时在线用户数统计_第1张图片

6. 总结:

使用此方法可以很方便计算相似的统计量,如PV,UV,订单数等等。个人认为涉及计数器的需求都可以通过此方案来解决

7. 完整代码请见:

  • https://github.com/billfeller/uv-tj

8. 推荐阅读:

  • http://www.expressjs.com.cn/guide.html#users-online

你可能感兴趣的:(基于express+redis快速实现实时在线用户数统计)