Redis Monitor每秒重复显示相同请求的原因排查
为什么Redis Monitor会重复显示get和expire会话请求?
这其实是 express-session 搭配 Redis 会话存储时的默认行为,结合你的场景,主要是这几个原因导致的:
1. req.session被自动访问触发Redis查询
你的Express应用里大概率存在全局中间件(比如认证校验、请求日志、权限检查这类),这些中间件会在每次请求时自动读取req.session对象。只要代码里访问了req.session,express-session就会自动向Redis发送get命令拉取会话数据——这就是你看到重复get请求的直接原因。
2. 会话过期时间的自动续期机制
如果你没修改过express-session的默认配置,resave选项默认是true。这个选项的作用是:哪怕会话数据没有任何修改,每次请求都会重新保存会话。对于Redis存储来说,重新保存会话的操作就会触发expire命令,把会话的过期时间重置为你设置的3600秒(1小时),目的是让活跃用户的会话不会提前过期。
3. 固定间隔触发的根源:前端定时请求
你看到的每3秒左右重复的请求,几乎可以肯定是前端在发送心跳请求或者轮询请求(比如实时状态同步、通知推送的前端逻辑)。这些定时请求会持续触发Express的中间件流程,进而重复触发上述的Redis操作。你可以检查下前端代码里有没有setInterval或者类似的定时请求逻辑。
解决建议
- 优化express-session配置:
将resave设为false,这样只有当会话数据被修改时,才会重新保存会话,避免无意义的expire请求:app.use(session({ store: new RedisStore({ /* 你的Redis配置 */ }), secret: 'your-secure-secret-key', resave: false, // 关键修改 saveUninitialized: false, cookie: { maxAge: 3600000 } // 1小时过期 })); - 清理前端非必要的定时请求:
如果前端的轮询/心跳不是业务必需的,调整间隔或者取消这类请求,减少后端的Redis交互压力。 - 用
rolling选项实现智能续期:
如果你希望只有用户主动操作时才续期会话,可以开启rolling: true(同时保持resave: false)。这样只有当会话被修改,或者用户发送带会话cookie的请求时,才会更新cookie和Redis会话的过期时间。
内容的提问来源于stack exchange,提问作者Loupi
相关产品推荐
相关产品推荐

