session双机问题在分布式系统中经常会遇到,也有挺多解决方案,列举几种:
1. 使用缓存(如redis)来解决
① 可以自己重写session管理类,自己对session进行管理,这可能会比较麻烦一点,因为要考虑session续期问题,考虑不周全可能会有一些问题
② 如果你使用spring boot,那么你有福了,spring boot有现成的解决方案,O(∩_∩)O~
2.session同步,这个不是本文重点就不说了
本文主要介绍一下spring boot 使用redis解决session双机问题的实现,非常简单。
1. 环境
基于spring boot的项目
2.配置实现
2.1 首先肯定要添加依赖,要引入spring boot redis的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2 配置application文件
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=***************
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池中的最大空闲连接,默认值也是8。
spring.redis.pool.max-idle=500
#连接池中的最小空闲连接,默认值也是0。
spring.redis.pool.min-idle=50
# 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
spring.redis.pool.max-active=2000
# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
spring.redis.pool.max-wait=1000
# 连接超时时间(毫秒)
spring.redis.timeout=0
2.4 写个redis session管理类
@Configuration
//启用spring boot redis session,并设置session过期时间为两小时
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 7200,redisNamespace = "tl")
public class RedisSessionConfig {
}
使用注解即可: 可以在开启session的同时设置session过期时间,单位为秒
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 7200,redisNamespace = "tl")
2.3 session使用
使用方式跟正常使用没有任何区别
request.getSession().setAttribute("user", user);
over, 配置很简单吧,而且也不用考虑session的续期问题。