spring boot利用redis作为缓存

一、缓存介绍

         在 Spring Boot 中,可以使用 Spring Cache abstraction 来实现缓存功能。Spring Cache abstraction 是 Spring 框架提供的一个抽象层,它对底层缓存实现(如 Redis、Ehcache、Caffeine 等)进行了封装,使得在不同的缓存实现之间切换变得更加方便。

        Spring Cache Abstraction 的实现原理主要是通过在运行时动态创建代理对象来实现的。当一个带有缓存注解的方法被调用时,代理对象首先检查指定的缓存中是否已有方法的返回值,如果缓存中有,则直接返回缓存中的值,否则调用原方法获取返回值,并将返回值存入缓存中,再返回给调用者。

        在具体实现上,Spring Cache Abstraction 依赖于 CacheManager 和 Cache 两个接口来实现对缓存的管理和操作。CacheManager 接口提供了获取特定缓存的实例的能力,而 Cache 接口则提供了实际的缓存操作,如 get、put 和 evict 等。

        同时,在 Spring Boot 中,我们可以通过配置来指定使用的缓存类型以及其他相关属性,比如缓存的过期时间、最大缓存数量等。

二、利用redis实现缓存

spring boot的整体的设计思路是约定大于配置,约定俗成,第一步,我们需要引入redis和cache的相关的依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

注意:commons-pool2必须引入,不然可能会报java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig错误

第二步,配置spring boot配置文件application.yml

spring:redis:host: 127.0.0.1password:database: 0port: 6379lettuce:pool:max-idle: 8max-active: 8max-wait: 3000msmin-idle: 0cache:# 指定Redis作为缓存实现type: redis# 指定项目中的cacheNamescache-names:- USERSredis:# 缓存过期时间为10分钟,单位为毫秒time-to-live: 600000# 是否允许缓存空数据,当查询到的结果为空时缓存空数据到redis中cache-null-values: true# 为Redis的KEY拼接前缀key-prefix: "BOOT_CACHE:"# 是否拼接KEY前缀use-key-prefix: true# 是否开启缓存统计enable-statistics: false

第三步,配置序列化器

@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {// 获取Properties中Redis的配置信息CacheProperties.Redis redisProperties = cacheProperties.getRedis();// 获取RedisCacheConfiguration的默认配置对象RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();// 指定序列化器为GenericJackson2JsonRedisSerializerconfig = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));// 过期时间设置if (redisProperties.getTimeToLive() != null) {config = config.entryTtl(redisProperties.getTimeToLive());}// KEY前缀配置if (redisProperties.getKeyPrefix() != null) {config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());}// 缓存空值配置if (!redisProperties.isCacheNullValues()) {config = config.disableCachingNullValues();}// 是否启用前缀if (!redisProperties.isUseKeyPrefix()) {config = config.disableKeyPrefix();}return config;}
}

第四步,开启缓存-@EnableCaching

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) throws Exception {SpringApplication springApplication=new SpringApplication(Application.class);springApplication.setBannerMode(Banner.Mode.OFF);springApplication.run(args);}
}

到此,我们利用redis作为spring boot的缓存已经搭建好了,下面我们来做个测试,这里就不使用数据库了,我们使用数据来自己模拟数据库数据查询,模拟数据访问层

@Repository
@Slf4j
public class UserMapper {public final Map<String, SystemUser> map = new HashMap<>();@PostConstructpublic void init(){SystemPermissions permissions1 = new SystemPermissions("1", "query");SystemPermissions permissions2 = new SystemPermissions("2", "add");Set<SystemPermissions> permissionsSet = new HashSet<>();permissionsSet.add(permissions1);permissionsSet.add(permissions2);SystemRole role = new SystemRole("1", "admin", permissionsSet);Set<SystemRole> roleSet = new HashSet<>();roleSet.add(role);SystemUser user = new SystemUser();user.setUserName("test");user.setUserId(UUID.randomUUID().toString());user.setUserPwd("123456");user.setSystemRoles(roleSet);map.put(user.getUserName(), user);Set<SystemPermissions> permissionsSet1 = new HashSet<>();permissionsSet1.add(permissions1);SystemRole role1 = new SystemRole("2", "user", permissionsSet1);Set<SystemRole> roleSet1 = new HashSet<>();roleSet1.add(role1);SystemUser user1 = new SystemUser();user1.setUserName("test1");user1.setUserId(UUID.randomUUID().toString());user1.setUserPwd("123456");user1.setSystemRoles(roleSet1);map.put(user1.getUserName(), user1);}public SystemUser queryUser(String userName){log.error("queryUser_没有走缓存:"+userName);return map.get(userName);}
}

