今回はNode.js + Expressな環境でKey-ValueストアのRedisを使い、「今アクセスしている人の合計を表示」するだけの簡単なWebサービスを作ってみましょう。
Redisのインストール
$ sudo apt-get install redis-server
$ redis-server -v
Redis server v=2.6.13 sha=00000000:0 malloc=jemalloc-3.3.1 bits=64インストールが完了すると redis-server が自動起動していると思います。package.jsonの編集
hello-world/package.json
{
"name": "hello-world",
"description": "hello world test app",
"version": "0.0.1",
"private": true,
"dependencies": {
"express": "3.x",
"redis": "*"
}
}dependenciesに "redis" を追加しました。npmインストール
$ cd hello-world $ npm installアプリで使用するモジュールをnpmインストールします。
app.jsの編集
hello-world/app.js
var express = require('express');
var redis = require('redis');
var db = redis.createClient();
var app = express();
// Add timestamp as SCORE, "online" as KEY, and user-agent as MEMBER
app.use(function(req, res, next){
var ua = req.headers['user-agent'];
db.zadd('online', Date.now(), ua, next);
});
// Get total of user-agents who accessed within 60 seconds
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);ソース・レビュー:1番目のミドルウェア(app.use)の db.zadd('online', Date.now(), ua, next) では、 KEY="online", MEMBER=user-agent でタイムスタンプ(Date.now)を登録しています。
そして、2番目のミドルウェアの db.zrevrangebyscore('online', '+inf', ago, function(err, users){...}) では、タイムスタンプ最大(+inf)から○秒(ago)以内のUA一覧を取得し、リクエストパラメータ"online"にセットしています。
アプリを起動
$ nodejs app
アプリを起動したら、複数のブラウザから http://localhost:3000 へアクセスしてみましょう。ブラウザに「2 users online」といったように表示されると思います。
Redisを制御
redis-serverは sudo /etc/init.d/redis-server (stop|start|restart) で制御できます。
ちなみに、redisのデータ保存場所は、デフォルトだと /var/lib/redis/dump.rdb です。
さて次回はテンプレートエンジンEJSの使い方をご紹介したいと思います。
0 件のコメント:
コメントを投稿