SpringCache

Spring Cache

Spring3.1开始支持透明的将Cache添加到Spring 应用,其机制与Spring事务类似,靠AOP机制支持

Spring4.1开始支持JSR-107缓存规范

BufferCache

buffercache很相似,甚至有时候可以相互替换,但是他们指代的是不同的事物。

buffer一般认为是存在于一个快速设备与慢速设备之间的临时的(即时的)存储空间。在这种情境下,快速设备往往需要等待慢速设备(两者之间速度不匹配)。buffer就是用于解决这一问题的,通过将产生的数据存储至buffer,另一设备每次读取一个缓冲区大小,而不是每次读很小一块数据,以此提高效率。一般情况下,buffer中的数据一般只允许读或者写一次,读写的双方一般也都知道buffer的存在。

cache是一种将数据放置到离自己最近的地方或者(读取速度快的地方)来加速数据读取的方法。一般情况下,提供数据的一方不知道缓存的存在, 读取数据的一方也可能不知道cache的存在。也就是说cache对于数据提供者和使用者都是透明的。

我们一般使用cache缓存那些非常消耗CPU计算或者需要大量IO才能得到的结果。

Cache Abstraction

Spring Cache是一个Cache 抽象,使用它不用自己写缓存存取相关的逻辑代码,但需要为其提供缓存存储实现。其主要的两个抽象是:org.springframework.cache.Cache 接口和 org.springframework.cache.CacheManager

CacheManager.jpg

cache.png

目前Spring提供了对EhcacherediscaffeineConcurrentMapCache的支持,如果需要其他缓存,需要自己去实现这两个接口。此外,**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中的逻辑没有被执行,也一样会填充到所有缓存中去。

posted @ 2023-01-31 14:54  小张同学哈  阅读(63)  评论(0)    收藏  举报