以上类是自己的类,自己实现时可以换成自己的,编写service

public interface UserService {SystemUser getUserByName(String userName);}@Service
public class UserServiceImpl implements UserService{private final UserMapper userMapper;public UserServiceImpl(UserMapper userMapper) {this.userMapper = userMapper;}@Cacheable(cacheNames = "USERS",key = "#userName")@Overridepublic SystemUser getUserByName(String userName) {return userMapper.queryUser(userName);}
}

编写controller

@RestController
@Slf4j
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@GetMapping("queryUser")public JsonResult getUser(String userName){SystemUser user=userService.getUserByName(userName);return new JsonResult<>("0", "查询成功", user);}
}

测试,可以看到,此时我们的redis中没有数据

第一次,请求没有走缓存,我们再看redis,已经有了数据,第二次请求直接拿了redis缓存中的数据

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在VScode中让printf输出中文

如何在VScode中让printf输出中文&#xff1f; 1、在“Visual Studio Code”图标上右击&#xff0c;弹出对话框。见下图&#xff1a; 2、点击“以管理员身份运行”&#xff0c;得到下图&#xff1a; 3、点击“UTF-8”按钮&#xff0c;得到下图&#xff1a; 4、点击“通过编码重…

Docker创建mysql容器

1.递归创建目录&#xff0c;若上级目录不存在&#xff0c;会按目录层级自动创建目录 mkdir -p创建宿主机挂载文件夹 mkdir -p /data/docker/mysql/{conf,data,logs}/ 2.拉取mysql镜像 docker pull mysql:8.0 3.创建容器 docker run -itd --restartalways --name mysql8.…

电脑提示找不到msvcp140.dll无法继续执行代码的4种解决办法

今天我想和大家分享的是关于找不到msvcp140.dll无法继续执行代码的4种解决办法。在我们日常的教学和工作中&#xff0c;有时候会遇到这样的问题&#xff0c;让我们感到困惑和无奈。那么&#xff0c;msvcp140.dll究竟是什么&#xff1f;为什么会丢失呢&#xff1f;接下来&#x…

[hive] 窗口函数 ROW_NUMBER()

文章目录 ROW_NUMBER() 示例窗口函数 ROW_NUMBER() 在 Hive SQL 中&#xff0c;ROW_NUMBER()是一个用于生成行号的窗口函数。 它可以为查询结果集中的每一行分配一个唯一的行号。 以下是 ROW_NUMBER() 函数的基本语法&#xff1a; ROW_NUMBER() OVER (PARTITION BY column…

matlab simulink PMSM永磁电机DTC控制

1、内容简介 略 10-可以交流、咨询、答疑 2、内容说明 PMSM永磁电机DTC控制 PMSM、永磁电机、DTC控制 传 是 &#xff0c;它的工作原理是&#xff1a;首先设定好运行期望值和滞环的容差值&#xff0c;然后把电机 到的差值 号输出&#xff0c;可以 示需要减小 大输出…

MySQL数据库备份实战

一、为什么进行数据库备份? 保证业务连续性:数据库中存储着企业的核心业务数据,如果数据丢失或损坏,将会对企业的业务运营产生重大影响。通过定期备份数据库,可以在系统故障或数据丢失时快速恢复数据,保证业务的连续性。 保护数据资产:数据库中存储着企业的重要数据资产…

【Linux】虚拟机安装Linux、客户端工具及Linux常用命令(详细教程)

目录 一、导言 1、引言 2、使用场景 二、Linux安装 1、安装 2、网络配置 2.1、查看网络配置 2.2、更改网络配置 三、安装客户端工具 1、介绍 2、安装MobaXterm 3、换源 4、拍照功能 四、常用命令 一、导言 1、引言 Linux是一个开源的操作系统内核&#xff0c;它最…

基于Pytorch的驾驶员分心行为实时检测

本文使用深度学习和Pytorch(PyTorch 2.0.1\Torchvision 0.15.2)实时检测驾驶员的分心行为,并附录完整代码。 检测分心驾驶是现代汽车中最重要的功能之一。无论是自动驾驶汽车还是其它高端汽车,都配备了驾驶员监控系统,以持续跟踪驾驶员的行为。这对确保驾驶员保持目光在道路…

