SpringBoot + Redis实现用户信息登录的缓存

🍎前言

🍐项目的背景

背景:🍉当我们在完成用户信息登录时,我们往往每次都会在数据库中查询用户的记录,生成token并返回给前端,不过这样会有一定的问题。

🍐造成的问题

问题:🍉每次都需要访问数据库进行查询操作,是否显得麻烦,是否会给数据库造成一定的压力?

🍐解决的方案

解决方案:🍉我们通过实现redis数据库进行用户数据的缓存,并且设置一下缓存的过期时间,从而下次再登录时,就能从redis数据库缓存中获取数据了

🍎项目的版本

🍉jdk:17

🍉springboot:3.0.2

🍉redis版本:5.0.14

🍉maven版本:3.8.8

🍉idea版本:2023

🍐引入相关依赖

我们再pom.xml引入一下redis的依赖

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

在application.yaml配置文件配置一下redis数据库的依赖

spring:data:redis:host: localhostport: 6379password: 123456database: 1timeout: 3000ms #最大等待时间,超时则抛出异常,否则请求一直等待lettuce:pool:max-active: 20  #最大连接数,负值表示没有限制,默认8max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1max-idle: 8     #最大空闲连接,默认8min-idle: 0     #最小空闲连接,默认0

🍉注意:想要使用redis做缓存,我们必须得把我们相关的实体类实现一个序列化接口为Serializable

否则无法存储在redis中

🍎创建控制层

🍉这里我就以用户的账号和密码做登录来查询用户数据。

🌕这里先上代码,我们下面的几个对象一个个做说明

🍉redisTemplate:创建了redis模板对象

🍉userService:对user的业务层,里面写了根据用户名和密码查询用户的信息

🍉fileUploadUtil:文件上传的工具类,这里不展开讲

下面是重点了

🍉redisCacheUtils:创建了一个用于获取redis中数据缓存的工具类对象,这个后面再讲

🌕在我们的/login的接口部分中使用redisCacheUtils调用了一个方法,并且传递了以下三个对象

分别是:

🍉redisTemplate

🍉userService

🍉userDTOLogin

🌕注意:为什么需要这么传呢?由于登录的方式可能不止这一个,我们可能有许多的登陆方式,但是每次传递的最后一个参数实体类对象不一致,所以存储的key也会有相应的变化

@RestController
@RequestMapping("/pcClientUser/Login")
@Slf4j
@RequiredArgsConstructor
public class LoginController {// redis模板对象private final RedisTemplate redisTemplate;// user相关的业务层private final UserService userService;// 文件上传工具类private final FileUploadUtil fileUploadUtil;// 创建用户获取redis中数据缓存的工具类private final RedisCacheUtils redisCacheUtils;   /*** 用户账号密码登录** @param userDTOLogin* @return*/@PostMapping("/login")public Result Login(@RequestBody UserDTOLogin userDTOLogin) {log.info("用户登录");UserLoginVO userInfo = redisCacheUtils.FindRedisCacheUserInfo(redisTemplate, userService, userDTOLogin);return Result.success(Constants.LOGIN.getValue(), userInfo);}
}

🍉这里是我的UserDtoLogin的代码,这里面的也就是前端传过来的账号密码

