当前位置: 首页 > news >正文

【SpringBoot集成Redis + Session持久化存储到Redis】

目录

SpringBoot集成Redis 

1.添加 redis 依赖  

2.配置 redis 

3.手动操作 redis   

Session持久化存储到Redis 

1.添加依赖

2.修改redis配置

3.存储和读取String类型的代码  

4.存储和读取对象类型的代码  

5.序列化细节


SpringBoot集成Redis 

1.添加 redis 依赖  

或将以下配置添加到 pom.xml 中:   

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置 redis 

#redis地址
spring.redis.host=x.x.x.x
#端口号
spring.redis.port=6379
spring.redis.password=
#DB[0-15]
spring.redis.database=0 
# 可省略
spring.redis.lettuce.pool.min-idle=5
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1ms
spring.redis.lettuce.shutdown-timeout=100ms 

3.手动操作 redis   

@RestController
public class RedisController {@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 在 redis 存储数据  30s之后自动失效@RequestMapping("/set")public String set(String name, String value) {stringRedisTemplate.opsForValue().set(name, value, 30, TimeUnit.SECONDS);return "Set redis success.";}// 读取 redis 中的数据@RequestMapping("/get")public String get(String name) {Object valObj = stringRedisTemplate.opsForValue().get(name);if (valObj != null) {return valObj.toString();}return "Null";}
}

通过postman发送请求测试: 

下面测试存入字典(Hash)类型: 

    // 在 redis 存储数据@RequestMapping("/set2")public String set2() {stringRedisTemplate.opsForHash().put("myhash","name","ws");return "Set redis success.";}// 读取 redis 中的数据@RequestMapping("/get2")public String get2() {Object valObj = stringRedisTemplate.opsForHash().get("myhash", "name");if (valObj != null) {return valObj.toString();}return "Null";}

Session持久化存储到Redis 

1.添加依赖

或者在pom.xml中引入: 


<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.修改redis配置

# 设置连接的Redis数据库的索引。默认情况下,索引为0,即连接到默认的数据库。
# 如果设置多个Redis实例,可以通过此项进行区分。
spring.redis.database=0
# 设置连接的Redis服务器的主机名或IP地址
spring.redis.host=x.x.x.x
spring.redis.password=
# 设置连接的Redis服务器的端口号。在此,服务器的端口号为6379,这是Redis默认的端口号,默认的话可以省略不写。
spring.redis.port=6379
# 设置会话存储类型为Redis
spring.session.store-type=redis
# 设置服务器上所有Servlet的会话超时时间为1800秒,即30分钟。
# Spring Boot默认的会话超时时间为30分钟,但在这里,它被明确地设定为1800秒
server.servlet.session.timeout=1800
# 设置Redis的flush mode为'on_save'。flush mode决定了何时将数据写入磁盘。
# 'on_save'意味着每次数据被保存时都会立即写入磁盘,这可以保证数据的持久性,但可能会影响性能。
spring.session.redis.flush-mode=on_save
# 设置Spring Session在Redis中的命名空间为'spring:session'。
# 这是为了防止不同的应用在同一Redis实例中产生数据冲突。每个应用都可以使用不同的命名空间来保存自己的会话数据。
spring.session.redis.namespace=spring:session

3.存储和读取String类型的代码  

@RestController
@RequestMapping("/user")
public class UserController {// user session keyprivate static final String SESSION_KEY_USERINFO = "SESSION_KEY_USERINFO";@RequestMapping("/set")public String set(HttpSession session) {session.setAttribute(SESSION_KEY_USERINFO, "ws");return "ok";}@RequestMapping("/get")public String get(HttpServletRequest request) {HttpSession session = request.getSession(false);Object userObj = null;if (session != null && (userObj = session.getAttribute(SESSION_KEY_USERINFO)) != null) {return (String) userObj;}return "Null";}
}

通过postman进行测试:

4.存储和读取对象类型的代码  

实体类:

@Data
public class UserInfo {private int id;private String username;private int age;
}

controller类:

