Spring之RedisSession详解

基本使用

springRedisSession常用于解决多机部署的session统一问题,将session存入redis。以实现session的多机共识性。

Springboot redisSession需要加上

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Redis Session-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

然后在启动类上加入@EnableRedisHttpSession

@SpringBootApplication
@EnableRedisHttpSession
public class PaymentApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(PaymentApplication.class);
        springApplication.run(args);
    }

}

Spring HttpRedis的原理
SpringHttp实际上就是做了ServletFilter,Filter的类名为 org.springframework.session.web.http.SessionRepositoryFilter

Spring怎么寻Filter类的
我们通常Filter要实现Filter类,然后注入生成bean注入到Spring中,Spring 通过
Sevlet的Filter

Tomcat是通过 org.apache.coyote.http11.Http11Processor#service这个方法来创建request和response类的.

如何删除session

request.getSession().invalidate();

如何设置Session的超时时间
session的默认时间为: DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS = 1800;等于30分钟。

在使用RedisIndexedSessionRepository的情况下,直接用注解 @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60)

RedisSession中Redis的三个键值对存了些什么
就一个sesion而言,redis存了3个key

spring:session:sessions:b82b4153-ddb7-494c-b7fe-a28ae4f5db61
spring:session:sessions:expires:b2bfe5a3-698b-4a8d-a93f-4c0e584b92d6
spring:session:expirations:1656052140000
设置的方法为 org.springframework.session.data.redis.RedisIndexedSessionRepository.RedisSession#saveDelta

第一个key,主要存session中的一些键值对,以及创建时间,上一次请求时间,这个key的存活时间为5分钟+最大超时时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yzVm9fEx-1656056826363)(C:\Users\jm011254\AppData\Roaming\Typora\typora-user-images\image-20220624142828566.png)]

 第二个key,主要是存真正的超时时间,设置的60秒 就会只有60秒

this.redis.boundValueOps(sessionKey).append("");
this.redis.boundValueOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS);

存这个的目的是为了更好查询到第三个key。

第三个key, 主要是设置key的超时时间,超时时间会在设置的基础上加5分钟‘

long fiveMinutesAfterExpires = sessionExpireInSeconds + TimeUnit.MINUTES.toSeconds(5);
expireOperations.expire(fiveMinutesAfterExpires, TimeUnit.SECONDS);

存这个的目的是为了定时由org.springframework.session.data.redis.RedisSessionExpirationPolicy#cleanExpiredSessions清理.(需要开启定时任务)。

更改Redis的序列化方式

只需要指定redis的序列化就行了

@Bean(name = "springSessionDefaultRedisSerializer")
 public RedisSerializer getRedisSerializer() {
        return new FastJsonRedisSerializer(Object.class);
 }

自定义NameSpace

只需要注解的时候,修改成为

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60,redisNamespace = "session")

修改sessionRepository

通过创建SessionRepositoryCustomizer 来自定义sessionRepository

@Bean
    public SessionRepositoryCustomizer getsessionRepositoryCustomizer(){
        return new SessionRepositoryCustomizer() {
            @Override
            public void customize(SessionRepository sessionRepository) {
                RedisIndexedSessionRepository sessionRepository1 = (RedisIndexedSessionRepository) sessionRepository;
                sessionRepository1.setFlushMode(FlushMode.IMMEDIATE);
                sessionRepository1.setDatabase(2);
            }
        };
    }

   3. 修改 spring-session 存储配置

spring:
  session:
    timeout: 86400
    store-type: redis  
    # 默认是 none,表示存储在服务器
    # redis 表示从 redis 去写 session

配置完成之后,就可以将登录之后的用户信息存储到 redis 中。

另外:

怎么将用户信息在 session 中存入 / 读取。

// 存储用户信息到 session
request.getSession().setAttribute("user", user);
 
// 在 session 中读取用户信息
request.getSession().getAttribute("user");
 
// "user":用户信息存储到 session 中的 key
// user:用户信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值