连接内存存储 - 解决它对Node Web Server的生产限制

时间:2013-01-03 04:41:25

标签: node.js session express connect

我已经阅读了一些关于如何为会话(对于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,所以你得到保留的会话......好吧,如果没有人重新启动服务器是...)

我想知道这种方法还有哪些我没有看到的问题? (即除垃圾收集外,Memory Store还有其他限制)

其他人的体验是什么?也许其他人尝试过这种事情?

1 个答案:

答案 0 :(得分:-1)

我没有看到使用外部存储器是如何过度杀伤。它们非常适合处理会话。例如,Redis是一个键/值存储,其中值具有生存时间,因此您不必担心内存管理等。 TJ Holowaychuk创建了一个整洁的记忆库,使用Redis作为后端:connect-redis

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