在Spring Boot中如何使用数据缓存
发布时间 - 2026-01-11 00:39:53 点击率:次在实际开发中,对于要反复读写的数据,最好的处理方式是将之在内存中缓存一份,频繁的数据库访问会造成程序效率低下,同时内存的读写速度本身就要强于硬盘。Spring在这一方面给我们提供了诸多的处理手段,而Spring Boot又将这些处理方式进一步简化,接下来我们就来看看如何在Spring Boot中解决数据缓存问题。

创建Project并添加数据库驱动
Spring Boot的创建方式还是和我们前文提到的创建方式一样,不同的是这里选择添加的依赖不同,这里我们添加Web、Cache和JPA依赖,如下图:
创建成功之后,接下来添加数据库驱动,我还是使用MySQL,在pom.xml中添加数据库驱动,如下:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency>
配置application.properties
这个application.properties的配置还是和初识在Spring Boot中使用JPA一样,各个参数的含义我这里也不再赘述,我们直接来看代码:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/sang?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=sang spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jackson.serialization.indent_output=true
创建实体类
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private String address;
private Integer age;
public Person() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person(Long id, String name, String address, Integer age) {
this.id = id;
this.name = name;
this.address = address;
this.age = age;
}
}
创建实体类的Repository
public interface PersonRepository extends JpaRepository<Person,Long> {}
创建业务类
业务接口
public interface DemoService {
public Person save(Person person);
public void remove(Long id);
public Person findOne(Person person);
}
实现类
@Service
public class DemoServiceImpl implements DemoService {
@Autowired
PersonRepository personRepository;
@CachePut(value = "people", key = "#person.id")
@Override
public Person save(Person person) {
Person p = personRepository.save(person);
System.out.println("为id、key为" + p.getId() + "数据做了缓存");
return p;
}
@CacheEvict(value = "people")
@Override
public void remove(Long id) {
System.out.println("删除了id、key为" + id + "的数据缓存");
personRepository.delete(id);
}
@Cacheable(value = "people", key = "#person.id")
@Override
public Person findOne(Person person) {
Person p = personRepository.findOne(person.getId());
System.out.println("为id、key为" + p.getId() + "数据做了缓存");
return p;
}
}@Service
public class DemoServiceImpl implements DemoService {
@Autowired
PersonRepository personRepository;
@CachePut(value = "people", key = "#person.id")
@Override
public Person save(Person person) {
Person p = personRepository.save(person);
System.out.println("为id、key为" + p.getId() + "数据做了缓存");
return p;
}
@CacheEvict(value = "people")
@Override
public void remove(Long id) {
System.out.println("删除了id、key为" + id + "的数据缓存");
personRepository.delete(id);
}
@Cacheable(value = "people", key = "#person.id")
@Override
public Person findOne(Person person) {
Person p = personRepository.findOne(person.getId());
System.out.println("为id、key为" + p.getId() + "数据做了缓存");
return p;
}
}
关于这个实现类我说如下几点:
1.@CachePut表示缓存新添加的数据或者更新的数据到缓存中,两个参数value表示缓存的名称为people,key表示缓存的key为person的id
2.@CacheEvict表示从缓存people中删除key为id的数据
3.@Cacheable表示添加数据到缓存中,缓存名称为people,缓存key为person的id属性。
创建Controller
@RestController
public class CacheController {
@Autowired
DemoService demoService;
@RequestMapping("/put")
public Person put(Person person) {
return demoService.save(person);
}
@RequestMapping("/able")
public Person cacheable(Person person) {
return demoService.findOne(person);
}
@RequestMapping("/evit")
public String evit(Long id) {
demoService.remove(id);
return "ok";
}
}
OK ,做完这一切我们就可以来测试我们刚刚写的缓存了。
测试
看我们的Controller,我们有三个地址要测试,一个一个来。当然,在 测试之前,我们先来看看初始状态下的数据库是什么样子的:
首先我们在浏览器中访问http://localhost:8080/able?id=1,得到如下访问结果:
这个时候查看控制台,输出内容如下:
说是数据已经被缓存了,这个时候我们再继续在浏览器中刷新继续请求id为1的数据,会发现控制台不会继续打印日志出来,就是因为数据已被存于缓存之中了。
接下来我们向浏览器中输入http://localhost:8080/put?age=47&name=奥巴牛&address=米国,访问结果如下:
这个时候查看控制台打印的日志如下:
再查看数据表,数据已插入成功:
此时,我们在浏览器中输入http://localhost:8080/able?id=106,访问刚刚插入的这条数据,结果如下:
这个时候查看控制台,发现并没有数据数据,就是因为数据已经处于缓存中了。
最后我们在浏览器中输入http://localhost:8080/evit?id=106,将数据从缓存中移除,访问结果如下:
这个时候查看控制台,已经提示缓存移除掉了:
同时数据也从数据库删除掉了,这个时候如果还需要该数据则需要我们继续向表中添加数据。
缓存技术切换
Spring Boot默认情况下使用ConcurrentMapCacheManager作为缓存技术,有的时候你可能想替换为其他的缓存方式,在Spring Boot中进行缓存的切换非常简单,我这里以Google提供的Guava为例,如果要使用这种缓存策略,只需要添加相应的依赖即可,如下:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency>
就这样就可以了。实际上在Spring Boot中,底层使用哪一种缓存我们并不必做过多考虑,切换的方式也很简单,如上文引入相应的依赖即可,我们只需要把上层的逻辑写好即可。
本文案例下载:
本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test25-Cache.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# boot
# 缓存
# 数据缓存
# Spring Boot Web 静态文件缓存处理的方法
# spring boot+spring cache实现两级缓存(redis+caffeine)
# Spring Boot 中使用cache缓存的方法
# SpringBoot项目中使用redis缓存的方法步骤
# 实例详解Spring Boot实战之Redis缓存登录验证码
# Spring Boot缓存实战 EhCache示例
# Spring Boot 基于注解的 Redis 缓存使用详解
# 详解Spring Boot使用redis实现数据缓存
# Spring Boot集成Redis实现缓存机制(从零开始学Spring Boot)
# 在Spring Boot中实现HTTP缓存的方法
# 这个时候
# 器中
# 掉了
# 中了
# 移除
# 的是
# 我说
# 就是因为
# 最好的
# 已被
# 只需
# 我这
# 给我们
# 要把
# 也很
# 这条
# 这一切
# 要我
# 看我
# 就可
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
HTML 中动态设置元素 name 属性的正确语法详解
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Python函数文档自动校验_规范解析【教程】
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何快速登录WAP自助建站平台?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
制作电商网页,电商供应链怎么做?
Python文本处理实践_日志清洗解析【指导】
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel如何实现API速率限制?(Rate Limiting教程)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
如何快速生成高效建站系统源代码?
Android自定义控件实现温度旋转按钮效果
电商网站制作价格怎么算,网上拍卖流程以及规则?
海南网站制作公司有哪些,海口网是哪家的?
Thinkphp 中 distinct 的用法解析
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何使用.env文件管理环境变量?(最佳实践)
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Android滚轮选择时间控件使用详解
微信小程序 配置文件详细介绍
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
如何快速生成凡客建站的专业级图册?
Android实现代码画虚线边框背景效果
Python制作简易注册登录系统
javascript读取文本节点方法小结
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
微信小程序 HTTPS报错整理常见问题及解决方案
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
北京的网站制作公司有哪些,哪个视频网站最好?
详解jQuery中基本的动画方法
Swift开发中switch语句值绑定模式
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
历史网站制作软件,华为如何找回被删除的网站?
Swift中循环语句中的转移语句 break 和 continue
常州企业网站制作公司,全国继续教育网怎么登录?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Android 常见的图片加载框架详细介绍
如何在万网开始建站?分步指南解析
下一篇:laravel的路由如何查看
下一篇:laravel的路由如何查看

