1. 程式人生 > >在nodejs專案報錯:CROSSSLOT Keys in request don't hash to the same slot解決方法

在nodejs專案報錯:CROSSSLOT Keys in request don't hash to the same slot解決方法

由於後臺用的是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服務地址,我隨便亂寫的,換成自己後臺給的就好。)。

  1. require(‘connect-redis’); 這個包可以裡面的 RedisStore.prototype.set 這個方法 可以看到實際上儲存在session裡面的key的,輸出一下,然後在客戶端的redis檢視就可以了:get {user}:sess:***********.redis儲存session是以 sess開頭的。這樣就可以檢視自己是不是存到資料庫和session的destory了