最近,我开始在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一起发送回来时,Nodejs必须在redis存储中找到会话ID,并确保信息是正确的。
为什么刷新Nodejs服务器没有清除数据库中的所有会话ID?为什么每次刷新服务器时都不用重新登录?
发布于 2020-05-31 15:39:04
默认情况下,redis不会在每次写入时将数据持久化到磁盘(通常只保存数据,而不保存rdf)。因此,如果您重新启动redis,您的数据就会消失,cookie中的sessionId就不再存在了。
您将需要在您的在redis中启用持久性中对其进行雷德奥戈实例或配置。
如果要刷新所有会话信息,可以在redis实例上使用氟哈勒。最好是设置ttl (生存时间),这样你的会话最终会在30天左右的时间里被红宝石自动冲红。
https://stackoverflow.com/questions/62118429
复制相似问题