今回は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 件のコメント:
コメントを投稿