【问题标题】:Connect's Memory Store - working around it's production limitations for Node WebserversConnect Memory Store - 解决 Node Web 服务器的生产限制
【发布时间】:2012-12-17 11:24:53
【问题描述】:

我已经阅读了一些关于如何为会话安装持久存储解决方案(用于 Node/Express 设置)对于小型网站(redis、mongo 等)来说似乎有点矫枉过正的各种 cmet。

除了持久性之外,我只能发现旧会话的垃圾收集是不在生产网站中使用 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 还有什么其他限制)

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

【问题讨论】:

    标签: node.js session express connect


    【解决方案1】:

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

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

    【讨论】:

    • 对于小型网站来说,与其说是“安装”本身,不如说是矫枉过正......但更多的是需要有一个外部内存存储 - 即。如果我没有站在一个盒子旁边,我想使用 paas 进行部署——我的选择突然变得有点有限……不要误会我的意思,Redis 很棒——但我不确定它是否适用于所有场景的解决方案...
    • 我发现了一些替代的“内存中”会话存储,它们已被编写为与 connect 一起使用——我将检查一下它们,看看它们如何比较……但是,我不禁想知道单独的内存存储是否就足够了...我想这一切都归结为确定您真正需要什么...
    • 除了内存泄漏问题外,我没有看到内存存储有任何其他问题。同样使用 Redis 之类的会话可以访问其他服务,但我认为这对你的情况不是很有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多