https://github.com/expressjs/session/blob/2d54f0dca1506883bebc634fcb7135c2f02c47cd/session/memory.js#L58
https://github.com/expressjs/session/blob/2d54f0dca1506883bebc634fcb7135c2f02c47cd/session/memory.js#L131
all
和length
方法会遍历session store
池子清除过期的session
.
getSession
和destory
方法会从池子里清除当前session
,clear
方法会清空池子.
https://github.com/expressjs/session/blob/master/index.js
但是index.js
里并没有调all
和length
方法.
问题是:
当我登陆之后直接从控制台清除当前域名的cookie
,或者登陆完成之后重装系统了,是不是永远不会清除session store
里这条session id
对应的session
了?
Sorry,简单看了源码,没找到解决这个问题的代码.
推荐楼主用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 无限增大的问题
@hyj1991 感谢