package com.sxy.recordnetwork.DTO.USER;import lombok.*;@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
@Builder
public class UserDTOLogin {// 账号private String userName;// 密码private String passWord;}

🍉接下类我们来看看redisCacheUtils这个类里面有什么奇妙之处吧?

🍎创建一个redisCacheUtils工具类

package com.sxy.recordnetwork.Utils;import com.sxy.recordnetwork.DTO.USER.UserDTOLogin;
import com.sxy.recordnetwork.DTO.USER.UserDtoEmailLogin;
import com.sxy.recordnetwork.DTO.USER.UserDtoPhoneLogin;
import com.sxy.recordnetwork.VO.User.UserLoginVO;
import com.sxy.recordnetwork.common.Result;
import com.sxy.recordnetwork.enumeration.Constants;
import com.sxy.recordnetwork.service.UserService;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/*** redis缓存相关操作的工具类*/
@Component
public class RedisCacheUtils {/*** 一个用于存储在redis中的用户信息的工具类,适用于所有登录的共同抽离方法* 该方法用于从redis中获取用户信息** @param redisTemplate* @param object* @return*/public UserLoginVO FindRedisCacheUserInfo(RedisTemplate redisTemplate, UserService userService, Object object) {// 操作hash类型的redisHashOperations hashOperations = redisTemplate.opsForHash();// hash最外层的keyString hashKey = Constants.REDIS_USER_INFO_CACHE.getValue();// 用户信息UserLoginVO userInfo = null;// 这里做的是账号密码登录所操作的数据if (object instanceof UserDTOLogin userDTOLogin) {hashKey += userDTOLogin.getUserName();// 找到用户信息直接returnif (hashOperations.get(hashKey, userDTOLogin.getUserName()) != null) {// 转为用户对象userInfo = (UserLoginVO) hashOperations.get(hashKey, userDTOLogin.getUserName());// 直接返回给前端return userInfo;}// redis中不存在目标用户的数据情况// 通过数据库查询用户数据userInfo = userService.Login(userDTOLogin);// 并且将用户数据存储到redis数据库中hashOperations.put(hashKey, userDTOLogin.getUserName(), userInfo);// 设置过期时间redisTemplate.expire(hashKey, 7200000, TimeUnit.SECONDS);return userInfo;}// 不是目标对象直接返回nullreturn null;}}

🍉这个类里有一个FindRedisCacheUserInfo这个方法,也就是我控制层调用的这个方法

🍉方法中有三个参数,分别是:redisTemplate模板对象,userService对象,和object对象

🍉这个object对象很有用处。是用来根据不同登录,传递不同的对象来做类型的判断,对不同的登录操作进行存储不同的key和值

🍉首先我们通过redis模板创建一个hash类型的redis

🍉接着有一个最外层的key就是获取hash的key这里有定义为一个枚举类,具体内容可以随意加

🍉创建了一个用户信息UserLoginVo,这里的用户信息就是所有登录之后查询的用户信息进行返回

🍉接下来进行instanceof关键字的类型判断,

🍉判断传过来的类型是否是UserDTOLogin对象,是则创建该对象

🍉得到hashkey对用户名进行拼接得到一个唯一key,我这里的用户名是唯一的所以不用担心会重复

🍐用户信息不存在redis中的情况

🍉这里直接通过对象的参数,查询用户信息的方法。

🍉将用户信息存储到redis中设置hashkey进行put数据

🍉参数列表为(hash唯一key,field为用户名,数据为用户信息)

🍉直接通过redisTemplate对象属性.expire为指定的key设置过期时间

🍉参数列表为:key,时间,单位

🍉返回给控制层视图,最后控制层视图就直接返回数据给前端

🍐用户信息存在redis中的情况

🍉通过hash类型.get方法传入指定参数得到数据

🍉参数列表:hash唯一key,field为用户名

🍉查出来:不等于空就通过key和field,查询redis的用户的信息转为UserLoginVo对象

🍉返回给控制层视图,最后控制层视图就直接返回数据给前端

🍎总结

🍉以上就是今天分享的内容,在用户登录时将数据存储到redis缓存中,下次登录就无需直接访问mysql数据库层,而是直接从redis缓存中读取用户的数据,直接返回。这样就减轻了数据库的压力,以及服务器的压力。

如有问题,欢迎在下方评论区留言,感谢大家的支持,给个三连呗~🍒

欢迎大家关注我的微信公众号,里面分享了更多的开发技巧?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2968983.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《游戏系统设计十二》灵活且简单的条件检查系统

目录 1、序言 2、需求 3、实现 3.1 思路 3.2 代码实现 4、总结 1、序言 每个游戏都有一些检查性的任务&#xff0c;在做一些判断的时候&#xff0c;判断等级是不是满足需求。 比如如下场景&#xff1a;在进入副本的时候需要检查玩家等级是否满足&#xff0c;满足之后才…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…

vue里面事件修饰符.stop使用案例

Vue.js 事件修饰符 .stop 用于阻止事件继续传播&#xff0c;即阻止事件冒泡。这在处理父子组件之间的事件通信时特别有用&#xff0c;可以防止事件从子组件冒泡到父组件&#xff0c;或者在一个元素上绑定多个事件处理函数时&#xff0c;阻止后续事件处理函数的执行。 下面是一个…

nodejs工具模块学习

util 是一个Node.js 核心模块&#xff0c;提供常用函数的集合&#xff1b; util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法&#xff0c;通常用于调试和错误输出&#xff1b; 如果只有一个参数 object&#xff0c;是要转换的对象&…

Web前端 Javascript笔记6

BOM 前面的笔记讲的都是DOM&#xff08;文档对象模型&#xff09;&#xff0c;DOM几乎被所有浏览器支持&#xff0c;是DOM的作用为操作HTML文档的重要手段。利用DOM可以对HTML文档中的所有元素&#xff0c;节点进行获取与访问&#xff0c;对标签属性与样式进行设置。 下面是一…

Linux下SPI设备驱动实验:创建SPI节点及SPI设备子节点

一. 简介 SPI 驱动框架和 I2C 很类似&#xff0c;都分为主机控制器驱动和设备驱动。主机控制器驱动一般由半导体厂商写好&#xff0c;我们来编写SPI设备驱动代码。 前一篇文章分析了 IMX6U系列芯片的 SPI中片选信号的处理&#xff0c;文章如下&#xff1a; I.MX6ULL SPI 主机控…

学习Python先从了解Python开始

Python是一种高级编程语言&#xff0c;它的语法简洁易读&#xff0c;功能强大&#xff0c;应用领域广泛。Python不仅适用于数据科学、机器学习、Web开发等领域&#xff0c;还可以用于自动化脚本编写、游戏开发等。在本文中&#xff0c;我们将探讨Python的特点、应用领域以及未来…

噪声系数测试之增益法

提到增益法测试噪声系数,大家并不陌生,这是一种简洁的测试方法,精度不如Y因子法,但是在某些测试场合,比如只有频谱仪而没有噪声头时,且待测件具有非常高的增益时,就可以使用增益法测试噪声系数。 增益法测试噪声系数的连接示意图如图1所示,其思路为:DUT输入端端接50 …

【UE 材质】雨水流淌效果

在上一篇&#xff08;【UE 材质】雨滴效果&#xff09;基础上继续实现雨水从顶部沿着墙壁侧面向下流淌的效果 效果 步骤 1. 下载所需纹理 2. 新建一个材质函数&#xff0c;这里命名为“MF_Weather_Drips”&#xff0c;在材质函数中添加如下节点 其中输入节点的默认值分别为…

【leetcode面试经典150题】61. 反转链表 II(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【MIT6.824】lab2C-persistence, lab2D-log compaction 实现笔记

引言 lab2C的实验要求如下 Complete the functions persist() and readPersist() in raft.go by adding code to save and restore persistent state. You will need to encode (or “serialize”) the state as an array of bytes in order to pass it to the Persister. Us…

WebLogic 数据源连接泄露

编码时&#xff0c;有时会忘记释放使用的数据源连接&#xff0c;造成连接泄露&#xff0c;没有连接资源可用。 现象 java.sql.SQLException: Cannot obtain XAConnectionat weblogic.jdbc.jta.DataSource.refreshXAConnAndEnlist(DataSource.java:1691)at weblogic.jdbc.jta.…

hackthebox - Redeemer

2024.4.19 TASK 1 Which TCP port is open on the machine? 6379 TASK 2 Which service is running on the port that is open on the machine? redis TASK 3 What type of database is Redis? Choose from the following options: (i) In-memory Database, (ii) Traditiona…

logisim 图解超前进位加法器原理解释

鄙人是视频作者&#xff0c;文件在视频简介的网盘链接。 找规律图解超前进位加法器与原理解释_哔哩哔哩_bilibili 一句话就是“把能导致进位到这个位置的情况全都穷举一遍。” 穷举情况看图中算式。 视频讲解比较啰嗦。

JavaFX--基础简介(1)

一、介绍 中文官网&#xff1a;JavaFX中文官方网站OpenJFX 是一个开源项目,用于桌面、移动端和嵌入式系统的下一代客户端应用程序平台。openjfx.cn是OpenJFX(JavaFX)的标准中文翻译网站&#xff0c;致力于方便开发者阅读官方文档和教程。https://openjfx.cn/ JavaFX 是一个开…

GUI04-深入分析基于框架窗口的应用

复杂应用最常见的桌面程序&#xff0c;基本都使用框架式的主窗口。本节涉及&#xff1a; 常见的应用中&#xff0c;哪些使用了框架窗口&#xff1f;wxWidgets 项目配置详解&#xff08;为将来手工写wxWigets项目配置打基础&#xff09;&#xff1b;复习如何使用Code::Blocks的向…

javaagent使用

Java Agent是什么&#xff1f; Java Agent是Java平台提供的一个强大工具&#xff0c;它可以在运行时修改或增强Java应用程序的行为。是在JDK1.5以后引入的&#xff0c;它能够在不影响正常编译的情况下修改字节码&#xff0c;相当于是在main方法执行之前的拦截器&#xff0c;也叫…

MySQL高级(索引-性能分析-profile)

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪去了。通过 have_profiling参数&#xff0c;能够看到当前MySQL 是否支持 profile 操作&#xff1a; select have_profiling 默认 profiling 是关闭的 select profiling; 可以通过 set 语句在 session / global 级…

unordered系列关联式容器和开散列与闭散列的模拟实现

文章目录 unordered系列关联式容器底层结构哈希的概念哈希冲突哈希函数常见哈希函数 哈希冲突的解决闭散列开散列 闭散列模拟实现基本框架基本函数 开散列模拟实现 unordered系列关联式容器 之前我们讲到&#xff0c;STL提供了底层为红黑树的一系列关联式容器&#xff0c;可以…

java项目连接sqlserver时报ssl相关错误,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…