我们都知道使用Redis统一管理Session是实现分布式Session的方式之一,SpringBoot对这种实现方式进行了整合,只需通过极少量的代码就可完成分布式Session的功能,具体步骤如下:
一.导入依赖
包括Redis依赖和session-data-redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
二.编写配置文件
主要配置redis的地址和连接池,这里使用的是lettuce客户端
spring.redis.port=6379
spring.redis.host=10.92.224.90
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.pool.max-idle=0
spring.redis.lettuce.pool.max-wait=1000
spring.redis.lettuce.shutdown-timeout=100
三.创建配置类
注意该配置类上需添加@EnableRedisHttpSession注解使Redis-Session生效
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600)
public class RedisSessionConfig {
}
@EnableRedisHttpSession提供了几个属性
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({RedisHttpSessionConfiguration.class})
@Configuration(
proxyBeanMethods = false
)
public @interface EnableRedisHttpSession {
//Session默认过期时间,单位秒,默认1800秒
int maxInactiveIntervalInSeconds() default 1800;
//配置存储的Session在Redis中的namespace,如果不同的应用共用一个redis,应该为应用配置不同的namespace,这样才能区分这个Session是来自哪个应用的
String redisNamespace() default "spring:session";
/** @deprecated */
@Deprecated
RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
//配置刷新Redis中Session方式,默认是ON_SAVE模式,只有当Response提交后才会将Session提交到Redis,也可以配置成IMMEDIATE模式,即所有对Session的更改会立即更新到Redis
FlushMode flushMode() default FlushMode.ON_SAVE;
//清理过期Session的定时任务
String cleanupCron() default "0 * * * * *";
//配置Session记录到Redis中的方式
SaveMode saveMode() default SaveMode.ON_SET_ATTRIBUTE;
}
四.使用分布式Session
配置完成后,Session已经实现了分布式Session功能,此时只要按照平时使用Session的方式,Session中的数据就会自动存放到Redis中(由此我们可以猜想该方法是通过创建代理拦截了request.getSession()方法来实现的)
@Controller
public class SessionController {
@RequestMapping("/sessionPut")
@ResponseBody
public String sessionPut(HttpSession session){
session.setAttribute("user02","5000");
return "finished";
}
@RequestMapping("/sessionGet")
@ResponseBody
public String sessionGet(HttpSession session){
Object attribute = session.getAttribute("user01");
System.out.println(attribute);
return "finished";
}
}
打开Redis客户端后我们可以发现所有的Session数据都放在一个hash数据类型的键中,其中设定的SessionName为键中的hashKey
版权声明:本文为wanger61原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。