Spring缓存列表并更新它的值

标签 spring caching spring-cache

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

我尝试使用:

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

它可以工作,但问题是当某些车辆发送新位置时,我无法更新缓存中的列表,因此我必须
@CacheEvict(key = "'all'")

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

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

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

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

最佳答案

我会考虑 2 个选项,具体取决于响应需要更新到什么程度。
选项 1:@Cacheable + TTL
如果您不需要绝对最新的回复 你可以简单地使用 @Cacheable注释并将缓存配置为 30 秒、1 分钟或任何对您的应用程序有意义的 TTL。这样做的好处是不必担心业务代码中的缓存填充和逐出问题,而以提供可能过时的数据为代价(但您可以控制过时的程度)。
方案二:ConcurrentHashMap+自定义缓存更新逻辑
如果您总是需要最新数据那么我建议你使用 ConcurrentHashMap确保它与数据库保持同步。这样做的好处是可以获得最新的数据,但代价是必须实现缓存填充和逐出。

关于Spring缓存列表并更新它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41425876/

相关文章:

java - OptimisticLockingFailureException : Attempt to update step execution id=1 with wrong version (1),,其中 Spring Batch 代码中的当前版本为 2

spring-boot - 无法获取 Jedis 连接,嵌套异常 : Could not get a resource from the pool

java - 如何在来自 GET 和 POST 请求的 Spring Controller 方法之间共享信息?

java - Spring 的 AntPathMatcher 与 linux 路径的匹配行为

java - 将 Websphere 7 配置为对所有请求使用单个 JAX-WS 服务实例

http - 在 React Native 应用程序中使用 ETag 缓存 JSON 响应

java - GemFire 条目的生存时间未使用 spring-cache 设置

java - Spring Cache 从值中获取键

java - 为什么用户提交注册表单时没有执行registerSubmit? Spring

java - 搜索引擎中的缓存管理