Redis 实现 Session 共享

什么是Session

  • session 是一种服务端的会话机制
  • session 属于域对象,作用范围是一次会话

服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

Session 一致性问题

当第一次请求来时,服务器端会接受到客户端请求,会创建一个 session,使用响应头返回 sessionid 给客户端。浏览器获取到 sessionid 后会保存到本地 cookie 中

当第二次请求来时,客户端会读取本地的 sessionid,存放在请求头中,服务端在请求头中获取对象的 sessionid 在本地 session 内存中查询

session 属于会话机制,当前会话结束时,session 就会被销毁,并且 web 程序会为每一次不同的会话创建不同的 session,所以在分布式场景下,即使是调用同一个方法执行同样的代码,但是他们的服务器不同,自然 web 程序不同,整个上下文对象也不同,理所当然 session 也是不同的。

Spring Session

实现原理

当 Web 服务器接收到 http 请求后,请求进入对应的 Filter 进行过滤,将原本需要由 web 服务器创建会话的过程转交给 Spring-Session 进行创建,本来创建的会话保存在 Web 服务器内存中,通过 Spring-Session 创建的会话信息可以保存在第三方的服务中,如:Redis,MySQL 等。Web 服务器之间通过连接第三方服务来共享数据,实现 Session 共享!

实现过程

  • 添加依赖
<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>
  • 修改 application.yml 添加配置
spring:
  redis:
    host: localhost
    port: 6379
    password: yourpassword # 如果设置了密码的话
    database: 0 # Redis 数据库索引
    timeout: 5000 # 连接超时时间(毫秒)
  session:
    store-type: redis # 默认是 none,表示存储在单台服务器,redis 表示从 redis 读写 session
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值