我已经阅读了一些关于如何为会话(用于 Node/Express 设置)安装持久存储解决方案对于小型网站(redis、mongo 等)来说似乎有点矫枉过正的各种评论。
除了持久性之外,我只能发现旧会话的垃圾收集是不在生产网站中使用 Memory Store 的原因......(即我关闭浏览器,但会话仍存储在服务器上的 Memory Store 中)
我投入了类似这个简单的垃圾收集器来解决这个问题:
var sessionGarbageCollector = function(req, res, next) {
// Set a session lifetime (Renewed each time this is called)
var now = new Date();
var expirydate = now.getime();
expirydate += 60000; // Some Session lifespan
req.session.LifeTime = expirydate;
req.session.sessionID = req.sessionID; // Make session ID accessible inside session
// Loop through all sessions and check for expired sessions
for ( var x in req.sessionStore.sessions ) {
req.sessionStore.get(x, function(err,sessionObj) {
if ( sessionObj.LifeTime ) {
if ( now.getTime() > sessionObj.LifeTime ) {
console.log("Removing Expired Sesson: " + sessionObj.sessionID);
req.sessionStore.destroy(sessionObj.sessionID, function(err,data) { } );
}
}
});
}
next();
}
然后我包括以下内容,以便在每个请求上运行它——所以每次有人请求一个页面时,垃圾收集器都会检查是否应该删除任何会话:
app.use(sessionGarbageCollector);
现在可能,我不想每次都调用它,但仅在 10 分钟后或某个间隔后的请求中调用......但这已经足够接近我想要的了。(对于“让我登录”会话,我会在客户端上覆盖会话密钥 cookie 的“仅会话”状态,并设置一个特定的到期日期——在与 req.session.LifeTime 的会话中具有匹配的到期日期,这样你就得到了保留会话...好吧,如果没有人重新启动服务器...)
我想知道这种方法还有哪些我没有看到的其他问题?(即除了垃圾收集,内存存储还有什么其他限制)
其他人对此有何经验?也许其他人已经尝试过这种事情?