Tôi đang sử dụng bộ đệm cache trừu tượng cho các đối tượng bộ nhớ cache trong lớp dịch vụ. này là tốt cho các hoạt động đơn giản get/đặt như sau:Cách trả về số lượng mục nhập bằng cách sử dụng bộ nhớ đệm mùa xuân trừu tượng
static private final String cacheName = "messages";
@CacheEvict(value=cacheName, key="#message.id")
public void deleteMessage(Message message) {
...
}
@Cacheable(value=cacheName, key="#id")
public Message findMessage(Long id) {
...
}
@CachePut(value=cacheName, key="#message.id")
public void saveMessage(Message message) {
...
}
@CachePut(value=cacheName, key="#message.id")
public Message updateMessage(Message message) {
...
}
Tuy nhiên, những gì chú thích tôi sẽ sử dụng cho các phương pháp sau đây:
public long countAllMessages() {
...
}
Vì tất cả các đối tượng sẽ nằm trong bộ nhớ cache, nên có một cách để có được câu trả lời từ bộ nhớ cache và không phải đi đến tầng kho lưu trữ.
Ngoài ra, bộ nhớ cache đang được áp dụng vào phương pháp sau đây:
@Cacheable(cacheName)
public List<Message> findAllMessages() {
...
}
tôi có thể làm cho phương pháp đếm gọi tất cả phương pháp như thế này:
public long countAllMessages() {
return findAllMessages().size();
}
Nhưng điều này sẽ không có hiệu quả trong trường hợp bộ nhớ cache bị tắt, khi cuộc gọi sau đó sẽ tải tất cả các bản ghi từ db thay vì thực hiện SELECT COUNT (*) ...
Và làm cách nào để đảm bảo rằng lần đầu tiên countAllMessages() được gọi, nó không nhấn bộ nhớ cache? – Solubris
Thay vì gọi phiên bản countAllMessages(), bạn sẽ gọi getTotalEhCacheSize() hoặc thay thế mã từ getTotalEhCacheSize() thành countAllMessages(). Nếu bạn cần số đếm thực tế từ cơ sở dữ liệu (hoặc bất kỳ phần cuối nào), bạn sẽ cần một phương thức chuyên dụng để thực hiện điều đó, bạn có thể chú thích bằng chú thích @Cacheable (nếu bạn muốn). Nếu bạn muốn nó làm mới bất cứ lúc nào, hãy gỡ bỏ bộ nhớ cache của phương thức khi bạn gọi bất kỳ phương thức cập nhật nào khác hoặc định kỳ gỡ bỏ nó theo cách thủ công, ví dụ như thông qua một công việc nền. –