2014-11-12 23 views
5

Nếu phương pháp được đánh dấu @Cacheable mất 10 phút để hoàn tất và hai chuỗi t1, t2 truy cập phương thức.Khối Spring @Cacheable có được truy cập bởi nhiều hơn 1 chuỗi đó không?

t1 truy cập tại thời điểm 0 (phương pháp bộ nhớ cache hiện đang chạy cho lần đầu tiên) t2 truy cập vào thời điểm t1 + 5mins

Điều này có nghĩa rằng t2 sẽ không truy cập vào dữ liệu cho khoảng 5 phút kể từ t1 đã bắt đầu các hoạt động @Cacheable và nó là do hoàn thành trong 5 phút (khi nó được chạy trong 5 phút) hoặc sẽ có một cuộc gọi mới đến @Cacheable được gọi bởi t2?

+2

Hỗ trợ bộ nhớ cache được đồng bộ hóa được thêm vào trong Spring 4.3: https://spring.io/blog/2016/03/04/core-container-refinements-in-spring-framework-4-3 – Thomas

Trả lời

2

Nếu kết quả của lần thực thi đầu tiên chưa được lưu trong bộ nhớ cache, lệnh gọi thứ hai sẽ tiếp tục.

Bạn nên hiểu rằng @Cacheable tập trung xung quanh nội dung của bộ đệm (và không cụ thể là ngữ cảnh thực thi của luồng [tốt, loại; bộ nhớ cache vẫn cần phải là luồng an toàn]). Khi thực thi phương thức, bộ nhớ cache được kiểm tra đầu tiên để xem liệu khóa có tồn tại hay không: nếu t1 mất một thời gian để hoàn thành, kết quả của nó sẽ không được lưu trữ, do đó, các thực thi đồng thời sẽ tiếp tục mà không quan tâm đến việc thực thi t1

+0

Kết quả nào sẽ được lưu trữ? sao hoàn thành thực thi của chuỗi thứ hai sẽ ghi đè kết quả được lưu trong bộ nhớ cache đầu tiên? –

+0

Ít nhất, đối với bộ nhớ cache dựa trên ConcurrentMap, bạn sẽ nhận được kết quả thực hiện đầu tiên (theo các quy tắc bản đồ cơ bản, nếu có giá trị cho khóa được cung cấp, giá trị trước đó được trả về) @UsamaTariq – kolossus

+0

Khi chuỗi thứ hai đến thực thi không có giá trị trong bộ đệm (vì t1 mất một thời gian để hoàn thành) do đó t2 cũng sẽ bắt đầu thực hiện. Theo như tôi hiểu kết quả được lưu trữ sau khi hoàn thành thực hiện. t1 sẽ lưu lại kết quả của nó, nhưng t2 sẽ hoàn thành sau. Không nên ghi đè lên kết quả trước đó? hoặc nó sẽ kiểm tra sự tồn tại trước khi bộ nhớ đệm? –

1

giải thích, bộ nhớ cache được kiểm tra trước khi gọi phương thức. Vì vậy, nếu mục không có trong bộ nhớ cache (như sẽ là trường hợp tại t1 + 5 phút), lời gọi phương thức cũng sẽ xảy ra đối với luồng t2.

Không có "chặn" trên chú thích @Cacheable. t2 sẽ gọi phương thức như thể có một cache-miss và do đó t2 cũng sẽ mất 10 phút để hoàn thành cùng một phương thức.

1

Không có chặn trên @Cacheable.

Nhưng bạn có thể sử dụng chiến lược bộ nhớ cache chặn trong triển khai bộ nhớ cache. Truy vấn đầu tiên tìm thấy bỏ lỡ có trách nhiệm xây dựng lại bộ nhớ cache. Các truy vấn khác chờ cho đến khi bộ nhớ cache được xây dựng lại.

  • Để thực hiện bộ nhớ cache cục bộ, hãy sử dụng ReadWriteLock. Xem số net.sf.ehcache.constructs.blocking.BlockingCache.
  • Để triển khai bộ nhớ cache từ xa, hãy sử dụng khóa trung tâm ghetto.
Các vấn đề liên quan