繁体   English   中英

redis 如何保持 Nodejs 会话?

[英]How does redis persist Nodejs sessions?

我最近开始在我的 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 的工作原理并遇到了这个问题:

使用 memory 缓存时,您的 cookie 仅包含 session ID。 这消除了在 cookie 中暴露私人用户信息的风险。

这意味着在任何给定时间,Nodejs 服务器仍然必须存储 session ID。 当浏览器发回带有用户信息和加密秘密的 cookie 时,Nodejs 必须在 redis 存储中找到 session ID 并确保信息正确。

为什么刷新Nodejs服务器并没有从数据库中清除所有session ID? 为什么每次刷新服务器都不需要重新登录?

redis 默认情况下不会在每次写入时将数据持久化到磁盘(通常只有 aof 而没有 rdf)。 因此,如果您重新启动 redis,您的数据可能会消失,并且您的 cookie 中的 sessionId 将不再存在

您将需要在 redis 中启用持久性或在您的redistogo 实例中配置它。

如果你想刷新所有 session 信息,你可以在你的redis实例上刷新。 最好是设置 ttl(生存时间) ,这样您的会话最终会在 30 天左右后自动被 redis 刷新

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM