SpringCache简单梳理

参考博客:http://www.javashuo.com/article/p-zcdnyves-ke.htmlhtml

http://www.javashuo.com/article/p-rhcvdrzf-bt.htmlspring

http://www.javashuo.com/article/p-bbyqnpwv-cr.html数据库

https://blog.csdn.net/s297485987/article/details/80781380缓存

 http://www.javashuo.com/article/p-arqzrsny-db.html数据结构

 一.Cache是什么,为何要用缓存less

    一个项目随着时间的积累, 数据规模会愈来愈大, 对数据的访问需求也愈来愈高, 数据库的查询等操做的使用量也会愈来愈大.可是数据库的性能是有上限的.所以如何提升数据查询的性能, 分担数据库的访问压力也成为了一个重要的功能.ide

    而缓存就是实际工做中常常会被使用的一种分担数据库访问压力,提升数据查询性能的方法.性能

    从3.1开始Spring引入了对Cache的支持。其使用方法和原理都相似于Spring对事务管理的支持。Spring Cache是做用在方法上的,其核心思想是:当咱们在调用一个缓存方法时会把该方法参数和返回结果做为一个键值存放在缓存中,等到下次利用一样的参数调用该方法时将再也不执行该方法,而是直接从缓存中获取结果进行返回。lua

    Spring Cache, 本质上不是一个具体的缓存实现方案, 而是一个对缓存使用的抽象, 只要经过必定的配置和既有的代码,注解,就能够利用各类缓存方案 如EHCache,Redis等, 来暂时存储数据.spa

 

二.怎么使用Cache

     使用Spring Cache只须要咱们作两件事

      (1)声明某些方法使用缓存

      (2)配置Spring对Cache的支持

      Spring为咱们提供了几种注解来支持SpringCache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。

 

三.理解Cache缓存的内容和思路

Java Caching的五个核心接口:

  1. CachingProvider 定义了建立,配置,获取,管理和控制多个CacheManager. 一个应用能够在运行时访问多个CachingProvider
  2. CacheManager  定义了建立,配置,获取,管理和控制多个惟一命名的Cache, 这些Cache存在于CacheManager的上下文中. 一个CacheManager只能被一个CachingProvider所拥有.
  3. Cache  是一个相似Map的数据结构并临时存储以key为索引的值. 一个Cache仅被一个CacheManager所拥有.
  4. Entry   是一个存储在Cache中的key-value对
  5. Expiry 每个存储在Cache中的条目有一个定义的有效期.一旦超过这个有效期,条目为过时的状态,条目将不可访问 ,更新和删除. 缓存有效期能够经过ExpiryPolicy设置.

 

如下来自:http://www.javashuo.com/article/p-zcdnyves-ke.html

 

       Spring中定义了org.springframework.cache.Cache接口和org.springframework.cache.CacheManager接口来统一不一样的缓存技术, 并支持JCache(JSR-107)注解简化咱们开发.

  • Cache接口为缓存的组件规范定义, 包含缓存的各类操做集合
  • Cache接口下Spring提供了各类xxxCache的实现,如RedisCache,EhCacheCache等.
  • 每次调用须要缓存功能的方法时,Spring会检查指定参数的指定目标方法是否已经被调用过,若是有被调用, 则从缓存中获取方法调用后的结果,  若是没有就调用方法, 并把结果缓存后返回给用户. 下次调用时直接从缓冲中获取结果(若是未过时的话)
  • 使用Spring缓存抽象时要关注的两点:

             1.肯定方法须要被缓存以及他们的缓存策略

             2.从缓存中读取以前缓存存储的数据

 

下面是重要的概念和缓存注解

Cache 缓存接口, 定义缓存操做. 具体实现:RedisCache,EhCacheCache, ConcurentMapCache等
CacheManager 缓存管理器,管理各类缓存组件
@Cacheable 主要针对方法配置, 可以根据方法的请求参数对结果进行缓存
@CacheEvict 清空缓存
@CachePut 保证方法被调用,又但愿结果被缓存
@EnableCaching 开启基于注解的缓存
keyGenerator 缓存数据时key生成策略
serializer 缓存数据时,key和value的序列化策略

@Cacheable, @CacheEvict 和 @CachePut的主要参数

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=”#userNam e.length()>2”)
allEntries(@CacheEvict) 是否清空全部缓存内容,缺省为 false,若是指定为 true,则方法调用后将当即清空全部缓存 例如:@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation(@CacheEvict) 是否在方法执行前就清空,缺省为 false,若是指定 为 true,则在方法尚未执行的时候就清空缓存, 缺省状况下,若是方法执行抛出异常,则不会清空 缓存 例如:@CachEvict(value=”testcache”, beforeInvocation=true)
unless(@CachePut)(@Cacheable) 用于否决缓存的,不像condition,该表达式只在方 法执行以后判断,此时能够拿到返回值result进行判 断。条件为true不会缓存,fasle才缓存 例如:@Cacheable(value=”testcache”,unless=”#result == null”)

 

Cache SpEL available metadata

名字 位置 描述 实例
methodName root object 当前被调用的方法名  #root.methodName
method root object 当前被调用的方法 #root.method.name
target root object 当前被调用的目标对象 #root.target
targetClass root object 当前被调用的目标对象的类  #root.targetClass
args root object 当前被调用的方法的参数列表 #root.args[0]
caches root object 当前方法调用使用的缓存列表 #root.caches[0].name
argumentname evaluation context 方法参数的名字. 0表明参数的索引。 #a0、#p0
result evaluation context 方法执行后的返回值 #result
相关文章
相关标签/搜索