Vì vậy, đây là vấn đề tôi đang cố gắng để giải quyết - Tôi có một đối tượng với hai lĩnh vực số nguyên mà tôi muốn để cacheehcache - sử dụng một danh sách <Integer> như giá trị bộ nhớ cache
public class MyObject {
int x;
int y;
....
}
Bây giờ lĩnh vực x
là gì Tôi chủ yếu là phù hợp trên - nhưng có thể có bản sao trong trường hợp tôi muốn rơi trở lại vào lĩnh vực thứ hai (để this.x = that.x và this.y = that.y). y chỉ có thể là 25 giá trị khác biệt. Bây giờ tôi biết tôi chỉ có thể kết hợp hai như một String và sử dụng nó như là khóa bộ nhớ cache, nhưng sau đó tôi sẽ phải thử x+[25 possible values]
để thực sự xác định nếu nó không có trong bộ nhớ cache làm cho bộ nhớ cache nhớ rất tốn kém. Tôi đã nghĩ đến việc cố gắng lưu trữ List<Integer>
làm giá trị bộ nhớ cache cho trường x
và sau đó nếu chúng nhiều hơn một, hãy lặp lại danh sách và tìm kiếm kết quả phù hợp trên y
.
Bây giờ nếu tôi sử dụng ConcurrentList
(hoặc Tập hợp nếu tôi quan tâm đến các bản sao - cho phép bỏ qua điều đó bây giờ) nhiều chủ đề có thể thêm vào và sau đó đưa nó trở lại bộ đệm không có điều kiện chủng tộc? Có thể là Ehcache có thể trả về hai đối tượng danh sách khác nhau cho hai luồng và sau đó khi chúng thêm giá trị mới của chúng vào danh sách và cố gắng đưa nó trở lại bộ đệm, tôi có thể nhận được kết quả không xác định? Bạn có thấy cách xây dựng bộ đệm ẩn này tốt hơn không?
EDIT: Tôi đánh giá cao các câu trả lời bên dưới, nhưng mọi người dường như thiếu điểm chính. Điều này có hiệu quả không? Có thể Ehcache thực sự trả về hai đối tượng khác nhau cho cùng một cacheKey (nói nếu đối tượng nằm trên đĩa trong suốt cuộc gọi và nó được tuần tự hóa nó hai lần, một lần cho mỗi cuộc gọi).
Có lý do nào khiến bạn không thể sử dụng băm làm khóa không? – Falmarri
Như tôi đã nói trong câu hỏi đó có nghĩa là cho bất kỳ giá trị nhất định của x tôi sẽ phải kiểm tra bộ nhớ cache có thể 25 lần để thực sự biết nó không có trong bộ nhớ cache. Tôi muốn khớp trên x bất kể giá trị của y - nhưng nếu có nhiều x thì giá trị tốt nhất của y. – Gandalf
Có thể có một giá trị được thêm hai lần bằng phương pháp bạn đã đề cập. Thay vì sử dụng ConcurrentMap. –