作者: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
访问结果如下:
6. 总结:
使用此方法可以很方便计算相似的统计量,如PV,UV,订单数等等。个人认为涉及计数器的需求都可以通过此方案来解决。
7. 完整代码请见:
8. 推荐阅读: