Làm cách nào để ngăn tải giá trị không có trong bộ nhớ cache nhiều lần cùng một lúc, trong cách hiệu quả cách?Làm thế nào để ngăn tải giá trị không được lưu trữ đồng thời nhiều lần?
Cách sử dụng bộ nhớ cache điển hình là giả sau đây:
Object get(Object key) {
Object value = cache.get(key);
if (value == null) {
value = loadFromService(key);
cache.set(key,value);
}
return value;
}
Vấn đề: trước khi giá trị được nạp từ dịch vụ (cơ sở dữ liệu, WebService, RemoteEJB hoặc bất cứ điều gì khác) một cuộc gọi thứ hai có thể được thực hiện trong cùng một thời , sẽ làm cho giá trị được tải lại một lần nữa. Ví dụ: khi tôi lưu vào bộ nhớ cache tất cả các mục cho người dùng X và người dùng này thường được xem và có nhiều mục, khả năng gọi đồng thời tất cả các mục của anh ấy là cao, dẫn đến tải nặng trên máy chủ .
Tôi có thể làm cho get
chức năng đồng bộ, nhưng điều này sẽ buộc các tìm kiếm khác phải chờ đợi, không có ý nghĩa nhiều. Tôi có thể tạo khóa mới cho mỗi khóa nhưng tôi không biết liệu có nên quản lý số lượng khóa lớn như vậy trong Java (phần này là ngôn ngữ cụ thể không, lý do tôi đã gắn thẻ khóa đó là java
) .
Hoặc có cách tiếp cận khác mà tôi có thể sử dụng? Nếu vậy, điều gì sẽ hiệu quả nhất?
Bạn đang overthinking này, nghiêm túc. Trừ khi thời gian để tải dữ liệu từ dịch vụ là khủng khiếp lâu, điều này sẽ không bao giờ là một vấn đề. – pablochan
Tôi có một số mã EJB ngoài hành tinh có thể mất đến 20 giây trong môi trường thử nghiệm, vì vậy tôi sợ điều gì sẽ xảy ra với 10 hoặc 20 yêu cầu đồng thời –