关于express-session实现的疑问
发布于 5 年前 作者 hyper-god 3726 次浏览 来自 问答

https://github.com/expressjs/session/blob/2d54f0dca1506883bebc634fcb7135c2f02c47cd/session/memory.js#L58 https://github.com/expressjs/session/blob/2d54f0dca1506883bebc634fcb7135c2f02c47cd/session/memory.js#L131 alllength 方法会遍历session store池子清除过期的session.

getSessiondestory方法会从池子里清除当前session,clear方法会清空池子.

https://github.com/expressjs/session/blob/master/index.js 但是index.js里并没有调alllength方法.

问题是: 当我登陆之后直接从控制台清除当前域名的cookie,或者登陆完成之后重装系统了,是不是永远不会清除session store里这条session id对应的session了?

Sorry,简单看了源码,没找到解决这个问题的代码.

5 回复

推荐楼主用connect-redis这个库搞个store来存储session吧,还可以支持多台机器,配置个过期时间就好了

@rainstraw 很感谢你的回答.但是我要的是米饭不是可乐.

你想的没错,自带的 MemoryStore 本来就不是为线上设计的,在你说的情况下不会清除掉内存中记录的 session,因此会有内存泄漏,所以官方的 README.md 中有这么一句

Warning The default server-side session storage, MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.

相对应的,如果你采用 Redis 来作为 store 的话,一般 set 方法会设置一个 maxAge,比如:

// 最大缓存 24h
redisClient.set(key, value, 'PX', 24 * 60 * 60 * 1000)

这样可以规避掉你说的这种场景下 session 无限增大的问题

回到顶部