当前位置: 首页 > 知识库问答 >
问题:

使用spring@Caching时,缓存层的顺序是什么?

卢嘉誉
2023-03-14

使用@Caching注释,spring允许向单个方法添加多个@Cacheable注释。由于可以使用@Cacheable进行条件缓存,因此注释和条件的计算顺序是什么?如果多个缓存的计算结果为true,则值是否存储在多个缓存中?同样,在缓存获取期间,是否并行计算所有条件,并从条件计算为true的任何缓存中获取值?

例如:

@Caching( cacheable = { @Cacheable(cacheNames="smallBooks", condition="#name.length < 32"), @Cacheable(cacheNames="fiction", condition="#domain.equals('fiction')"), @Cacheable(cacheNames="everythingelse")})
public Book findBook(String name, String domain)

共有1个答案

孙恩
2023-03-14

不,没有并行计算,@Cacheable注释按照链接代码的定义顺序收集(cacheable属性毕竟是一个数组)。重要的是要意识到您在不同的名称和条件下定义了3个独立的缓存。

因为我不知道您的用例,所以这里对《Spring缓存指南》做了一点修改

//..
@Override
@Caching( cacheable = {
        @Cacheable(cacheNames = "sth"),
        @Cacheable(cacheNames="everythingelse")
})
public Book getByIsbn(String isbn) {
    simulateSlowService();
    return new Book(isbn, "Some book");
}
//..

通过在Spring Boot的应用程序的缓存包中定义调试级别。属性

logging.level.org.springframework.cache=DEBUG

您可以看到它实际上是如何作为单独的缓存加载的:

2016-11-29 00:52:26.472 DEBUG 23426 --- [           main] o.s.c.a.AnnotationCacheOperationSource   : Adding cacheable method 'getByIsbn' with attribute: [Builder[public hello.Book hello.SimpleBookRepository.getByIsbn(java.lang.String)] caches=[sth] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false', Builder[public hello.Book hello.SimpleBookRepository.getByIsbn(java.lang.String)] caches=[everythingelse] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false']
 类似资料:
  • 缓存是存储可重用响应的术语,以便使后续请求更快。 每个浏览器都附带一个HTTP缓存实现。 我们所要做的就是确保每个服务器响应都提供正确的HTTP头指令,以指示浏览器在何时以及浏览器缓存响应的时间和长度。 以下是在您的网络应用程序中包含缓存的一些好处 - 您的网络成本会降低。 如果您的内容已缓存,则您需要为每个后续请求发送较少的内容。 您网站的速度和性能会提高。 即使您的客户离线,您的内容也可用。

  • 缓存某些内容是为了保存昂贵计算的结果,以便下次需要时不执行它。 以下是一个伪代码,解释了缓存的工作原理 - given a URL, try finding that page in the cache if the page is in the cache: return the cached page else: generate the page save the gene

  • 缓存是一种增强系统性能的机制。 它是应用程序和数据库之间的缓冲区内存。 高速缓存存储器存储最近使用的数据项,以便尽可能地减少数据库命中的数量。 缓存对Hibernate也很重要。 它使用多级缓存方案,如下所述 - First-level Cache 第一级缓存是会话缓存,是所有请求必须通过的强制缓存。 Session对象在将对象提交到数据库之前将其保持在自己的权限之下。 如果对对象发出多个更新,H

  • Guava通过一个接口LoadingCache 提供了一个非常强大的基于内存的缓存机制。 值自动加载到缓存中,它提供了许多对缓存需求有用的实用方法。 接口声明 (Interface Declaration) 以下是com.google.common.cache.LoadingCache《K,V》界面的声明 - @Beta @GwtCompatible public interface Loadin

  • Shiro 开发团队明白在许多应用程序中性能是至关重要的。Caching 是从第一天开始第一个建立在 Shiro 中的一流功能,以确保安全操作保持尽可能的快。 然而,Caching 作为一个概念是 Shiro 的基本组成部分,实现一个完整的缓存机制是安全框架核心能力之外的事情。为此,Shiro 的缓存支持基本上是一个抽象的(包装)API,它将“坐”在一个基本的缓存机制产品(例如,Ehcache,O

  • This tells Smarty whether or not to cache the output of the templates. By default this is set to 0, or disabled. If your templates generate redundant redundant content, it is advisable to turn on cach