Connect 的内存存储 - 解决节点 Web 服务器的生产限制

问题描述 投票:0回答:1
我读过一些关于如何为会话安装持久存储解决方案(用于 Node/Express 设置)的各种评论,对于小型网站(redis、mongo 等)来说似乎有些过大。

除了持久性之外,我只能发现旧会话的垃圾收集是不在生产网站中使用内存存储的原因......(即,我关闭浏览器,但会话仍然存储在服务器上的内存存储中)

我加入了类似这个简单的垃圾收集器的东西来解决这个问题:

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 express session node.js-connect
1个回答
-1
投票
我不明白使用外部存储器有什么过度杀伤力。它们非常适合处理会话。例如,Redis 是一个键/值存储,其中值具有生存时间,因此您不必担心内存管理等问题。 TJ Holowaychuk 制作了一个简洁的内存存储,使用 Redis 作为后端:

connect-redis

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

© www.soinside.com 2019 - 2024. All rights reserved.