在工作中会遇到以下几个场景:
1. 发布新功能或修复bug,服务重启,用户需要重新登录
2. 当集群内某个节点失效时,用户明明刚登录,仍被提示需要重新登录
那如何做到服务发布、集群节点失效对用户无感知呢?有以下几种方式:
1. 使用cookie保存用户状态信息
2. session同步法(多个web-server之间相互同步session)
3. 后端统一存储(如:redis)
关于这几种方法的优缺点这里不再展开,可参看阅读《session一致性架构设计实践》,讲的很透彻,调理清晰。我们重点来看下如何通过后端统一存储来实现session共享,通过查找,发现了一个比较好的方案,spring-session,整合特别简单。
1、在项目内引入redis
参考我之前的一篇文档《spring boot项目实战:redis》,这里不再展开。
2、添加maven依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
3、添加java配置
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds=7200,redisNamespace="base")
public class RedisSessionConfig {
}
- maxInactiveIntervalInSeconds用于设置session有效时间
- redisNamespace用于区分不同的项目,如果多个项目共用用户数据,可以采用相同的值,这样就简单的实现了统一登录效果
要提醒的一点是如果用户数据特别大,需要注意redis容量规范及数据库规范,尽量保证缓存键分类存储在不同的库内,如用户session数据存储在数据库1内,业务缓存存储在0内,以此类推。