【问题标题】:Spring caching list and updating it's valuesSpring缓存列表并更新它的值
【发布时间】:2017-01-02 11:21:08
【问题描述】:

我正在创建 Spring 应用程序,它将车辆的 GPS 位置保存在 Postgres 数据库中。车辆每分钟发送一次位置。每辆车都由一些 ID(字符串)标识。有 REST 端点来获取所有当前位置。我想缓存所有当前的 GPS 位置,以便在不请求数据库的情况下更快地获取。

我尝试使用:

@Cacheable(key = "'all'")
List<Position> getAllVehiclePositions();

它可以工作,但问题是当某些车辆发送新位置时,我无法更新缓存中的列表,所以我必须

@CacheEvict(key = "'all'")

这没有任何意义,因为缓存仍在被驱逐。

我已经读过它,例如https://jira.spring.io/browse/SPR-12036 但没有解决方案(只是不使用缓存)。

我考虑过创建 ConcurrentHashMap,其中键是车辆 ID,这样我就可以轻松更新它,我可以简单地使用流将 List 转换为 Map。

我该怎么办?最好的解决方案是什么?

【问题讨论】:

    标签: spring caching spring-cache


    【解决方案1】:

    我会考虑 2 个选项,具体取决于响应的最新程度。

    选项 1:@Cacheable + TTL

    如果您不需要绝对最新的响应,您可以简单地使用 @Cacheable 注释并将缓存配置为 30 秒、1 分钟或任何对您的应用程序有意义的值.这样做的好处是不必担心业务代码中的缓存填充和逐出,而以提供可能过时的数据为代价(但您可以控制过时的程度)。

    方案二:ConcurrentHashMap + 自定义缓存更新逻辑

    如果您总是需要最新的数据,那么我建议您使用ConcurrentHashMap,确保您的数据与数据库保持同步。这样做的好处是可以获得最新的数据,但代价是必须实现缓存填充和驱逐。

    【讨论】:

      【解决方案2】:

      我认为你可以使用@CachePut 注解。见:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html#cache-annotations-put

      除了正常的更新方法之外,您还可以创建第二种方法来更新您的所有位置列表,如下所示:

      public Position updatePosition(...){
          ...
          updateAllPositions(...) 
      }
      
      @CachePut(key="'all'") 
      public List<Position> updateAllPositions(...){
          ... 
      }
      

      【讨论】:

      • 但是如何实现呢?
      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2023-03-15
      • 2016-11-09
      • 2018-06-27
      • 2012-08-02
      相关资源
      最近更新 更多