@RestController
@RequestMapping("/user")
public class UserController {// user session keyprivate static final String SESSION_KEY_USERINFO = "SESSION_KEY_USERINFO";@RequestMapping("/set")public String set(HttpSession session) {//...经过一系列的判断UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setUsername("ws");userInfo.setAge(18);session.setAttribute(SESSION_KEY_USERINFO, userInfo);return "ok";}@RequestMapping("/get")public UserInfo get(HttpServletRequest request) {HttpSession session = request.getSession(false);Object userObj = null;if (session != null && (userObj = session.getAttribute(SESSION_KEY_USERINFO)) != null) {return (UserInfo) userObj;}return null;}
}

通过postman测试:发现是序列化的问题 

解决方案: 

让UserInfo类实现序列化接口,同时生成序列化版本号。
ps:凡是实现Serializable接口(标识接口)的类都有一个表示序列化版本标识符的静态常量:
private static final long serialVersionUID;
serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关各版本反序加化时是否兼容。
如果类没有显示定义这个静态变量,它的值是Java运行时环境根据类的内部细节自动生成的。若类的实例变量做了修改,serialVersionUID 可能发生变化。故建议,显式声明。
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidCastException)

设置生成序列化版本号: 

在类上面ALT+ENTER: 

再次测试: 

5.序列化细节

