SpringBoot整合Redis实现分布式Session

我们都知道使用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版权协议,转载请附上原文出处链接和本声明。