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

Play框架中的咖啡因缓存不返回缓存响应

柴兴修
2023-03-14

我在java Play Framework作业中使用Caffeine cache实现来缓存传出的http请求,我看到,尽管缓存已经启动并运行,但我的服务仍然每次都访问外部服务器,而不是返回缓存中的值。我看到记录在日志中的键总是相同的。

所以我看到FreshnessLifetime没有设置,所以这可能意味着缓存立即过期。但我仍然不知道如何在配置中设置它

我没有更改我的java代码,如果我需要这样做,我找不到任何示例,或者我只应该有一个用于所有传出请求的缓存配置。

在这方面我会很感激你的帮助

libraryDependencies += ws
libraryDependencies += caffeine
# Configuration settings for JSR 107 Cache for Play WS.
play.ws.cache {
  enabled = true
  heuristics.enabled = false
  name = "play-ws-cache"
}
# source https://github.com/ben-manes/caffeine/blob/master/jcache/src/main/resources/reference.conf
caffeine.jcache {
  # A named cache is configured by nesting a new definition under the caffeine.jcache namespace. The
  # per-cache configuration is overlaid on top of the default configuration.
  play-ws-cache {
    read-through {
      # If enabled, the entry is loaded automatically on a cache miss
      enabled = true
    }
    # The eviction policy for automatically removing entries from the cache
    policy {
      # The expiration threshold before lazily evicting an entry. This single threshold is reset on
      # every operation where a duration is specified. As expected by the specification, if an entry
      # expires but is not accessed and no resource constraints force eviction, then the expired
      # entry remains in place.
      lazy-expiration {
        # The duration before a read of an entry is considered expired. If set to 0 then the entry
        # is considered immediately expired. May be a time duration, null to indicate no change, or
        # "eternal" to indicate no expiration.
        access = 5m
      }
      # The expiration thresholds before eagerly evicting an entry. These settings correspond to the
      # expiration supported natively by Caffeine where expired entries are collected during
      # maintenance operations.
      eager-expiration {
        # Specifies that each entry should be automatically removed from the cache once a fixed
        # duration has elapsed after the entry's creation, the most recent replacement of its value,
        # or its last read. Access time is reset by all cache read and write operation. This setting
        # cannot be combined with the variable configuration.
        after-access = 5m
      }
      # The maximum bounding of the cache based upon its logical size
      maximum {
        # The maximum number of entries that can be held by the cache. This setting cannot be
        # combined with the weight configuration.
        size = 10000
      }
    }
  }
}

[debug]-restclient.baserestClient-使用url http://localhost:9001/entities/v2/867386732[trace]-p.a.l.w.ahc.standaloneahCwsclient@65b0b233)执行GET 1/Entities/v2/867386732[debug]-P.A.L.W.A.C.CachingAsynchTtpClient-Execute GET http://localhost:9001/Entities/v2/867386732:results=List(ResponseEntry(CacheableResponse(status=CacheableHttpResponseStatus(code=200,text=OK),headers=defaultHttpHeaders)[referrer-policy:origin-when-cross-origin,,2020年10月1日17:44:08格林威治时间,内容类型:application/json,内容长度:2144],bodyParts size=1),GET,Map(),Some(2020-10-02T10:44:08.760450-07:00[America/los_Angeles]))[trace]-C.T.C.ResponseElectionCalculator-FindMatchingResponse:request(http://localhost:9001/entities/v2/867386732,GET,TreeMap()),responses=List(StoredResponse(http://localhost:9001/entities/v2/867386732,200,TreeMap(date->List(Thu,内容-长度->列表(2144),引用者-策略->列表(起源-当-交叉-起源,严格-起源-当-交叉-起源),x-框架-选项->列表(拒绝),x-xss-保护->列表(1;mode=block),X-Content-Type-Options->List(nosniff),x-apport-cross-domain-policies->List(仅限master-only),GET,Map())[debug]-p.a.l.w.a.c.cachingAsynchttpClient-execute GET http://localhost:9001/entities/v2/867386732:从cache中选择:ResponseEntry(CacheableResponse(status=CacheableHttpResponseStatus(code=200,text=OK),mode=block,x-content-type-options:nosniff,x-apport-cross-domain-policies:master-only,Date:Thu,2020年10月1日17:44:08 GMT,Content-Type:application/json,Content-Length:2144,bodyParts size=1),GET,Map(),Some(2020-10-02t10:44:08.760450-07:00[America/los_Angeles])[trace]-c.t.c.currentage(headers:TreeMap(Date rer-policy->列表(起源-当-交叉-起源,严格-起源-当-交叉-起源),X-Frame-Options->列表(拒绝),x-xss-保护->列表(1;mode=block),x-content-type-options->List(nosniff),x-approved-cross-domain-policies->List(仅限master-only)),现在:2020-10-01t17:44:38.690992z[GMT],requesttime:2020-10-01t17:44:38.690274z[GMT],responsetime:2020-10-01t17:44:38.690981z[GMT])[trace]-c.t.currentageCalculator

    null

