SpringBoot集成本地缓存性能之Caffeine实例分析


本篇内容介绍了“SpringBoot集成本地缓存性能之Caffeine实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用缓存的目的就是提高性能,今天码哥带大家实践运用spring-boot-starter-cache抽象的缓存组件去集成本地缓存性能之王Caffeine。大家需要注意的是:in-memeory缓存只适合在单体应用,不适合与分布式环境。分布式环境的情况下需要将缓存修改同步到每个节点,需要一个同步机制保证每个节点缓存数据最终一致。不使用 Spring Cache 抽象的缓存接口,我们需要根据不同的缓存框架去实现缓存,需要在对应的代码里面去对应缓存加载、删除、更新等。比如查询我们使用旁路缓存策略:先从缓存中查询数据,如果查不到则从数据库查询并写到缓存中。伪代码如下:我们需要写大量的这种繁琐代码,Spring Cache 则对缓存进行了抽象,提供了如下几个注解实现了缓存管理:@Cacheable:触发缓存读取操作,用于查询方法上,如果缓存中找到则直接取出缓存并返回,否则执行目标方法并将结果缓存。@CachePut:触发缓存更新的方法上,与Cacheable相比,该注解的方法始终都会被执行,并且使用方法返回的结果去更新缓存,适用于 insert 和 update 行为的方法上。@CacheEvict:触发缓存失效,删除缓存项或者清空缓存,适用于 delete 方法上。除此之外,抽象的CacheManager既能集成基于本地内存的单体应用,也能集成EhCache、Redis等缓存服务器。最方便的是通过一些简单配置和注解就能接入不同的缓存框架,无需修改任何代码。码哥带大家使用注解方式完成缓存操作的方式来集成,完整的代码请访问github:在pom.xml文件添加如下依赖:使用JavaConfig方式配置CacheManager:准备工作搞定,接下来就是如何使用了。使用 CacheName 隔离不同业务场景的缓存,每个 Cache 内部持有一个 map 结构存储数据,key 可用使用 Spring 的 Spel 表达式。单元测试走起:大家发现没,只需要在对应的方法上加上注解,免费云主机域名就能愉快的使用缓存了。需要注意的是, 设置的 cacheNames 一定要对应,每个业务场景使用对应的 cacheNames。另外 key 可以使用 spel 表达式,大家重点可以关注@CachePut(cacheNames = {CACHE_NAME}, key = “#result.customerId”),result 表示接口返回结果,Spring 提供了几个元数据直接使用。Java Caching定义了5个核心接口,分别是CachingProvider,CacheManager,Cache,Entry和Expiry。核心类图:Cache:抽象了缓存的操作,比如,get()、put();CacheManager:管理 Cache,可以理解成 Cache 的集合管理,之所以有多个 Cache,是因为可以根据不同场景使用不同的缓存失效时间和数量限制。CacheInterceptor、CacheAspectSupport、AbstractCacheInvoker:CacheInterceptor 是一个AOP 方法拦截器,在方法前后做额外的逻辑,比如查询操作,先查缓存,找不到数据再执行方法,并把方法的结果写入缓存等,它继承了CacheAspectSupport(缓存操作的主体逻辑)、AbstractCacheInvoker(封装了对 Cache 的读写)。CacheOperation、AnnotationCacheOperationSource、SpringCacheAnnotationParser:CacheOperation定义了缓存操作的缓存名字、缓存key、缓存条件condition、CacheManager等,AnnotationCacheOperationSource 是一个获取缓存注解对应 CacheOperation 的类,而SpringCacheAnnotationParser 是解析注解的类,解析后会封装成 CacheOperation 集合供AnnotationCacheOperationSource 查找。CacheAspectSupport:缓存切面支持类,是CacheInterceptor 的父类,封装了所有的缓存操作的主体逻辑。主要流程如下:通过CacheOperationSource,获取所有的CacheOperation列表如果有@CacheEvict注解、并且标记为在调用前执行,则做删除/清空缓存的操作如果有@Cacheable注解,查询缓存如果缓存未命中(查询结果为null),则新增到cachePutRequests,后续执行原始方法后会写入缓存缓存命中时,使用缓存值作为结果;缓存未命中、或有@CachePut注解时,需要调用原始方法,使用原始方法的返回值作为结果如果有@CachePut注解,则新增到cachePutRequests如果缓存未命中,则把查询结果值写入缓存;如果有@CachePut注解,也把方法执行结果写入缓存如果有@CacheEvict注解、并且标记为在调用后执行,则做删除/清空缓存的操作“SpringBoot集成本地缓存性能之Caffeine实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: Vue2和Vue3在响应式上有哪些区别

这篇文章主要介绍“Vue2和Vue3在响应式上有哪些区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue2和Vue3在响应式上有哪些区别”文章能帮助大家解决问题。这种图片很清晰的描述出响应式原理:每个组件都会生成一…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/22 17:32
Next 03/22 17:32

相关推荐