3

我已经阅读了一些关于如何为会话(用于 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 的会话中具有匹配的到期日期,这样你就得到了保留会话...好吧,如果没有人重新启动服务器...)

我想知道这种方法还有哪些我没有看到的其他问题?(即除了垃圾收集,内存存储还有什么其他限制)

其他人对此有何经验?也许其他人已经尝试过这种事情?

4

1 回答 1

-1

我不明白使用外部内存存储是多么过分。它们非常适合处理会话。例如,Redis 是一个键/值存储,其中值具有生存时间,因此您不必担心内存管理等。TJ Holowaychuk 制作了一个使用 Redis 作为后端的简洁内存存储:connect-redis

所以你需要: 1) 安装 Redis (最多需要 5 分钟,如果你的服务器的防火墙已经启动,默认配置就可以了) 2) 安装 connect-redis 并将其用作带有 Connect 或 Express 会话的会话存储中间件 3) 利润。另一个好处是 Redis 还可以用作 Express 应用程序和系统其他组件之间的消息提供程序。很方便。

于 2013-01-04T10:13:12.093 回答