数据分享 I 地级市人口和土地使用面积基本情况

数据地址&#xff1a; 地级市人口和土地使用面积基本情况https://www.xcitybox.com/datamarketview/#/Productpage?id394 基本信息. 数据名称: 地级市人口和土地使用面积基本情况 数据格式: ShpExcel 数据时间: 2021年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据…

【Maven教程】(九):使用 Maven 进行测试 ~

目录 1️⃣ account-captcha 1.1 account-captcha 1.2 account-captcha 的主代码 1.3 account-captcha的测试代码 2️⃣ maven-surefire-plugin 简介 3️⃣ 跳过测试 4️⃣ 动态指定要运行的测试用例 5️⃣ 包含与排除测试用例 6️⃣ 测试报告 6.1基本的测试报告 6.…

通过jsonobject.tostring 传字符串为有空格问题

目录 通过jsonobject.tostring 传字符串为有空格问题 1.问题原因解决思路解决方案总结参考 文章所属专区 项目问题解决 1.问题原因 通过JSONObject.toString()方法将字符串转换为JSON格式时&#xff0c;可能会出现空格的情况。这是因为JSONObject.toString()方法在生成JSON字…

Games104现代游戏引擎笔记 网络游戏进阶架构

Character Movement Replication 角色位移同步 玩家2的视角看玩家1的移动是起伏一截一截&#xff0c;并且滞后的 interpolation&#xff1a;内插值&#xff0c;在两个旧的但已知的状态计算 extrapolation&#xff1a;外插值&#xff0c;本质是预测 内插值&#xff1a;但网络随着…

ICLR 2023丨3DSQA:3D 场景中的情景问答

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2210.07474.pdf 主页链接&#xff1a;http://sqa3d.github.io 图 1&#xff1a;3D 场景中情景问答 (SQA3D) 的任务图示。给定场景上下文 S&#xff08;例如&#…

图情档核心期刊 | 北大核心、CSSCI、CSCD

中文核心期刊要目总览&#xff08;A Guide to the Core Journal of China&#xff0c; 简称北大核心&#xff09;&#xff1a; 主办单位&#xff1a;北京大学图书馆更新频率&#xff1a;北大核心在2008年之前每4年更新研究和编制出版一次&#xff0c;2008年之后&#xff0c;改为…

面试题-React(十九):React Hook

当React 16.8版本引入Hooks时&#xff0c;它引入了一种新的方式来在函数组件中处理状态和副作用&#xff0c;这种方式称为"Hook"。Hooks让您能够在无需编写类组件的情况下&#xff0c;使用React的特性。它们被设计用来在函数组件中重用状态逻辑&#xff0c;以及在不引…

Angular-03:组件模板

各种学习后的知识点整理归纳&#xff0c;非原创&#xff01; 组件模板 ① 数据绑定② 属性绑定③ 类名绑定④ 样式绑定⑤ 事件绑定⑥ 获取原生DOM对象6.1 在组件模板中获取6.2 在组件类中获取 ⑦ 双向数据绑定⑧ 内容投影8.1 select选择器8.2 单槽投影8.3 多槽投影 ⑨ 安全操作…

基于 Qt控制开发板 LED和C语言控制LED渐变亮度效果

## 资源简介 在STM32开发板,板载资源上有两个可自由控制的 LED。如下图原理 图其中我们以操作 LED1 为示例,LED1 为出厂系统的心跳指示灯。 ## 应用实例 想要控制这个 LED,首先出厂内核已经默认将这个 LED 注册成了 gpio-leds类型设备。所以我们可以直接在应用层接口直接…

设计模式总结

1.简单工厂模式 该类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化的相关的类,对于客户端来说,去除了与具体产品的依赖。 2.策略模式(strategy) 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。 特点…

Java构件技术

Java构件技术 构件及其在信息系统项目中的重要性 构件/组件: Component, 是一个功能相对独立的具有可复用的软件单元。 构件&#xff0c;是软件系统可替换的、物理的组成部分&#xff0c; 他封装了实现体(实现某个功能)&#xff0c;并提供了一组接口的实现方法。 Java构件技术…

基础课12——数据采集

数据采集是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析处理。数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。采集一般是采样方式,即隔一定时间(称采样周期)对同…