Spring缓存抽象

Spring缓存抽象

1、定义

Spring定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持JCache注解简化开发。

  • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合
  • Cache接口下的Spring提供的各种xxxcache的实现,如RedisCache,等

每次调用需要缓存功能的方法时,Spring会检查指定参数的指定方法的目标方法是否已经被调用过,如果有就直接从缓存中获取调用后的结果,如果没有就调用方法并缓存结果给放回用户,下次调用直接从缓存获取

2、缓存注解

Spring缓存抽象

  • @Cacheable()能够根据方法的请求参数对其结果进行缓存
    • cacheNames/value:指定缓存的名字,可以设置多个名字 { , , ,}
    • key:缓存数据指定的key,默认是使用参数的值。也可以是方法的返回值,也可以编写SpELl
    • keyGenerator:key的生成器,可以自定义key的生成器(key和keygenerator二选一)
    • cacheManager:缓存管理器,或者是cacheResolver获取解析器
    • condition:制定符合条件的情况下才缓存 “#id>0"
    • unless:否定缓存,在为true的时候,不缓存 unless="#result==null"
    • sync:是否使用异步模式
  • @Cacheable的执行流程(先查询缓存,默认按照参数的值作为key去查询,没有就执行方法体,并将结果放回缓存)
    • 方法(注解下面的那个方法)执行之前,先去查询缓存,按照CacheNames指定的名字获取。如果第一次没有得到缓存,cache自检会自动创建
    • 去cache中查找缓存的内容,使用key,默认是方法的参数。key是按照某种策略生成的,默认是使用keyGenerator生成的,more使用SimpleKeyGenerator生成的Key
    • 没有查到缓存,就执行目标方法
    • 将目标结果返回的结果,放进缓存中
  • @CachePut先执行方法体,再将返回结果缓存起来(这里的key的值要特别注意,不然尽管更新缓存了,但是key值不一样,也不能正确的更新到应该更新的缓存。key的值可以有#result.id。但是@Cacheable就不能使用这个。
  • @CacheEvict删除缓存:
    • 可以指定key删除缓存,
    • 也可以直接指定allEntries=true删除指定缓存名下的全部缓存。
    • beforeInvocation=false缓存的清楚是否在方法执行之后清楚,默认代表是在方法执行之后执行。(如果方法体中出错,那么默认是缓存清除不掉的,如果为true,表示不管如何,都能将缓存清空。
  • @Caching可以多种缓存规则在里面
  • @CacheConfig,放在类上,表示可以将共用的一些设置放在里面,这样就不必再每一个注解中写相同的内容。

3、Redis的缓存机制

使用RedisTemplate(主要是操作普通的key-value)和StringRedisTemplate(主要操作字符串类型的Key-Value—)去操作Redis数据库

开发流程:

  • 向容器中注入RedisTemplate或者StringRedisTemplate
  • 调用相关的方法,就能操纵数据库了