由于后台用的是redis集群,我前端刚好碰巧用的是nodejs express框架。express存储session有自己的机制。本来单独的redis主模式是很好用redis保存session的,但奈何用了集群分片模式~~。
下面是当后台使用redis分片模式时候,前端存储session连接redis的写法。主要的部分代码:
var session = require(‘express-session’);
var connectRedis = require(‘connect-redis’);
var Redis = require(‘ioredis’); //ioredis支持cluster模式,哨兵模式等,可以去看官方api
var RedisStore = connectRedis(session);
var cluster = new Redis.Cluster(
[{
port: 7001,
host: ‘132.21.1.31’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7001,
host: ‘132.22.1.31’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7002,
host: ‘132.21.1.34’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
},
{
port: 7002,
host: ‘132.21.1.34’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7001,
host: ‘132.21.1.21’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}, {
port: 7002,
host: ‘122.21.1.21’,
password:’hha-redis’,
ttl: 60 * 60 * 24 * 7
}],
{ keyPrefix: ‘{user}:’ }
);
app.use(session({
store: new RedisStore({client:cluster}),
resave:true,
saveUninitialized: true,
secret: ‘redis.hh’,
name: config.cookeId,
cookie: {
maxAge: 3600000 * 24 * 7
},
genid: function(req) {
var token = req.cookies.token;
var uid = ”;
if (token) {
uid = new Date().getTime() + “egJdkw” + token + uuid.v4();
} else {
uid = new Date().getTime() + “ewrecz” + uuid.v4();
}
return uid;
},
}));
注意,一定要加上 { keyPrefix: ‘{user}:’ }(ps:这个只是我自己的,按照记住想法写就行了,格式一样就好,字段自己设置),这样各个集合的key才能在redis集群中的同一个slot上,这样就不会报错了。(ps:上面的集群redis服务地址,我随便乱写的,换成自己后台给的就好。)。
- require(‘connect-redis’); 这个包可以里面的 RedisStore.prototype.set 这个方法 可以看到实际上存储在session里面的key的,输出一下,然后在客户端的redis查看就可以了:get {user}:sess:***********.redis存储session是以 sess开头的。这样就可以查看自己是不是存到数据库和session的destory了