作者: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. 推荐阅读:

最新文章

  1. Codevs 1299 切水果
  2. eclipse安装JAVA反编译插件
  3. Aggregation(1):Blending、Bagging、Random Forest
  4. uboot官方FTP下载地址
  5. php杂乱
  6. Angular 小试牛刀[1]:Getting Started
  7. 微服务时代之2017年五军之战:Net PHP谁先死
  8. MVC发布网站
  9. 如何使用webapi集成swagger
  10. java的运算符和表达式
  11. Hadoop压缩
  12. Linux Git用户组
  13. PDO访问Mysql数据库
  14. Important persons in deep learning
  15. time,datetime模块
  16. es6 Promise 事件机制分析
  17. <低风险投资之路>读书笔记
  18. Complex Instance Placement
  19. 图解Python深拷贝和浅拷贝
  20. 聊聊Postgres中的IPC之SI Message Queue

热门文章

  1. BZOJ 2141 排队(CDQ分治)
  2. bytes、str与unicode
  3. 制作PC端的安装程序
  4. C语言变量名转字符串的方法
  5. 在AutoLyout中动态获得cell的高度 和 autoLyout中的小随笔
  6. hdu 1075 What Are You Talking About(map)
  7. 三步实现沉浸式状态栏(即状态栏与APP同色)
  8. MongoDB Shell (mongo)
  9. dns-sd._udp.<domain>. 域名发现 本质和MDNS同
  10. Glide加载圆形图片第一次只显示默认图片