(1)被序列化的类的内部的所有属性,必须是可序列化的 (基本数据类型都是可序列化的
(2)static,transient修饰的属性 不可以被序列化

再测试下: 

什么时候用static和transient?

static类共享的时候
transient:比如说银行卡的密码,不想被持久化(序列化),写到文件中假如被别人窃取了,别人可以通过反序列化把密码读出来(破解),需要保护的东西就可以用transient来修饰 

 

相关文章:

【SpringBoot集成Redis + Session持久化存储到Redis】

目录 SpringBoot集成Redis 1.添加 redis 依赖 2.配置 redis 3.手动操作 redis Session持久化存储到Redis 1.添加依赖 2.修改redis配置 3.存储和读取String类型的代码 4.存储和读取对象类型的代码 5.序列化细节 SpringBoot集成Redis 1.添加 redis 依赖 …...

day49:QT day2,信号与槽、对话框

一、完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两个…...

Meta分析核心技术

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

Gof23设计模式之责任链模式

1.概述 责任链模式又名职责链模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这条链传递&#xff0c;直到有对象处理它为止…...

数字孪生和元宇宙:打造未来的数字边界

数字孪生和元宇宙是近两年来被热议的两个概念&#xff0c;但由于技术的交叉两者也极易被混淆。本文希望带大家深入探讨一下这两者之间的关系&#xff0c;以及它们如何一起构建了数字时代的新格局。 1. 数字孪生的本质 数字孪生是一种虚拟模型&#xff0c;它通过数字手段对现实…...

【新版】系统架构设计师 - 软件架构设计<新版>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件架构设计&#xff1c;新版&#xff1e;考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD&#xff08;ABSDM模型&#xff09;的开发过程 软件架…...

Linux面试题

当准备 Linux 面试时&#xff0c;以下是一些可能会遇到的常见 Linux 面试题&#xff1a; 1. 什么是Linux&#xff1f;解释一下Linux操作系统的特点。 2. 什么是Linux内核&#xff1f;Linux内核的作用是什么&#xff1f; 3. 如何在Linux系统上查看当前的IP地址和子网掩码&#…...

NODEJS版本管理工具

一、使用NVM 下载 Linux下载 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh widows下载地址 https://github.com/coreybutler/nvm-windows/releases 安装Node.js版本&#xff1a; nvm install 14.16.0 切换Node.js版本&#xff1a; nvm use …...

【个人笔记本】本地化部署 类chatgpt模型 详细流程

不推荐小白&#xff0c;环境配置比较复杂 全部流程 下载原始模型&#xff1a;Chinese-LLaMA-Alpaca-2linux部署llamacpp环境使用llamacpp将Chinese-LLaMA-Alpaca-2模型转换为gguf模型windows部署Text generation web UI 环境使用Text generation web UI 加载模型并进行对话 准…...

RFID与人工智能怎么融合,RFID与人工智能融合的应用

随着物联网技术的不断发展&#xff0c;现实世界与数字世界的桥梁已经被打通。物联网通过各种传感器&#xff0c;将现实世界中的光、电、热等信号转化为有价值的数据。这些数据可以通过RFID技术进行自动收集和传输&#xff0c;然后经由人工智能算法进行分析、建模和预测&#xf…...

性能测试 —— Jmeter 常用三种定时器

1、同步定时器 位置&#xff1a;HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时&#xff0c;为了让用户能真正的同时执行&#xff0c;添加同步定时器&#xff0c;用户阻塞线程&#xff0c;知道线程数达到预先配置的数值&#xff0c;才开始执行…...

每个高级前端工程师都应该知道的前端布局

首发于公众号 大迁世界,欢迎关注。📝 每周一篇实用的前端文章 🛠️ 分享值得关注的开发工具 😜 分享个人创业过程中的趣事 快来免费体验ChatGpt plus版本的,我们出的钱 体验地址:https://chat.waixingyun.cn 可以加入网站底部技术群,一起找bug,另外新版作图神器已上线…...

100道基于Android毕业设计的选题题目,持续更新

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好&#xff0c;我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目&#xff0c;以及基于an…...

idea显示git分支信息(GitToolBox插件)

效果图 说明 本身idea在右下角会有git分支信息&#xff0c;但是显示的当前打开文件的分支信息&#xff0c;并且不够显眼 解决 1、安装插件(GitToolBox插件) 2、修改idea.properties project.tree.structure.show.urlfalse ide.tree.horizontal.default.autoscrollingfalse将…...

Hadoop知识点之Hadoop发展历程

一、Hadoop名字的起源 Hadoop这个名字不是一个缩写&#xff0c;它是一个虚构的名字。 该项目的创建者&#xff0c;Doug Cutting如此解释Hadoop&#xff1a; 这个名字是我孩子给一头吃饱了的棕黄色大象命名的。我的命名标准就是简短&#xff0c;容易发音和拼写&#xff0c;没有…...

阿里云无影电脑:免费体验无影云电脑3个月

阿里云无影云电脑免费领取流程&#xff0c;免费无影云电脑配置为4核8G&#xff0c;可以免费使用3个月&#xff0c;阿里云百科分享阿里云无影云电脑&#xff08;云桌面&#xff09;免费申请入口、申请流程及免费使用限制条件说明&#xff1a; 目录 阿里云无影云电脑免费申请入…...

菜鸟教程《Python 3 教程》笔记(20):面向对象

菜鸟教程《Python 3 教程》笔记&#xff08;20&#xff09; 20 面向对象20.1 面向对象技术简介20.2 创建类20.2.1 类定义20.2.2 实例化20.2.3 初始化20.2.4 类变量、实例变量20.2.5 类方法、实例方法、静态方法 20.3 访问可见性20.3.1 property装饰器 20.4 动态性20.4.1 __slot…...

vue2编辑markdown

效果 npm i mavon-editor --save 只能全局注册 使用...

PCB走线规则

1、线间距。 这里应该遵循3W规则&#xff0c;所谓3W就是为了减少线间串扰&#xff0c;应保证线间距足够大&#xff0c;当线中心不少于3倍线宽&#xff0c;则可 保持70%的电场不互相干扰。如要达到98%的电场不互相干扰&#xff0c;可使用10W的间距。——这是查阅华为PCB布线规则…...

webpack静态资源上传到CDNS (阿里云 OSS,亚马逊 AWS S3,七牛云 Qiniu Cloud Kodo)webpack-plugin-cdns

webpack-plugin-cdns 是一个 Webpack 插件&#xff0c;用于实现将前端项目中的资源&#xff08;如 JavaScript、CSS、图片等&#xff09;上传到 CDN(OSS、S3、Kodo) 服务器。从而完成资源的 CDN 加速。 在开发前端项目时&#xff0c;我们通常会将静态资源放在本地服务器上&…...

OpenClaw 2.6.4 一键部署教程|零代码零基础无需命令快速上手

OpenClaw 是一款可以在本地运行的智能操作工具&#xff0c;能够通过自然语言指令完成电脑自动化操作&#xff0c;无需复杂配置即可快速使用。本文为 Windows 10/11 64 位系统提供完整的一键部署流程&#xff0c;帮助用户快速搭建属于自己的本地智能工具。 适配系统&#xff1a…...

从DataOperation接口到QuickSort实现:探究适配器模式在算法整合中的应用

1. 适配器模式&#xff1a;解决接口不兼容的桥梁 想象一下你从国外带回来一个三脚插头的电器&#xff0c;但家里的插座都是两孔的。这时候你会怎么做&#xff1f;大多数人会选择买一个转换插头。在编程世界里&#xff0c;适配器模式就是这个万能的"转换插头"。 最近我…...

从‘能用’到‘优雅’:Python函数设计的3个坏味道与5个重构技巧(附代码对比)

从‘能用’到‘优雅’&#xff1a;Python函数设计的3个坏味道与5个重构技巧&#xff08;附代码对比&#xff09; 在Python开发中&#xff0c;函数是最基本的代码组织单元。许多开发者能够快速实现功能&#xff0c;却往往忽视了函数设计的质量。本文将揭示三种典型的函数设计&qu…...

别再死记硬背了!用一张图+代码片段,彻底搞懂Element UI Menu组件的嵌套关系

可视化拆解Element UI菜单组件&#xff1a;从零构建多级导航系统 每次看到Element UI文档里那些层层嵌套的菜单代码&#xff0c;是不是感觉像在解一道复杂的数学题&#xff1f;作为Vue生态中最受欢迎的UI框架之一&#xff0c;Element UI的菜单组件确实功能强大&#xff0c;但初…...

DICOM文件里除了图像,还藏了哪些信息?一份给开发者的隐私与元数据解析指南

DICOM文件里除了图像&#xff0c;还藏了哪些信息&#xff1f;一份给开发者的隐私与元数据解析指南 医疗影像数据是AI模型训练和医疗信息系统开发的重要基础&#xff0c;但许多开发者往往只关注图像像素本身&#xff0c;忽略了DICOM文件中蕴含的丰富元数据。这些元数据不仅包含关…...

Simulink进阶:用S-Function Builder封装你的C语言电机控制算法(以MTPA为例)

Simulink进阶&#xff1a;用S-Function Builder封装C语言电机控制算法实战指南 在电机控制领域&#xff0c;算法验证环节常常面临一个关键矛盾&#xff1a;DSP嵌入式代码的高效性与Simulink系统级仿真的可视化优势如何兼得&#xff1f;我曾参与过一个永磁同步电机控制项目&…...

IL-8 Inhibitor ;Ac-RRWWCR-NH₂

一、基础信息多肽名称&#xff1a;IL-8 Inhibitor&#xff08;白介素 8 抑制剂肽&#xff09; 修饰&#xff1a;N 端乙酰化 Ac-&#xff0c;C 端酰胺化 -NH₂ 三字母序列&#xff1a;Ac-Arg-Arg-Trp-Trp-Cys-Arg-NH₂ 单字母序列&#xff1a;Ac-RRWWCR-NH₂ 氨基酸数量&#xf…...

别再手动算归一化了!用Origin9.1的‘列公式’功能一键搞定数据预处理

用Origin9.1列公式功能高效实现数据归一化&#xff1a;从原理到实战 科研数据处理中&#xff0c;归一化是消除量纲影响、提升分析结果可比性的关键步骤。传统手动计算不仅耗时费力&#xff0c;还容易因公式输入错误导致结果偏差。Origin9.1的"列公式"功能&#xff08…...

AI-Trader性能优化:提升AI代理交易速度的10个终极技巧

AI-Trader性能优化&#xff1a;提升AI代理交易速度的10个终极技巧 【免费下载链接】AI-Trader "AI-Trader: 100% Fully-Automated Agent-Native Trading" 项目地址: https://gitcode.com/GitHub_Trending/aitrad/AI-Trader AI-Trader作为100%全自动化的AI代理…...

AI 内容生成 API 适合哪些团队?自媒体、电商、营销公司怎么用更省钱

现在很多团队都在用 AI 写内容。但很多人还停留在网页聊天阶段&#xff1a;打开一个 AI 工具&#xff0c;把需求复制进去&#xff0c;再把结果复制出来。这个方法适合个人临时用&#xff0c;但如果是团队长期做内容&#xff0c;尤其是自媒体、电商、营销公司、短视频团队&#…...