SpringCache
Spring Cache
Spring3.1开始支持透明的将Cache添加到Spring 应用,其机制与Spring事务类似,靠AOP机制支持
Spring4.1开始支持JSR-107缓存规范
Buffer与Cache
buffer与cache很相似,甚至有时候可以相互替换,但是他们指代的是不同的事物。
buffer一般认为是存在于一个快速设备与慢速设备之间的临时的(即时的)存储空间。在这种情境下,快速设备往往需要等待慢速设备(两者之间速度不匹配)。buffer就是用于解决这一问题的,通过将产生的数据存储至buffer,另一设备每次读取一个缓冲区大小,而不是每次读很小一块数据,以此提高效率。一般情况下,buffer中的数据一般只允许读或者写一次,读写的双方一般也都知道buffer的存在。
cache是一种将数据放置到离自己最近的地方或者(读取速度快的地方)来加速数据读取的方法。一般情况下,提供数据的一方不知道缓存的存在, 读取数据的一方也可能不知道cache的存在。也就是说cache对于数据提供者和使用者都是透明的。
我们一般使用cache缓存那些非常消耗CPU计算或者需要大量IO才能得到的结果。
Cache Abstraction
Spring Cache是一个Cache 抽象,使用它不用自己写缓存存取相关的逻辑代码,但需要为其提供缓存存储实现。其主要的两个抽象是:org.springframework.cache.Cache 接口和 org.springframework.cache.CacheManager


目前Spring提供了对Ehcache、redis、caffeine、ConcurrentMapCache的支持,如果需要其他缓存,需要自己去实现这两个接口。此外,**Spring Cache**并没有对多线程及多核编程做特殊处理,这些处理交由具体的缓存实现来处理。
使用Spring Cache你需要:
缓存声明:将一个方法标记为需要缓存的,Spring会将该方法的返回结果按照指定方式缓存
缓存配置:配置缓存数据存储方式及存储位置
基于注解的缓存声明
@Cacheable: 触发缓存填充.@CacheEvict: 触发缓存失效.@CachePut: 更新缓存.@Caching: 组合多个缓存注解,以达到在一个方法上使用多个缓存注解的效果.@CacheConfig: 将缓存的通用配置集中在一处,进行共享.
@Cacheable
@Cacheable表明方法的返回结果是可以缓存的。一旦调用方法并返回结果,则返回结果将会被缓存。接下来再次调用该方法(参数与上次调用一致)则将会检索缓存,缓存中存在的话会直接返回缓存的结果,不再真的执行方法逻辑。
@Cacheable("books")
public Book findBook(ISBN isbn) {...}
上述代码片段将findBook方法的返回结果放置到名字为books的缓存中。findBook方法每次调用前都会先检查books缓存中是否有结果,如果有直接返回,如果没有则执行findBook,将查询到到的结果放置到缓存才返回。值得一提的是,@Cacheable注解可以指定多个缓存名称:
@Cacheable({"books", "isbns"})
public Book findBook(ISBN isbn) {...}
在调用方法findBook时,将依次检查books缓存和isbns缓存,如果任意一个缓存中有缓存结果的话,都不会执行findBook方法中的逻辑,将会直接将结果返回。此外,一旦有一个缓存命中,所有缓存都会被刷新。也就是说如果缓存在isbns命中,缓存结果也将会被填充到books中,即使findBook中的逻辑没有被执行,也一样会填充到所有缓存中去。
浙公网安备 33010602011771号