2017-10-03 19 views
9

Tôi đang xem xét sử dụng memcached kết hợp với ứng dụng PHP của tôi để lưu trữ 5 triệu cặp khóa-giá trị. Mục tiêu của tôi là để tránh qua lại từ DB (trong trường hợp của tôi là hệ thống tập tin). Tôi có thể có 100-500 truy cập mỗi giây cho khóa-giá trị. Các khóa giá trị cả MD5 và ở dạng:Lưu trữ triệu khóa-giá trị trong memcached - ý tưởng tốt hay xấu?

array('MD5X' => 'MD5Y', ...) 

Tôi không chắc chắn cách dữ liệu được lưu trữ, nhưng nếu chúng ta nhân 5 million * 16 bytes (keys) + 5 million * 16 bytes (values) chúng tôi nhận ~ 180MB.

:

Tập dữ liệu được cố định vì vậy tôi sẽ chỉ đọc từ nó (EDIT sau khi thử với một trường hợp memcached thực tôi sử dụng lên 750MB để lưu trữ tất cả các mục.).

Câu hỏi:

  1. Đây có phải là một thiết kế tốt hay xấu?
  2. Tôi có thể buộc phải ghi nhớ không bao giờ (trừ khi máy chủ bị treo) phải tải lại dữ liệu không? Giả sử rằng nắp bộ nhớ cao hơn dữ liệu được lưu trữ? Nếu không, tôi có thể sử dụng những kỹ thuật nào để đạt được cùng một mục tiêu.

Cảm ơn rất nhiều!

+0

bạn nên sử dụng hồ sơ hiệu suất cho trường hợp sử dụng cụ thể của mình. Hoặc xem xét sử dụng một DB thực như là sẽ có bộ nhớ đệm được xây dựng in Nếu bạn lưu trữ một mảng duy nhất, bạn sẽ không phải kéo toàn bộ mảng để nhìn vào nó? –

+0

Cảm ơn @PaulCollingwood, rất tiếc là tôi không thể sử dụng DB. Chúc mừng – JoeSlav

Trả lời

0

Bạn sẽ nhận được hiệu suất bạn cần? Chắc chắn rồi. Memcache rất nhanh. Chúng tôi lưu trữ khoảng 10 triệu phím và chúng tôi truy cập memcache khoảng 700 lần một giây. Nó chưa bao giờ làm chúng tôi thất vọng.

Bạn có thể tải tất cả các khóa trong memcache khi bạn khởi động ứng dụng và đặt ngày hết hạn là một thời gian rất dài. Điều mà bạn phải nhớ là memcache cuối cùng là một bộ nhớ đệm. Và nó không nên được sử dụng như một công cụ lưu trữ. Bạn phải thiết kế nó nghĩ rằng luôn luôn có khả năng không tìm thấy dữ liệu (khóa) mà bạn cần, và thực hiện cuộc gọi DB trong trường hợp đó.

Cách thay thế bạn có thể xem xét cơ sở dữ liệu noSQL như cassandra, Nó có tốc độ đọc và ghi tuyệt vời đáp ứng nhu cầu của bạn. Điều duy nhất là nó là một chút khó khăn để tinh chỉnh cassandra so với memcache.

+0

Cảm ơn. Theo hiểu biết của tôi, bằng cách không chỉ định hết hạn, các mục sẽ không bao giờ hết hạn, miễn là tôi không có vấn đề về bộ nhớ hoặc bản in. Vì tôi không có DB phía sau (và tôi không muốn giới thiệu các thư viện mới/etc) và tôi không có đủ dung lượng đĩa để sử dụng hệ thống tệp, tôi đang nghĩ sử dụng một mảng khổng lồ được lặp lại theo cách thủ công và được tải vào memcached một khi máy chủ bắt đầu. Nếu một mục không được tìm thấy trong memcached tôi sẽ mặc định một hành vi khác HOẶC có thể xem xét đọc từ mảng, nhưng có tôi sợ đồng thời và giết chết máy chủ. – JoeSlav

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