Spring 缓存列表并更新它的值
Spring caching list and updating it's values
我正在创建 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。
我该怎么办?什么是最好的解决方案?
我想你可以使用@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(...){
...
}
我会考虑 2 个选项,具体取决于响应需要更新到什么程度。
选项 1:@Cacheable + TTL
如果您不需要绝对最新的响应,您可以简单地使用 @Cacheable
注释并将缓存配置为 30 秒 1 分钟的 TTL或者任何对您的应用程序有意义的东西。这样做的好处是不必担心业务代码中的缓存填充和逐出,而以服务可能过时的数据为代价(但您可以控制过时的程度)。
方案二:ConcurrentHashMap + 自定义缓存更新逻辑
如果您总是需要最新的数据,那么我建议您使用 ConcurrentHashMap
确保您的数据与数据库保持同步。这样做的好处是可以使用最新数据,但代价是必须实施缓存填充和逐出。
我正在创建 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。
我该怎么办?什么是最好的解决方案?
我想你可以使用@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(...){
...
}
我会考虑 2 个选项,具体取决于响应需要更新到什么程度。
选项 1:@Cacheable + TTL
如果您不需要绝对最新的响应,您可以简单地使用 @Cacheable
注释并将缓存配置为 30 秒 1 分钟的 TTL或者任何对您的应用程序有意义的东西。这样做的好处是不必担心业务代码中的缓存填充和逐出,而以服务可能过时的数据为代价(但您可以控制过时的程度)。
方案二:ConcurrentHashMap + 自定义缓存更新逻辑
如果您总是需要最新的数据,那么我建议您使用 ConcurrentHashMap
确保您的数据与数据库保持同步。这样做的好处是可以使用最新数据,但代价是必须实施缓存填充和逐出。