需求

express中需要使用session时,我们常使用express-session,使用案例如下

var express = require('express')
var session = require('express-session')

var app = express()
app.use(session({ 
    secret: 'keyboard cat', 
    cookie: { maxAge: 60000 }
}))

app.post('/', function(req, res, next){
    req.session.userData = 'userData' //直接设置session的值,在http结束返回时会自动调用session的save方法进行保存
})

但是express-session默认使用的是MemoryStore进行存储,多用于开发环境,但是我们常常要将session存储在redis中,这时我们常使用connect-redis来配合

使用

connect-redis是一个快速、方便的redis连接库,需要redis >= 2.0.0,安装如下

npm install connect-redis

express-session配合使用的案例如下

var express = require('express')
var session = require('express-session');
var RedisStore = require('connect-redis')(session);

var app = express()
app.use(session({
    store: new RedisStore(redisOptions),
    secret: 'keyboard cat',
    cookie: { maxAge: 60000 }
}));

redisOptions的主要选项如下

{
    "host": "localhost", 
    "port": 6379,
    "pass": "PASSWORD", //redis的密码
    "prefix": "mysite:sess:", //key的前缀,默认为"sess:"
}

如果使用redis集群的话需要ioredis,使用如下,原文在这里

var express = require('express');
var app = express();
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var Redis = require('ioredis');

var redisClient = new Redis.Cluster([
    {port: 6379, host: 'your-cluster-ip-1', password: 'password-for-6379'},//可以单独设置密码
    {port: 6378, host: 'your-cluster-ip-2'},
    {port: 6377, host: 'your-cluster-ip-3'},
    {port: 6376, host: 'your-cluster-ip-4'}
], {
    redisOptions: {
      password: 'fallback-password' // 如果集群有密码保护,可以设置集群的密码
    }
});
redisClient.on('error', function(err) { // 获取集群所有节点都失败的时候的错误信息
    console.log('get cluster err message:', err)
})

app.use(session({
    secret: 'redis-session-test',
    store: new RedisStore({client: redisClient}),
    resave: false,
    saveUninitialized: true
}));