[英]How to cache methods that return the same list of objects, but based on different conditions?
例如,我有 3 種方法。 所有從同一個存儲庫返回數據並將其轉換為 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對象和查詢結果的緩存分開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.