[debug]-P.S.A.O.A.Netty.Handler.HttpHandler-

请求DefaultFullHttpRequest(decoderesult:success,版本:http/1.1,内容:EmptyByteBufBE)GET/entities/v2/867386732 http/1.1主机:localhost:9001 accept://user-agent:ahc/2.1

响应DefaultHttpResponse(decoderesult:success,version:http/1.1)http/1.1200 OK referrer-policy:origin-when-cross-origin,strict-origin-when-cross-origin,X-Frame-Options:DENY X-XSS-Protection:1;mode=block x-content-type-options:nosniff x-允许-跨域-policies:master-only date:Thu,2020年10月1日17:44:38 GMT content-type:application/JSON content-length:2144

[debug]-P.S.A.O.A.N.channel.ChannelManager-为通道[ID:0x1FAC35F7,L:/127.0.0.1:49899]添加密钥:http://localhost:9001

    null

共有1个答案

笪煌
2023-03-14

我真的找到了它的工作原理。缓存不应该像Redis或Memcached这样管理单独的服务那样管理生存期,而是像浏览器那样工作,由HTTP响应中的头部管理。这里:https://github.com/playframework/cachecontrol/blob/e4694aa0665e2ccc5030ae1cf1d0b15ad5b98471/src/main/scala/com/typesafe/play/cachecontrol/freshnesscalculator.scala#l42

因此,我的解决方案是更改服务器,使其提供正确的头:cache-control“max-age=3600,public”

 类似资料:
  • 我已经使用咖啡因缓存设置了一个场景,但我无法让它工作,当参数相同时,总是调用真正的方法。这是我的配置: 波姆。xml CacheManager的配置类 然后是具有可缓存方法的类: 我还尝试将缓存名称添加到可缓存批注: 并将移动到Spring Boot主应用程序类。 真正的方法总是被调用的。 你知道我做错了什么吗? 谢谢

  • 我试图使用Spring Boot与咖啡因和一些注释函数。在我们的测试中,对控制器endpoint的异步调用出现了一些问题,这些问题似乎与我们使用非异步缓存的事实有关。 在做一些研究时,我看到了很多使用Caffeine手动使用的例子,但是在和Spring Boot和注释中找不到任何东西。看起来和具有非常不同的API。是否可以异步使用默认的Spring Boot? 谢谢

  • 从Java8开始,我们可以在ConcurrentHashMap上使用。compute*方法来按键同步处理,这样,如果两个线程同时在同一个键上执行。compute*方法,回调仍然会相继执行,而不是同时执行。但是ConcurrentHashMap不能像缓存通常允许的那样提供及时删除数据的能力。 Guava/Caffeine缓存提供了基于时间的自动删除值的能力,但是您没有基于键的同步处理的讨厌特性,如在

  • 我目前正在学习咖啡因,总体来说我对Spring还不熟悉。我一直在尝试用咖啡因实现缓存;然而,我发现自己遇到了几个问题。 我看到了两种配置咖啡因缓存的方法。 首先是Java类: 第二是在应用范围内。财产: 我想问一下,这两者之间有什么不同之处吗?我需要课程和应用程序吗。属性配置,还是仅其中一个?此外,在Java类实现中,cacheManager是仅应用于名为“example”的缓存,还是应用于每个缓

  • 在Spring有什么方法可以达到同样的效果。 我确实在这里查看了@cacheable http://www.baeldung.com/spring-cache-tutorial 但是我无法理解我是如何使spring使用我的“memcached”类的,更具体地说,我在哪里连接我的“memcached”类,以便它可用于上面示例中的类“abc

  • 我正在使用咖啡因缓存,并寻找一种方法来更新缓存中的值,而不更改其过期时间。 场景是我使用缓存来加速数据加载。数据更改延迟5秒是可以接受的,而我希望返回速度很快。此外,我希望这些缓存在第一次命中1天后过期,以避免不必要的内存使用。 因此,我希望每个缓存的密钥持续一天,但其值每5秒更新一次。 方法似乎已关闭,但刷新持续时间后的第一个返回值仍然是旧值。这对我来说并不理想,因为两次点击之间的持续时间可能是