2009-06-09 36 views
13

Memcached cung cấp tùy chọn thời gian hết hạn bộ nhớ cache, chỉ định khoảng thời gian các đối tượng được giữ lại trong bộ nhớ cache. Giả sử tất cả các ghi là thông qua bộ nhớ cache Tôi không hiểu tại sao người ta lại muốn xóa một đối tượng khỏi bộ nhớ cache. Nói cách khác, nếu tất cả các hoạt động ghi cập nhật bộ nhớ cache trước DB, thì bộ nhớ cache không bao giờ có thể chứa một đối tượng cũ, vậy tại sao lại xóa nó?Thời gian hết hạn ghi nhớ

Một đối số có thể là bộ nhớ cache sẽ phát triển vô thời hạn nếu các đối tượng không bao giờ bị xóa, nhưng memcached cho phép bạn chỉ định kích thước tối đa. Khi đạt đến kích thước này, memcached sử dụng thuật toán (LRU) ít được sử dụng gần đây nhất để xác định các mục cần xóa. Tóm lại, nếu một kích thước tối đa hợp lý đã được cấu hình, và tất cả các ghi được thông qua bộ nhớ cache, tại sao bạn muốn hết hạn các đối tượng sau một khoảng thời gian nhất định?

Cảm ơn, Don

Trả lời

0

tôi muốn nói đó là về sự phân biệt giữa 'gần đây ít sử' và 'Không Gonna được sử dụng nữa ... nếu bạn có thể chỉ ra một cách rõ ràng mà các đối tượng có thể được đưa ra khỏi bộ nhớ cache, để lại nhiều chỗ cho các đối tượng có thể vẫn được sử dụng sau này.

+0

Tôi đã đọc các tuyên bố rằng đôi khi các phím chưa hết hạn có thể thực sự bị xóa khỏi bộ nhớ cache trước các khóa đã hết hạn - đây là một sự hy sinh được thực hiện để giữ thuật toán tẩy sạch bộ nhớ cache LRU hiệu quả. Nói cách khác, có * không * một sự khác biệt giữa 'Ít nhất được sử dụng gần đây' và 'Không phải là được sử dụng Anymore'. Các khóa hết hạn không thực sự bị xóa khi hết hạn - nhưng chúng * sẽ * bị xóa trong lần tiếp theo yêu cầu nhận được gửi đến chúng. Vì vậy, trong ngắn hạn, thiết lập expirations không thực sự nhất thiết phải giúp "để lại nhiều phòng" cho các phím không hết hạn. –

14

Thời gian hết hạn hữu ích khi bạn không cần thông tin chính xác, bạn chỉ muốn thông tin chính xác trong một khoảng thời gian nhất định. Vì vậy, bạn lưu trữ dữ liệu của bạn trong (nói) năm phút. Khi dữ liệu là cần thiết, hãy kiểm tra bộ nhớ cache. Nếu nó ở đó, hãy sử dụng nó. Nếu không (vì nó hết hạn), sau đó đi và tính toán giá trị một lần nữa.

Một số giá trị được lưu vào bộ nhớ cache dựa trên một tập hợp dữ liệu lớn và làm mất hiệu lực bộ nhớ cache hoặc viết các giá trị mới cho nó là không thực tế. Điều này thường đúng với dữ liệu tóm tắt hoặc dữ liệu được tính từ một tập hợp lớn dữ liệu gốc.

3

Một trường hợp sẽ là nơi giá trị chỉ hợp lệ trong một khoảng thời gian nhất định.

+1

Như trong, tóm tắt lưu lượng truy cập trang web hoặc doanh số bán hàng mà chúng tôi đã có trong 3 giờ qua. Đặt thời gian hết hạn memcache của bạn thành 3 giờ và tự động tính toán khi không tìm thấy trong bộ nhớ cache và bạn không phải lo lắng về thời gian trong mã của mình. Hoặc có thể đó là mật khẩu tạm thời hoặc mã thông báo của một số loại. (Good point bởi Objects, nhưng tôi cảm thấy nó có thể sử dụng một số ví dụ.) –

3

Một số dữ liệu trong bộ nhớ cache là tốn kém để tạo ra nhưng nhỏ (nên một thời gian dài) và một số là lớn nhưng tương đối rẻ (nên kéo một thời gian ngắn hơn)

Ngoài ra, đối với hầu hết các ứng dụng rất khó để làm cho memcached làm việc như một ghi thông qua bộ nhớ cache. Rất khó để vô hiệu hóa đúng tất cả bộ nhớ cache, đặc biệt là các trang được hiển thị. Hầu hết người dùng sẽ bỏ lỡ một cặp vợ chồng.

