springboot集成spring cache缓存示例代码

发布时间 - 2026-01-11 00:56:23    点击率:

本文介绍如何在springboot中使用默认的spring cache,

声明式缓存

Spring 定义 CacheManager 和 Cache 接口用来统一不同的缓存技术。例如 JCache、 EhCache、 Hazelcast、 Guava、 Redis 等。在使用 Spring 集成 Cache 的时候,我们需要注册实现的 CacheManager 的 Bean。

Spring Boot 为我们自动配置了 JcacheCacheConfiguration、 EhCacheCacheConfiguration、HazelcastCacheConfiguration、GuavaCacheConfiguration、RedisCacheConfiguration、SimpleCacheConfiguration 等。

默认使用 ConcurrenMapCacheManager

在我们不使用其他第三方缓存依赖的时候,springboot自动采用ConcurrenMapCacheManager作为缓存管理器。

环境依赖

在pom文件引入spring-boot-starter-cache环境依赖:

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

创建一个book数据访问层

先创建一个实体类

public class Book {

private String isbn;
private String title;

public Book(String isbn, String title) {
 this.isbn = isbn;
 this.title = title;
}
….getter 
….setter

} 

创建一个数据访问接口

public interface BookRepository {

 Book getByIsbn(String isbn);

}

这个你可以写一个很复杂的数据查询操作,比如操作MySQL、nosql等等。为了演示这个栗子,我只做了一下线程的延迟操作,当作是查询数据库的时间。

实现接口类:

@Component
public class SimpleBookRepository implements BookRepository {

 @Override

 public Book getByIsbn(String isbn) {
  simulateSlowService();
  return new Book(isbn, "Some book");
 }

 // Don't do this at home
 private void simulateSlowService() {
  try {
   long time = 3000L;
   Thread.sleep(time);
  } catch (InterruptedException e) {
   throw new IllegalStateException(e);
  }
 }

}

测试类

@Component
public class AppRunner implements CommandLineRunner {

 private static final Logger logger = LoggerFactory.getLogger(AppRunner.class);

 private final BookRepository bookRepository;

 public AppRunner(BookRepository bookRepository) {
  this.bookRepository = bookRepository;
 }

 @Override
 public void run(String... args) throws Exception {
  logger.info(".... Fetching books");
  logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
  logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
  logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
  logger.info("isbn-4567 -->" + bookRepository.getByIsbn("isbn-4567"));
  logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
  logger.info("isbn-1234 -->" + bookRepository.getByIsbn("isbn-1234"));
 }

}

启动程序,你会发现程序在控制台依次打印了:

2014-06-05 12:15:35.783 … : …. Fetching books

2014-06-05 12:15:40.783 … : isbn-1234 –> >Book{isbn='isbn-1234', title='Some book'}

2014-06-05 12:15:43.784 … : isbn-1234 –>Book{isbn='isbn-1234', title='Some book'}

2014-06-05 12:15:46.786 … : isbn-1234 –>Book{isbn='isbn-1234', title='Some book'}

你会发现程序依次3s打印一行日志。这时还没开启缓存技术。

开启缓存技术

在程序的入口中加入@ EnableCaching开启缓存技术:

@SpringBootApplication
@EnableCaching
public class DemoApplication {

 public static void main(String[] args) {
  SpringApplication.run(DemoApplication.class, args);
 }
}

在需要缓存的地方加入@Cacheable注解,比如在getByIsbn()方法上加入@Cacheable(“books”),这个方法就开启了缓存策略,当缓存有这个数据的时候,会直接返回数据,不会等待去查询数据库。

@Component
public class SimpleBookRepository implements BookRepository {

 @Override
 @Cacheable("books")
 public Book getByIsbn(String isbn) {
  simulateSlowService();
  return new Book(isbn, "Some book");
 }

 // Don't do this at home
 private void simulateSlowService() {
  try {
   long time = 3000L;
   Thread.sleep(time);
  } catch (InterruptedException e) {
   throw new IllegalStateException(e);
  }
 }

}

这时再启动程序,你会发现程序打印:

isbn-1234 –>Book{isbn='isbn-1234', title='Some book'} 
2017-04-23 18:17:09.479 INFO 8054 — [ main] forezp.AppRunner : isbn-4567 –>Book{isbn='isbn-4567', title='Some book'} 
2017-04-23 18:17:09.480 INFO 8054 — [ main] forezp.AppRunner : isbn-1234 –>Book{isbn='isbn-1234', title='Some book'} 
2017-04-23 18:17:09.480 INFO 8054 — [ main] forezp.AppRunner : isbn-4567 –>Book{isbn='isbn-4567', title='Some book'} 
2017-04-23 18:17:09.481 INFO 8054 — [ main] forezp.AppRunner : isbn-1234 –>Book{isbn='isbn-1234', title='Some book'} 
2017-04-23 18:17:09.481 INFO 8054 — [ main] forezp.AppRunner : isbn-1234 –>Book{isbn='isbn-1234', title='Some book'}

只有打印前面2个数据,程序等了3s,之后的数据瞬间打印在控制台上了,这说明缓存起了作用。

源码下载:https://github.com/forezp/SpringBootLearning

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # boot  # cache  # springboot  # 使用cache  # 缓存  # SpringBoot集成本地缓存性能之王Caffeine示例详解  # springboot集成本地缓存Caffeine的三种使用方式(小结)  # SpringBoot集成cache缓存的实现  # SpringBoot集成Caffeine缓存的实现步骤  # 浅谈SpringBoot集成Redis实现缓存处理(Spring AOP实现)  # 详解SpringBoot集成Redis来实现缓存技术方案  # SpringBoot集成缓存功能详解  # 你会发现  # 创建一个  # 还没  # 你可以  # 上了  # 管理器  # 等了  # 第三方  # 如在  # 只做  # 大家多多  # 很复杂  # 源码下载  # 口中  # 数据查询  # 瞬间  # 如何在  # 开启了  # 实体类  # github 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何确保FTP站点访问权限与数据传输安全?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Android滚轮选择时间控件使用详解  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何实现建站之星域名转发设置?  详解CentOS6.5 安装 MySQL5.1.71的方法  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Python图片处理进阶教程_Pillow滤镜与图像增强  企业网站制作这些问题要关注  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  如何快速辨别茅台真假?关键步骤解析  怎么用AI帮你为初创公司进行市场定位分析?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  如何快速完成中国万网建站详细流程?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  潮流网站制作头像软件下载,适合母子的网名有哪些?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Firefox Developer Edition开发者版本入口  如何在建站之星网店版论坛获取技术支持?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何实现事件和监听器?(Event & Listener实战)  如何挑选高效建站主机与优质域名?  JavaScript如何实现错误处理_try...catch如何捕获异常?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何在万网利用已有域名快速建站?  如何基于云服务器快速搭建个人网站?  javascript基于原型链的继承及call和apply函数用法分析  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何快速建站并高效导出源代码?  利用vue写todolist单页应用  Laravel观察者模式如何使用_Laravel Model Observer配置  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何获取免费开源的自助建站系统源码?  如何在Windows环境下新建FTP站点并设置权限?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结