如何在Redis中存储用户会话并实现密码重置时批量失效所有会话?
如何在用户重置密码时失效其所有Redis存储的会话?
当前会话存储方案
- 用户通过邮箱密码或OAuth(Google、Apple、Facebook等)方式完成认证后,系统创建包含session id的Cookie,同时将会话数据序列化后存入Redis:
- 以会话数据中的
id作为Redis键 - Redis键的过期时间与Cookie的
maxAgeInSeconds属性保持一致
- 以会话数据中的
- 会话数据结构如下:
{ "id": "random_session_id", "iat": 1677004020931, "userId": "id_of_the_user_who_owns_the_session", "device": "Samsung s10", "ip": "0.0.0.0" }
核心需求
当用户重置密码时,立即失效该用户的所有活跃会话
已尝试的不可行方案
- 方案1:采用Redis哈希结构存储,以
user_id为哈希键,每个session_id作为哈希字段存储对应序列化会话数据- 问题:Redis不支持为哈希中的单个字段设置过期时间,无法满足会话自动过期的需求
- 方案2:维护额外缓存存储每个用户关联的所有会话ID列表
- 问题:当会话自然过期时,无法自动同步删除缓存列表中的对应会话ID,会积累无效数据
提问
请问该如何实现重置密码时失效用户所有会话的需求?
内容的提问来源于stack exchange,提问作者Giuliopime
相关产品推荐
相关产品推荐

