缓存的好处不言而喻,比如查询商品的价格,如果可以放到缓存中,而不用每次都到数据库中查询,这将会大大提升系统性能,因为和缓存交互比访问数据库要快很多。或者在缓存中存放临时数据,而不用放到数据库中。

在学习Spring Boot中的数据的时候,我们需要先来了解一下几个非常重要的概念:

  1. Cache: 缓存接口,定义缓存操作,具体实现这些操作的有:RedisCache、EhCacheCache、ConcurrentMapCache等。
  2. CacheManager:缓存管理器,管理各种缓存(Cache)组件
  3. @Cacheable:主要针对方法配置,能够根据方法的请求参数对方法返回的结果进行缓存。
  4. @CacheEvict:清除缓存,比如一个用户退出了,我们需要清除这个用户的所有临时数据缓存。
  5. @CachePut:保证方法被调用,又希望结果被缓存,主要可以用来更新缓存。
  6. @EnableCaching:开启基于注解的缓存
  7. keyGenerator:缓存数据时key的生成策略
  8. serialize:缓存数据时value序列化策略

以数据库查询缓存为例,缓存结构如下:

如果要使用缓存的话,这里就不给出具体的例子了,在上面重要的概念的讲解中,我们已经讲解了几个注解的作用,在编程过程中使用这些注解即可。关于这些注解具体的使用规则,可以参考:https://blog.csdn.net/xm393392625/article/details/88639082

我们来看看Spring Boot底层是如何实现缓存配置的,依照之前的经验我们可以想象存在一个CacheAutoConfiguration,这个类将会完成我们的缓存配置,实际上这个类也存在,这个配置类导入了CacheConfigurationImportSelector这个类,他将会选择出下面这些缓存配置类,默认SimpleCacheConfiguration生效:

org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
org.springframework.boot.autoconfigure.cache.GuavaCacheConfiguration
org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration【默认】
org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration

SimpleCacheConfiguration配置类将给容器中注册一个CacheManager:ConcurrentMapCacheManager,它可以获取和创建ConcurrentMapCache类型的缓存组件,它的作用是将数据保存在ConcurrentMap中;

以@Cacheable注解为例讲解获取缓存的流程:

  • 方法运行之前,先去CacheManager中按照cacheNames指定的名字得到Cache(缓存组件),如果没有Cache组件则会自动创建。结合之前的图,Emp就是一个Cache组件。
  • 之后在找到的Cache组件中查找缓存的内容,使用一个key,默认就是使用方法的参数生成这个key,比如在Emp这个Cache组件中查找具体的Value。
  • 没有查到缓存就调用目标方法;
  • 之后将目标方法返回的结果,放进缓存中;

以上就是Spring Boot中的缓存原理,最后来说说使用其他的CacheManager,比如常用的radis。

这里我使用的环境是 ubuntu + docker + redis来启动,在docker pull redis已经完成的情况下,运行下列内容:

然后在项目中的pow.xml文件中引入redis:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐redis</artifactId>
</dependency><!--或者--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.7.RELEASE</version>
</dependency>

在RedisAutoConfiguration.java中Spring Boot已经帮我们做好的配置,如下:

/*** {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Redis support.** @author Dave Syer* @author Andy Wilkinson* @author Christian Dupuis* @author Christoph Strobl* @author Phillip Webb* @author Eddú Meléndez* @author Stephane Nicoll* @author Marco Aust* @author Mark Paluch* @since 1.0.0*/
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);return template;}@Bean@ConditionalOnMissingBeanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}}

可以看到它帮我们在容器中注册了StringRedisTemplate (K-V都是字符串)和RedisTemplate(K-V都是Object)两个组件,他们就和JdbcTemplate一样,帮助我们操作redis,不过我们可以直接使用缓存注解,在底层会自动调用这些方法,RedisTemplate 保存对象时是保存序列化后的数据,所以务必确认保存的对象可以序列化。不过大多数的时候,我们只是保存一个String和一个JSON串,所有StringRedisTemplate用的可能更多一点。如果要使用StringRedisTemplate 和RedisTemplate的话直接注入即可。不过在使用之前,需要在配置文件中写好redis主机地址:

spring.redis.host=192.168.31.246

引入redis的依赖之后,容器中保存的是RedisCacheConfiguration为我们添加的RedisCacheManager,而不使用之前所说的SimpleCacheConfiguration为我们添加的CacheManager。这是因为在SimpleCacheConfiguration类之上有一个@ConditionalOnMissingBean(CacheManager.class)这样的注解。默认创建的 RedisCacheManager 操作redis的时候使用的是 RedisTemplate<Object, Object>,RedisTemplate<Object, Object> 是默认使用jdk的序列化机制。如果你想保存JSON数据的话,请自行查找其他参考内容。

