Spring- Cache缓存
admin
2023-08-01 03:40:06
0次


在操作缓存中,一般会有以下几种操作,在Spring的缓存中会对应有几种注解:


* 获取数据:从缓存获得需要数据,如果缓存没有则从数据库查询,再将其保存在缓存;

* 插入数据:先将数据插入数据库中,再保存到缓存中;

* 更新数据:先将数据更新到数据库中,再更新相应缓存数据;

* 删除数据:先从数据库中删除数据,再删除缓存中数据;


spring cache常用注解为:@Cacheable、@CachePut、@CacheEvit

@Cacheable 的作用:适用于获取数据,如果缓存中有数据,不在调用注解方法;

@CachePut 的作用:适合于插入数据和更新数据。一定会调用真实方法,再将方法返回值保存到缓存;

@CachEvict 的作用:适合于删除数据。


主要的参数

value缓存的名称,可以在 spring 配置文件中定义,必须指定至少一个例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)


一、xml配置文件

//cacheManager为具体的缓存管理器例如RedisCacheManager

<cache:annotation-driven cache-mamage="cacheManager" />


二、项目中操作

@CacheConfig(cacheNames="prizeinfo")

@Service(value="springRedisService")

public class SpringRedisServiceImpl implements SpringRedisService{

     @Autowired

     private PrizeinfoService prizeinfoService;

    

     @Cacheable(key="'id:'+#id")

     public Prizeinfo getObject(int id) {

          return prizeinfoService.getPrizeinfoById(id);

     }

     @CachePut(key="'id:'+#o.id")

     public Prizeinfo insertObject(Prizeinfo o) {

         prizeinfoService.insertPrizeinfo(o);

          System.out.println("insertObject"+o.getId());

         return o;

     }

     @CacheEvict(key="'id:'+#id")

     public int deleteObjectById(int id) {

          prizeinfoService.deletePrizeinfoById(id);

          return id;

     }

}


三、Spring Cache原理:


 Spring Cache实际是利用Spring Aop原理来实现的。具体的执行流程和源码,下面将讲解


#标签会默认的创建什么对象??

1. 解析自定义缓存标签


1.1 利用springIoc先解析标签器类AnnotationDrivenCacheBeanDefinitionParser 。

//存储自定义标签和解析标签类的关系

CacheNamespaceHandler

//解析自定义的标签的解析器,将xml其生成beandefinition

BeanDefinitionParser

AnnotationDrivenCacheBeanDefinitionParser


1.2  AnnotationDrivenCacheBeanDefinitionParser解析方法parser,解析标签属性,创建对应BeanDefinition。(图解在https://www.processon.com/embed/58afa70be4b0793432a703c9)


//通知器自动代理生成器  名称:org.springframework.cache.config.internalCacheAdvisor

·InfrastructureAdvisorAutoProxyCreator

//缓存的基本操作

·AnnotationCacheOperationSource

//拦截器类  设置属性:cacheOperationSources

·CacheInterceptor

//通知器

//设置通知属性:adviceBeanName:CacheInterceptor  

//设置cacheOperationSource属性:AnnotationCacheOperationSource

·BeanFactoryCacheOperationSourceAdvisor



#注解的类是何时,通过什么方式和缓存关联的??

2. 注解缓存类SpringRedisServiceImpl 实例化对象


2.1 使用自动代理创建器的时机:


2.2 自动代理创建器的创建过程:


2.3 调用注解类:


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...