如何缓存 return 相同对象列表但基于不同条件的方法?

How to cache methods that return the same list of objects, but based on different conditions?

比如我有3种方法。来自同一存储库的所有 return 数据并将其转换为 DTO。

我应该如何注释它们?

可以用相同的 @Cacheable("Dishes_DTO") 注释所有三个吗?当一个方法一个接一个地执行时会发生什么,它会覆盖数据还是重复?

public List<DishResponseDTO> getAllToday() {
    List<Dish> dishlsit = dishRepository.getAllByDateAdded(LocalDate.now(clock));
    return dishlsit.stream()
            .map(DishMapper::toDishResponseDTO)
            .collect(Collectors.toList());
}

public List<DishResponseDTO> getAll() {
    List<Dish> dishlsit = dishRepository.findAll();
    return dishlsit.stream()
            .map(DishMapper::toDishResponseDTO)
            .collect(Collectors.toList());
}

public List<DishResponseDTO> getDishHistoryByRestaurant(int restaurantId) {
    return dishRepository.getAllByRestaurantId(restaurantId)
            .stream()
            .map(DishMapper::toDishResponseDTO)
            .collect(Collectors.toList());
}

如果你使用一个缓存,你需要有单独的键。您可以采用的一种方法:

@Cacheable(value="dishdto", key="-1")
public List<DishResponseDTO> getAllToday();

@Cacheable(value="dishdto", key="-2");
public List<DishResponseDTO> getAll();

@Cacheable("dishdto")
public List<DishResponseDTO> getDishHistoryByRestaurant(int restaurantId);

这使用整数键并期望 restaurantId 不会为负数。

你的问题有很多方面:

  • 缓存查询
  • 列出结果
  • 随时间变化的结果
  • 一般情况下报告可移动数据

设计问题:

您当前的设计在缓存和内存中包含重复数据,因为所有三种方法的结果可能包含相同的盘子。

由于移动数据,您需要经常更新缓存,例如通过在 5 分钟的缓存上设置过期参数(或 TTL)。这意味着您将重新读取相同的菜肴数据,尽管它可能不会再改变。这可以通过存储库或数据库中的缓存来解决。尽管如此,您还是多次为同一数据条目生成 DTO。

如果事情变得难以捉摸,最好将 dish dto 对象和查询结果的缓存分开。