Spring Boot使用缓存功能相关推荐

  1. Spring Boot Redis缓存

    Spring Boot Redis缓存 目录[ 隐藏 ] 1 Spring Boot Redis缓存 1.1 Spring Boot Redis项目设置 1.2 Spring Boot Redis缓存 ...

  2. Spring Boot基础学习笔记17:Spring Boot默认缓存

    文章目录 零.学习目标 一.缓存概述 (一)引入缓存管理的重要性 (二)Spring Boot的缓存管理 二.Spring Boot默认缓存 (一)数据准备 (二)创建Spring Boot项目 - ...

  3. Spring Boot实现验证码功能

    ✨Spring Boot实现验证码功能 验证码的作用 案例要求 前端页面准备 随机验证码工具类 后端控制器 测试

  4. Spring Boot————默认缓存应用及原理

    引言 应用程序的数据除了可以放在配置文件中.数据库中以外,还会有相当一部分存储在计算机的内存中,这部分数据访问速度要快于数据库的访问,因此通常在做提升数据访问速度时,会将需要提升访问速度的数据放入到内 ...

  5. 邮件发送类_10 分钟实现 Spring Boot 发生邮件功能

    基础知识 什么是SMTP? 什么是IMAP? 什么是POP3? IMAP和POP3协议有什么不同呢? 进阶知识 什么是JavaMailSender和JavaMailSenderImpl? 如何通过Ja ...

  6. java缓存管理器_使用@EnableCaching的Spring Boot默认缓存管理器

    我在SpringBootApplication中实现了缓存,如下所示 @SpringBootApplication @EnableCaching public class SampleApplicat ...

  7. 具有Spring Boot和数据功能的Java头优先弹性搜索

    在本文中,我将为您提供有关如何在Java项目中使用Elastic Search的简单介绍. 由于Spring Boot是开始我们项目的最简单,最快的方法,因此我选择使用它. 此外,我们将大量使用心爱的 ...

  8. Spring Boot学习笔记:Spring Boot的Web功能

    文章目录 一.Spring Boot的Web支持 二.Thymeleaf模板引擎 (一)Thymeleaf基础知识 1.引入Thymeleaf 2.访问Model数据 3.Model中的数据迭代 4. ...

  9. 10 分钟实现 Spring Boot 发生邮件功能

    来源:yizhiwazi jianshu.com/p/5eb000544dd7 基础知识 什么是SMTP? 什么是IMAP? 什么是POP3? IMAP和POP3协议有什么不同呢? 进阶知识 什么是J ...

最新文章

  1. 【数据结构与算法】之深入解析“两两交换链表中的节点”的求解思路与算法示例
  2. 大批工厂提前20天放假,而大家却都在玩金融
  3. 2007年上半年软件测试_洪恩教育成功登陆纽交所,上市首日大涨超33%!成2020年首家美股上市的中国教育公司...
  4. java map大小_Java中HashMap的size()方法: HashMap.size() - Break易站
  5. 让我去健身的不是漂亮小姐姐,居然是贝叶斯统计
  6. linux mysql异机备份_Linux环境下oracle数据库Rman备份异机恢复
  7. spring官方文档列表
  8. 【Caffe安装】Caffe安装(无GPU)--wanglei
  9. 图神经网络-图与图学习笔记-中
  10. 河南自考本科英语可用计算机代替,河南自考选考2至3门专业课可代替英语课程...
  11. java正则表达式中的斜杠,java正则表达式匹配斜杠[Java编程]
  12. NB5.5源代码分析之服务端生成
  13. 谈谈MATLAB大数据处理
  14. ubuntu-浏览caj文件
  15. matlab定积分矩形法实验报告,矩形法求定积分
  16. 累计独立访客(UV)不低于 1000 是什么意思,快速开通流量主
  17. 应用程序操作word文件报“RPC服务器不可用,HRESULT:0x800706BA”
  18. 蓝桥杯训练1:质数判断,同余问题
  19. 安防网络摄像头互联网直播录像设置永久储存却只能播放一半问题解决
  20. 微信直播聊天室单房间1500万在线的消息架构演进之路

热门文章

  1. 在asp.net mvc中使用PartialView返回部分HTML段
  2. “挨踢民工”的奇葩生活录
  3. Ado.Net实现简易(省、市、县)三级联动查询,还附加Access数据
  4. SQL Server 2012中的ColumnStore Index尝试
  5. Oracle 11g Release 1 (11.1) 游标——显式游标
  6. Linux内核的各个组成部分,Linux 内核的组成部分
  7. 小猿圈html5教程之canvas绘制线段方法
  8. 一出好戏不止是部电影,它也正接近你的生活。
  9. NA-NP-IE系列实验13:使用子网地址
  10. 【java设计模式】之 代理(Proxy)模式