- Node.js 是一套用来编写非阻塞高性能网络服务器的JavaScript工具包。
- Redis 是一个高性能的key-value数据库,我们可以用它来高速存取session。
- Express 是一套流行的 Node.js 网站服务器框架。
首先下载所需的文件:
- 首先下载Windows版本的Node.js,到官网下载:http://nodejs.org/download 我的系统是Windows 8 x64,因此选择的 node-v0.10.0-x64.msi,运行安装程序安装到硬盘。
- 下载 Redis,到官网 http://redis.io/ 逛一圈发现,并没有Windows版本。原来Redis的Windows版本只有非官方版本,这样意为着不可靠吗?先看看谁发布的 -- Microsoft Open Technologies, Inc. (微软开放技术有限公司),有信心了吧。赶快去下载:https://github.com/MSOpenTech/redis。下载的是源代码,编译后的执行文件放在 /redis/bin/release/目录中的 redisbin.zip 和 redisbin64.zip 中。根据自己的操作系统选择下载解压到 D:\Redis中。(特别提醒:Windows版本仅适合于开发环境,并不适用于生产环境。)
- Express 官网网址是 http://expressjs.com,怎么下载安装呢?原来不需要我们下载。稍后讲怎么安装。
- 还缺什么?一个好用的文本编辑器。比如 Eclipse 都可以,我推荐一款小巧的代码编辑器,Sublime Text 2,看一下网站你就能感觉他的强大了。
下面介绍一个例子,使用express框架建立2个Node.js服务器,2个服务器之间,通过Redis保存Session,从而实现服务器的伸缩性。
D:\>npm install -g express //npm 是node.js的模块管理工具,此时安装express到全局区域
D:\>express -s -e redis.test //生成express工程文件目录,-s 代表使用session, -e 表示使用ejs模版
D:\>cd redis.test
D:\redis.test>
编辑自动生成的文件: package.json 第10-11行:
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "node app"
},
"dependencies": {
"express": "3.1.0",
"ejs": "*",
"connect-redis": "*"
}
}
在此目录中新建文件: settings.js
module.exports = {
redisHost: '127.0.0.1',
redisPort: 6379,
redisPrefix: 'site_sess_',
redisPass: '',
redisTtl: 30, //seccend
redisDb: 0,
sessionSecret: 'mypassword',
sessionTTL: 30
};
生成express网站架构:
D:\redis.test>npm install
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, settings = require('./settings')
, RedisStore = require('connect-redis')(express);
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
store: new RedisStore({
host: settings.redisHost,
port: settings.redisPort,
prefix: settings.redisPrefix,
ttl: settings.redisTtl,
pass: settings.redisPass,
db: settings.redisDb}),
secret: settings.sessionSecret,
// cookie: {domain: '.domain.com'},
}));
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
app.use(express.errorHandler());
});
app.get('/', routes.index);
app.get('/users', user.list);
app.get('/redisset',function(req,res){
req.session.user = 'George Chan';
res.send(req.session.user);
})
app.get('/redisget',function(req,res){
res.send("Username: " + req.session.user);
})
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
保持后复制 app.js 为 app1.js,修改第21行:
app.set('port', process.env.PORT || 3000);
为
app.set('port', process.env.PORT || 3001);
下面开始运行测试:
- 启动Redis服务:进入D:\Redis 因为没有建立配置文件 redis.conf ,因此直接运行redis-server.exe后,默认端口为 6379。
- 启动Redis命令行:运行 redis-cli.exe 进入Redis的命令行状态,输入 monitor ,进入监控模式。
- 启动第一个Node.js服务:进入DOS命令提示符窗口,输入:
D:\>cd \redis.test
D:\redis.test>node app
Express server listening on port 3000
- 启动第二个Node.js服务:进入DOS命令提示符窗口,输入:
D:\>cd \redis.test
D:\redis.test>node app1
Express server listening on port 3001
下面通过浏览器,顺序访问以下网址:
http://127.0.0.1:3000/redisget 访问第一台服务器,此时显示:Username: undefined
http://127.0.0.1:3001/redisget 访问第二台服务器,此时也显示:Username: undefined
http://127.0.0.1:3001/redisset 访问第二台服务器,设置Session的变量user值。
然后再访问前2个网址,出现了什么? 访问后再等30秒后,再看看这2个网址是什么内容?