SpringBoot使用Redis存储Session实践

 更新时间:2026年02月06日 15:48:32   作者:小福尼学编程  
本文介绍了Session的基本概念、工作流程和常见应用场景,并详细解释了如何在JavaServlet中使用Session,接着,文章讨论了Redis存储Session的优势和配置方法,并提供了一个示例代码,最后,总结了如何使用Redis存储Session以及注意事项

Session的基本概念

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

以下是对 session 的详细解释:

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

Session的工作流程

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

在Java Servlet中

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

Session的常见应用场景

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

Session的存储方式

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

接下来进入正题Redis存储Session

Redis存储Session

Redis存储Session的优势

高性能

  • 内存存储:Redis 是一个内存数据库,数据存储在 RAM(随机存取存储器) 中,这使得读写操作非常快速,比传统的磁盘存储要快得多。
  • 低延迟:Redis 的数据结构操作非常高效,支持秒级的响应时间,这对于需要快速会话访问的应用程序至关重要。

可扩展性

  • 水平扩展: Redis 支持集群模式,可以通过将数据分布在多个 Redis 实例上来水平扩展。这意味着可以处理更多的会话数据和更高的负载。
  • 持久化选项: Redis 提供了多种持久化机制(如 RDB 快照和 AOF 追加文件),可以在一定程度上保证数据的持久性,同时保持较高的性能。

丰富的数据结构

  • 数据结构支持: Redis 支持丰富的数据结构(如字符串、哈希、列表、集合、有序集合等),这些数据结构可以更灵活地存储和操作会话数据。
  • 过期策略: Redis 内置了高效的过期策略,可以自动清理过期的会话数据,避免占用过多内存。

高效的内存管理

  • 内存优化: Redis 提供了多种内存管理选项,如 LRU(最近最少使用)驱逐策略,确保在内存有限的情况下优先保留最常访问的数据。
  • 压缩和编码: 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 默认以二进制安全的方式存储数据因此,确保在存储和读取数据时使用一致的编码格式非常重要。如果存储时使用了不同的编码格式或数据序列化方法,读取时可能会出现乱码问题。确保你的应用在存储和读取 session 数据时使用相同的编码和序列化方式,比如 JSON 或二进制序列化,并确保数据的一致性。

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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Maven 常用插件的详细整理

    Maven 常用插件的详细整理

    这篇文章主要介绍了Maven 常用插件的详细整理的相关资料,这里整理了maven的常用插件需要的朋友可以看下,需要的朋友可以参考下
    2017-08-08
  • 一文带你掌握Java中的HashSet

    一文带你掌握Java中的HashSet

    HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合,HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的,本文将带你详细了解Java中的HashSet,,需要的朋友可以参考下
    2023-05-05
  • 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    本篇文章主要介绍了解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Spring 事务事件监控及实现原理解析

    Spring 事务事件监控及实现原理解析

    本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的朋友跟随小编一起看看吧
    2018-09-09
  • 基于Java8实现提高Excel读写效率

    基于Java8实现提高Excel读写效率

    这篇文章主要介绍了基于Java8实现提高Excel读写效率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 浅谈java String不可变的好处

    浅谈java String不可变的好处

    这篇文章主要介绍了java String不可变的好处,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 了解java架构之微服务架构—雪崩效应

    了解java架构之微服务架构—雪崩效应

    这篇文章主要介绍了了解java架构之微服务架构—雪崩效应,微服务化产品线,每一个服务专心于自己的业务逻辑,并对外提供相应的接口,看上去似乎很明了,其实还有很多的东西需要考虑,,需要的朋友可以参考下
    2019-06-06
  • Clojure 与Java对比少数据结构多函数胜过多个单独类的优点

    Clojure 与Java对比少数据结构多函数胜过多个单独类的优点

    这篇文章主要介绍了Clojure 与Java对比少数据结构多函数胜过多个单独类的优点,在Clojure中,我们一次又一次地使用相同的数据结构,并在其上运行许多函,更多相关介绍需要的朋友可以参考一下下面文章内容
    2022-06-06
  • java泛型学习示例

    java泛型学习示例

    Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter)。下面是学习泛型的示例
    2014-04-04
  • java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    这篇文章主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下
    2017-01-01

最新评论