Redis【14】-Redis分布式Session,解决分布式项目中session共享问题

Spring-Session
spring-seesion 解决分布式 session 的共享问题。
介绍
Spring Session Spring 的项目之一, GitHub 地址: https://github.com/spring-pro
Spring Session 提供了一套创建和管理 Servlet HttpSession 的完美方案。
功能
spring Session 提供了 API 和实现,用于管理用户的 Session 信息。除此之外,它还提供了如下特性:
session 所保存的状态卸载到特定的外部 session 存储汇总,如 Redis 中,他们能够以独立于应用服务器的方式提供高质量的集群。
控制 sessionid 如何在客户端和服务器之间进行交换,这样的话就能很容易地编写 Restful API ,因为它可以从 HTTP 头信息中获取 sessionid ,而不必再依赖于 cookie
在非 Web 请求的处理代码中,能够访问 session 数据,比如在 JMS 消息的处理代码中。
支持每个浏览器上使用多个 session ,从而能够很容易地构建更加丰富的终端用户体验。
当用户使用 WebSocket 发送请求的时候,能够保持 HttpSession 处于活跃状态。

依赖 

<!-- spring session redis starter 集成包 目的用于分布式 session 管理 -->
<dependency>
<groupId> org.springframework.session </groupId>
<artifactId> spring-session-data-redis </artifactId>
</dependency>
入口类或Config都可以加上 @EnableRedisHttpSession 注解
/**
* @EnableRedisHttpSession 注解,开启 redis 集中式 session 管理,把所有的 session 都存放到了
redis
* maxInactiveIntervalInSeconds: 设置 Session 失效时间
* 使用 Redis Session 之后,原 Spring Boot 中的 server.session.timeout 属性不再生效。
*/
@Configuration
@EnableRedisHttpSession ( maxInactiveIntervalInSeconds = 1000 * 60 )
public class RedisSessionConfig {
}

测试 

@RestController
public class RedisSessionTest {
// 登录
@RequestMapping ( "/login" )
public String login ( @RequestParam ( "uname" ) String uname ,
@RequestParam ( "upass" ) String upass ,
HttpServletRequest request ){
String msg = "logon failure!" ;
if ( uname != null && "admin" . equals ( uname ) && "123" . equals ( upass )){
User u = new User ();
u . setUname ( uname ); u . setUpass ( upass );
request . getSession (). setAttribute ( "user" , u );
msg = "login successful!" ;
}
return msg ;
}
@Value ( "${server.port}" )
private String port ;
// Session
@GetMapping ( "getSession" )
public Map < String , Object > getSession ( HttpSession session ){
Map < String , Object > map = new HashMap <> ();
map . put ( "user" , session . getAttribute ( "user" ));
map . put ( "port" , port );
return map ;
}
}
分别启动两个微服务项目,运行。
springboot 配置 session 共享是非常方便的,只需要 EnableRedisHttpSession 注解即可。
解读
RedisSession 在创建时设置 3 个变量 creationTime maxInactiveInterval lastAccessedTime
maxInactiveInterval 默认值为 1800 秒 ,表示 1800s 之内该 session 没有被再次使用,则表明该
session 已过期。每次 session 被访问都会更新 lastAccessedTime 的值, session 的过期计算公式:
当前时间 - lastAccessedTime > maxInactiveInterval .
获取 session
spring session redis 里面保存的数据包括:
  • SET 类型的
spring:session:expireations:[min]
min 表示从 1970 1 1 0 0 分经过的分钟数, SET 集合的 member expires:
[sessionId] , 表示 members 会在 min 分钟后过期。
  • String 类型的

spring:session:sessions:expires:[sessionId]
该数据的 TTL 表示 sessionId 过期的剩余时间,即 maxInactiveInterval
  • Hash 类型的
spring : session : sessions : [sessionId]
session 保存的数据,记录了 creationTime maxInactiveInterval lastAccessedTime
attribute 。前两个数据是用于 session 过期管理的辅助数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值