SpringBoot使用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数据
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理
本篇文章主要介绍了解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-02-02
Clojure 与Java对比少数据结构多函数胜过多个单独类的优点
这篇文章主要介绍了Clojure 与Java对比少数据结构多函数胜过多个单独类的优点,在Clojure中,我们一次又一次地使用相同的数据结构,并在其上运行许多函,更多相关介绍需要的朋友可以参考一下下面文章内容2022-06-06
java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较
这篇文章主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下2017-01-01


最新评论