我最近开始在我的Nodejs项目上使用Redis。我用它来存储我的会话。
const session = require("express-session")
const redis = require('redis')
let RedisStore = require('connect-redis')(session)
let redisClient
if(process.env.REDISTOGO_URL){
// let redisURL = url.parse(process.env.REDISTOGO_URL);
redisClient = redis.createClient(process.env.REDISTOGO_URL)
} else {
redisClient = redis.createClient()
}
app.use(
session({
store: new RedisStore({
client: redisClient
}),
secret: keys.session.secret,
resave: false,
saveUninitialized: false
})
)
我也在使用 passport.js 来处理用户会话。
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
pool.query( `Select users.* where users.id = ${id} `, function(err, rows) {
if(err){
console.log(err)
}
else{
done(err,rows[0]);
}
});
});
我在阅读Redis的工作原理时,发现了这个。
当使用内存缓存时,你的cookie只包含一个会话ID。 这消除了用户私人信息在cookie中暴露的风险。
这意味着在任何时间,Nodejs服务器仍然要存储会话ID。当浏览器将cookie与用户信息和加密的秘密一起发回时,Nodejs将不得不在redis存储中找到会话ID,并确保信息正确。
為什麼刷新Nodejs伺服器不會清除所有資料庫中的session ID?为什么每次刷新服务器都不用重新登录?
Redis 默认情况下不会在每次写入数据时将数据持久化到磁盘上(通常只有 aof 而没有 rdf)。所以如果你重启redis,你的数据可能会消失,你的cookie中的sessionId也不存在了。
你将需要 在redis中实现持久化 或在您的 重症监护室.
如果你想刷新所有的会话信息,你可以通过 FLUSHALL 在您的redis实例上。最好的办法是 设置寿命时间。 所以你的会话最终会在30天左右后被redis自动刷新。