2014年1月6日月曜日

Nodejs+ExpressでRedisを使うサンプル。

前回からの続き。
今回は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 件のコメント:

コメントを投稿