12

Tôi đã tò mò về điều này bản thân mình, khi tôi lần đầu tiên bắt đầu làm việc với memcached. Chúng tôi hỏi những người bạn đã từng làm việc tại hi5 và facebook (cả những người sử dụng nhiều memcached).

Cả hai đều nói rằng họ thường sử dụng thứ gì đó như thời gian hết hạn mặc định là 3 giờ như một loại "chỉ trong trường hợp".

  1. Đối với hầu hết các đối tượng, nó không phải là đắt tiền để xây dựng lại chúng mỗi 3 giờ
  2. Trên cơ hội ra bạn đã có một số lỗi gây ra điều cần ở lại cache rằng không nên bằng cách khác, điều này có thể giữ cho bạn từ gặp rắc rối quá nhiều

Vì vậy, tôi đoán câu trả lời cho câu hỏi "Tại sao?" thực sự là "Tại sao không?" Nó không chi phí bạn nhiều để có một hết hạn trong đó, và nó có lẽ sẽ chỉ giúp đảm bảo bạn không giữ dữ liệu cũ trong bộ nhớ cache.

0

Nếu thiết kế của bạn yêu cầu bộ đệm ghi, bạn vẫn gặp sự cố với giới hạn bộ nhớ được phân bổ cho memcached là nơi LRU được phát.

LRU có hai quy tắc khi xác định những gì để tung ra, và làm như vậy theo thứ tự sau:

  1. tấm hết hạn
  2. Cũ nhất không sử dụng tấm

Cung cấp ngày hết hạn khác nhau cho các nhóm khác nhau các đối tượng có thể giúp dữ liệu ít thường xuyên truy cập tốn nhiều bộ nhớ hơn trong khi vẫn cho phép các bản được sử dụng thường xuyên hơn mà vẫn có thể tìm đường đến cuối hàng đợi nhưng dễ tái tạo, hết hạn. Nó cũng là trường hợp nhiều phím bộ nhớ cache trở thành tập hợp của các đối tượng khác, và trừ khi bạn sử dụng hàm băm tra cứu cho các đối tượng đó, sẽ dễ dàng hơn nếu chỉ để cho các đối tượng hết hạn sau vài giờ hơn là chủ động cập nhật tất cả các khóa liên quan, và nó cũng duy trì tỷ lệ hit/miss mà bạn đang có hiệu quả cạnh tranh bằng cách sử dụng memcached ở nơi đầu tiên.

0

Có nhiều lý do:

  1. lưu trữ dữ liệu là không dai dẳng giữa khởi động lại máy chủ. Bạn sẽ phải tạo lại dữ liệu bộ nhớ cache lớn sau khi khởi động lại hoặc tải lại máy chủ lưu trữ bộ nhớ cache.
  2. Có thể có trường hợp khi bạn không được thông báo khi một đối tượng đã cập nhật. ví dụ. Chi tiết người dùng được API trả lại.
  3. Tìm kiếm một đối tượng. SQL cung cấp dữ liệu giống nhau để tạo ra các kết quả khác nhau tùy thuộc vào các yêu cầu như gần đây và được bình chọn nhiều nhất. Bạn sẽ phải sử dụng các khóa bộ nhớ cache khác nhau để lưu trữ dữ liệu cho các kết quả khác nhau (sao chép dữ liệu, nhức đầu để cập nhật tất cả các khóa liên quan ngay cả khi thay đổi datum chung duy nhất). Ngoài ra với Database Server, bạn có khả năng linh hoạt hơn khi lướt qua dữ liệu (số liệu thống kê tùy chỉnh, v.v.).
1

Chúng tôi đã suy nghĩ về điều tương tự và đây là những gì trên wiki được ghi nhớ "Ngay cả khi bạn đang tích cực xóa hoặc ghi đè dữ liệu đã lưu vào bộ nhớ cache, bạn vẫn muốn có bộ nhớ cache hết hạn đôi khi. có lỗi, sự cố, lỗi mạng hoặc một số vấn đề khác mà bộ nhớ cache có thể không đồng bộ hóa. "

Điều này có ý nghĩa vì chúng tôi không thể lập kế hoạch cho các lần bật mạng và điều này trở nên quan trọng nếu chúng tôi phát hành mã mỗi ngày hoặc 2 hoặc tuần. một ý nghĩ chúng tôi có là khởi động lại máy chủ memcached mỗi bản phát hành, nhưng điều đó sẽ thực sự gây đau đớn nếu có từ 10 máy chủ trở lên bị memcached. Điều đơn giản nhất tôi tin là đặt hết hạn trên các đối tượng.

Các vấn đề liên quan