簡體   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