基於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. 完整代碼請見:
- https://github.com/billfeller/uv-tj
8. 推薦閱讀:
- http://www.expressjs.com.cn/guide.html#users-online
基於express+redis高速實現實時在線用戶數統計