当前位置: 首页 > 后端技术 > Java

SpringCache缓存框架

时间:2023-04-01 15:23:31 Java

1.前言SpringCache是??Spring体系下的一个标准化的缓存框架。SpringCache有以下优点:缓存的种类很多,缓存的种类也很多。Redis、EhCache、Caffeine等常见的缓存都支持。它们可以单独使用,也可以组合使用。Spring支持的缓存平滑迁移,无需修改业务逻辑即可实现无缝平滑迁移。注解缓存的实现依赖于动态代理。大多数情况下使用注解版,少数情况下也可以使用编程版。注解版与业务代码高度解耦,因为依赖动态代理技术,对使用场景有一定的限制。编程版嵌入业务代码,代码顺序执行,使用无前置条件。2.基本概念(1)核心概念一个应用程序可以有多个缓存管理器,每个缓存管理器可以有多个缓存,每个缓存可以存储多条记录。1、缓存管理器缓存不同的存储介质,连接不同数据库的缓存,缓存值序列化等由缓存管理器配置。缓存管理器有一级和二级,默认使用一级(primary)缓存管理器。当服务中只有一个CacheManager时,默认使用这个缓存管理器;当有多个缓存管理器时,需要使用Primary注解来指定默认的缓存管理器。2.缓存缓存是一组配置相同的缓存,可以理解为一个命名空间。SpringCache体系下的缓存生命周期是基于Cache的,不支持以Key为单位设置生命周期。不同的服务对应不同的缓存配置,需要在缓存处进行区分。CacheName应具有显着的业务区分和过期时间区分,并作为全局常量提供,集中管理。禁止使用魔术变量指定CacheName。(2)补充内容一般来说,缓存的Key和Value都是String类型,特别是Value通常会序列化成JSON字符串。3.注解版本用于基于注解管理缓存数据。注解缓存有以下优点:高度解耦使用注解实现缓存,与业务高度解耦。灵活管理通过全局配置,不修改缓存逻辑,可以达到如下效果:在开发环境中,可以禁用缓存,将流量发送到数据库,尽快暴露可能存在的性能瓶颈;在测试环境下,可以启用缓存进行压力测试等。(1)动态代理SpringCache缓存注解版本原理及缓存配置失败典型案例。1、CGLib动态代理缓存实现的底层技术支持是CGLib动态代理,在目标方法调用前后添加相应的缓存操作,实现添加缓存、更新缓存、删除缓存的操作。如果注解缓存配置没有生效,检查目标调用方法是否被动态代理。2.配置失效配置失效是指虽然配置了缓存注解,但是缓存仍然没有生效。final类和final方法final类和final方法不满足CGLib动态代理的条件,所以缓存配置会失效。内部调用使用依赖注入调用配置缓存的方法生效,方法之间的内部调用不生效。非公开方法非公开方法配置缓存不生效。(二)常用注解1.配置注解(1)EnableCaching是在SpringBoot应用启动类上标注的。添加这个注解意味着开启SpringCache缓存;删除它意味着禁用缓存。如果在全局配置文件中加入如下配置,即使在启动类上打上了EnableCaching注解,SpringCache缓存也会随之关闭。spring:cache:type:none如果在应用中自定义了一个独立于Spring容器的缓存,则不会受到该配置的影响。(2)CacheConfig标注在类上,更具体地说,标注在业务服务类上。以下参数信息统一配置:参数含义用法说明cacheManager缓存管理器默认为主CacheManagercacheNames缓存名keyGenerator键值生成器在类上统一配置,类下的方法自动继承对应配置。2、缓存注解(1)Cacheable在两种情况下添加缓存核心注解:一种是对应的key值没有缓存数据,先执行该方法,然后根据条件和unless条件决定是否添加缓存;另一种是对应的key值已经缓存了,不执行方法体,直接返回数据。参数keyGenerator和key是互斥的。当key存在时,keyGenerator配置会自动失败。基本参数参数含义用法说明cacheManager缓存管理器默认指的是主CacheManagercacheNames缓存名称keyGenerator键值生成器keykey值高级参数参数含义默认值用法说明condition缓存条件表示满足条件时执行缓存操作,参数一般用作条件,除非负Cache条件为真时,方法的返回值不会被缓存。同步状态false表示方法执行结果在缓存中的存储方式。(2)CachePut更新缓存注解。不管对应键值是否有缓存数据都执行。基本参数参数含义用法说明cacheManager缓存管理器默认指的是主CacheManagercacheNames缓存名称keyGenerator键值生成器keykey值高级参数参数含义用法说明condition缓存条件表示当条件满足时执行缓存操作,参数为一般用作条件,除非缓存被拒绝如果条件为真,方法的返回值将不会被缓存(3)CacheEvict主动清除缓存注解。基本参数参数含义用法说明cacheManager缓存管理器默认指的是主CacheManagercacheNames缓存名称keyGenerator键值生成器keykey值高级参数参数含义默认值用法说明condition缓存条件表示满足条件的一方执行缓存操作,一般情况下以参数为条件allEntriesallCachefalse表示是否清除当前CacheName对应的所有缓存。beforeInvocationcallfalse表示方法调用前是否清除缓存。3、KeyGenerator默认使用SimpleKeyGenerator键值生成器。当不指定键值时,根据生成器规则,该方法会将参数转换为缓存键值。如果你喜欢这篇文章,请点击??喜欢??支持它。有需要的可以微信dream4s联系我。相关源码在GitHub,视频讲解在B站,本文收集于博客世界。