SpringBoot 使用Redis存储Session

SpringBoot 使用Redis存储Session

Session的基本概念

Session(会话)是一种在客户端与服务器之间维持状态的机制。它允许服务器在多个请求之间存储用户的数据,以便用户可以在访问网站或应用时维持某种程度的连续性和个性化体验。以下是对 session 的详细解释:

-会话的定义: 会话指的是用户与服务器之间的一系列互动。通常从用户登录开始,到用户退出或会话过期结束。
-目的: 主要用于在用户的多个请求之间保持状态。这对于存储用户登录状态(十天免登录)、购物车内容、用户设置等非常重要。

Session的工作流程

  1. 用户请求: 用户访问网站或应用时,服务器会创建一个新的 session。
  2. 生成 Session ID: 服务器生成一个唯一的 session ID(会话标识符),这个 ID 用于标识用户的会话。
  3. 存储 Session 数据:服务器会将与用户会话相关的数据存储在服务器端,可以是内存、数据库、Redis 等。
  4. 发送 Session ID: 服务器将session ID 发送到客户端,通常是通过 cookie。客户端在后续请求中会带上这个 ID。
  5. 维护会话状态:在用户进行后续请求时,服务器通过 session ID 找到对应的会话数据,继续处理用户请求。
  6. 会话结束:用户注销或会话超时后,会话数据会被销毁或标记为无效。

在Java Servlet中
request.getSession(false) -> 是指获取当前请求的会话时,如果没有获取到会话就不会创建一个新的会话,而是直接返回null
request.getSession(true) 或者是 request.getSession() -> 是指如果请求的会话不存在,就创建一个新的,Java Servlet的getSession方法是默认为true的

Session的常见应用场景

  1. 用户认证: 记录用户的登录状态,确保用户在会话期间不需要重新登录。
  2. 个性化设置: 存储用户的个性化设置或偏好,以提供个性化的体验。
  3. 购物车: 在电商网站中,存储购物车的内容。

Session的存储方式

  1. 内存: 在服务器内存中存储会话数据(适用于小型应用或负载较低的环境)。
  2. 数据库: 将会话数据存储在数据库中(适用于需要持久化存储和较高的数据可靠性的环境)。
  3. Redis: 使用 Redis 这种内存数据库来存储会话数据(适用于高性能需求的场景)。
  4. 文件系统: 将会话数据存储在服务器的文件系统中(通常不太常见)。

接下来进入正题Redis存储Session

Redis存储Session

Redis存储Session的优势

高性能
  1. 内存存储:Redis 是一个内存数据库,数据存储在 RAM(随机存取存储器) 中,这使得读写操作非常快速,比传统的磁盘存储要快得多。
  2. 低延迟:Redis 的数据结构操作非常高效,支持秒级的响应时间,这对于需要快速会话访问的应用程序至关重要。
可扩展性
  1. 水平扩展: Redis 支持集群模式,可以通过将数据分布在多个 Redis 实例上来水平扩展。这意味着可以处理更多的会话数据和更高的负载。
  2. 持久化选项: Redis 提供了多种持久化机制(如 RDB 快照和 AOF 追加文件),可以在一定程度上保证数据的持久性,同时保持较高的性能。
丰富的数据结构
  1. 数据结构支持: Redis 支持丰富的数据结构(如字符串、哈希、列表、集合、有序集合等),这些数据结构可以更灵活地存储和操作会话数据。
  2. 过期策略: Redis 内置了高效的过期策略,可以自动清理过期的会话数据,避免占用过多内存。
高效的内存管理
  1. 内存优化: Redis 提供了多种内存管理选项,如 LRU(最近最少使用)驱逐策略,确保在内存有限的情况下优先保留最常访问的数据。
  2. 压缩和编码: Redis 支持数据压缩和编码,以减少存储空间和提高性能。

Spring Boot实现Redis存储

导入依赖

	 <!--Redis存储Session的依赖-->
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
	<!--Spring Boot 的 Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

修改application配置文件

spring:
  data:
    redis:
      port: 6379
      host: localhost
      database: 1 #修改存储数据的redis库
  session:
    timeout: 86400 #session的过期时间
    store-type: redis #session 的存储位置

完成上述配置就可以将session存入redis了

接下来写一个示例代码

@PostMapping("/login")
    public String login(HttpServletRequest request){
        String sessionUser = "session存储进来了";
       	request.getSession().setAttribute("session",sessionUser );
        return "session存储成功";
    }

这是没有存储之前的Redis
这是没有存储之前的Redis
这是存储之后的Redis
这是存储了之后的Redis
存储进Redis的数据会乱码是因为Redis 默认以二进制安全的方式存储数据因此,确保在存储和读取数据时使用一致的编码格式非常重要。如果存储时使用了不同的编码格式或数据序列化方法,读取时可能会出现乱码问题。确保你的应用在存储和读取 session 数据时使用相同的编码和序列化方式,比如 JSON 或二进制序列化,并确保数据的一致性。

上述查看Redis的应用是QuickRedis,这个软件可以快速查看Redis中的所有数据

如果之后要修改Redis中的session数据就重新setAttribute一次就可以了,这样就会修改Redis中的session数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值