2012-05-15 23 views
10

Tôi có một bãi chứa lớn key-value, mà tôi cần phải tra cứu cho webapp django-Python của tôi.Duy trì một từ điển lớn trong bộ nhớ cho Django-Python?

Vì vậy, tôi có các tùy chọn sau đây:

  • cửa hàng nó như json bãi và tải nó như là một dict python.
  • Lưu trữ trong một số dump.py và nhập dict từ đó.
  • Sử dụng một số hệ thống được nhắm mục tiêu cho sự cố này: [Điều này thực sự có ý nghĩa đối với ứng dụng này không? ]
    • Mem-cache
    • Redis
    • Bất kỳ lựa chọn nào khác?

nào từ bên trên là đúng cách để đi đâu?

Bạn so sánh memcache và redis như thế nào?

Cập nhật:

  • từ điển của tôi là về 5 MB về kích thước và sẽ phát triển theo thời gian.
  • Sử dụng Redis/Memcache thêm phí trên mỗi lần nhấn, vì vậy sẽ dump.py sẽ tốt hơn vì sẽ mất thời gian để tải nó vào bộ nhớ nhưng sau đó sẽ chỉ thực hiện tra cứu bộ nhớ.

  • từ điển của tôi cần phải được cập nhật mỗi ngày, xem xét rằng dump.py sẽ có vấn đề, vì chúng ta phải khởi động lại django-server để tải lại nơi như tôi đoán nó sẽ phản ánh một cách nhanh chóng trong redis và memcache.

  • Chỉ sử dụng một hệ thống như redis chỉ khi bạn có số lượng lớn dữ liệu và bạn phải tra cứu rất thường xuyên, trong trường hợp đó.

Hãy chia sẻ kinh nghiệm của bạn về điều này!

+3

Phụ thuộc. Nút cổ chai của bạn ở đâu? –

+0

bạn có cần một cơ sở dữ liệu không? – moooeeeep

+0

Bạn có thường xuyên kiểm tra khóa nếu bạn lo lắng về ổ cắm? –

Trả lời

6

Để chọn Memcache hoặc REDIS, chúng có khả năng yêu cầu hàng chục nghìn mỗi giây trên phần cứng cấp thấp (ví dụ: 80,000 req/s for REDIS on C2D Q8300). Với độ trễ dưới 1ms. Bạn đang nói rằng bạn đang làm một cái gì đó theo thứ tự 20 yêu cầu một giây, vì vậy hiệu suất khôn ngoan nó thực sự không vấn đề.

Nếu bạn chọn tùy chọn dump.py, bạn không cần phải khởi động lại Django để tải lại. Bạn có thể làm reloader đơn giản của riêng bạn:

dump.py: Mã

[ dict code...] 

mtime = 0 

djago:

import dump #this does nothing if it's already loaded 
stat = os.stat(dump_filename) 
if(stat.mtime > dump.mtime): 
    reload(dump) 
    dump.mtime = stat.mtime 

+0

Redis một phần là thông tin thực sự +1 cho điều đó. tải lại() được biết đến với tôi, nhưng tôi đã tải lại sau mỗi 'mtime', mất 2 giây để tải và treo lên yêu cầu trang. Vì vậy, tôi không thể mất chi phí của 2 giây mỗi mtime - Tôi thà khởi động lại máy chủ một khi tôi đã cập nhật dict của tôi. Anyways tải lại không phải là câu hỏi ở đây. Redis một phần là! –

+0

Ý của bạn là "cho mọi thời gian"? Bạn đã nói rằng từ điển được sửa đổi hàng ngày, bạn sẽ phải tải lại từ điển một lần một ngày. – vartec

+0

Ya .. ở đây mtime là 1 ngày. Tốt thôi, tôi nói nó có thể được cập nhật trong một ngày rưỡi. Nhưng, không quan trọng. Thông tin Redis quan trọng –

2

Memcached, mặc dù một sản phẩm tuyệt vời, được khắc bởi Redis trong cuốn sách của tôi. Nó cung cấp rất nhiều điều mà memcached không, giống như kiên trì.

Nó cũng cung cấp các cấu trúc dữ liệu phức tạp hơn như băm. Dữ liệu cụ thể của bạn là gì? Làm thế nào lớn là nó, và làm thế nào lớn/loại giá trị?

+0

Vui lòng xem nội dung cập nhật trong câu hỏi. –

1

Trước đây cho một vấn đề tương tự, tôi đã sử dụng ý tưởng về dump.py. Tôi sẽ nghĩ rằng tất cả các cấu trúc dữ liệu khác sẽ yêu cầu một lớp để chuyển đổi các đối tượng của một loại thành các đối tượng python. Tuy nhiên tôi vẫn nghĩ rằng điều này sẽ phụ thuộc vào kích thước dữ liệu và lượng dữ liệu bạn đang xử lý.Memcache và redis nên có chỉ mục tốt hơn và tìm kiếm khi nói đến bộ dữ liệu thực sự lớn và những thứ như tra cứu dựa trên regex. Vì vậy, đề nghị của tôi sẽ là

json - nếu bạn đang phục vụ dữ liệu qua http đến một số tập tin dịch vụ python khác - nếu cấu trúc dữ liệu không phải là quá lớn và bạn không cần bất kỳ loại đặc biệt của cái nhìn ups

memcache và redis - nếu dữ liệu trở nên thực sự lớn

+0

Vui lòng xem nội dung cập nhật trong câu hỏi. –

1

5Mb không lớn. Bạn có thể giữ nó trong bộ nhớ trong quá trình, và tôi khuyên bạn nên làm, cho đến khi nó trở nên rõ ràng từ hồ sơ và thử nghiệm rằng phương pháp đó không đáp ứng nhu cầu của bạn. Luôn làm điều đơn giản nhất có thể.

Giao tiếp ổ cắm không tự giới thiệu nhiều chi phí. Bạn có thể có thể pare nó trở lại một chút bằng cách sử dụng một ổ cắm miền unix. Trong mọi trường hợp, nếu bạn không giữ dữ liệu của bạn trong quá trình, bạn sẽ phải nói chuyện trên một số loại ống.

+0

Đồng ý .. vì vậy bạn có nghĩ rằng redis nên được sử dụng nếu tra cứu giống như 5 lượt tải trang và tổng số 100 trang tải mỗi phút? –

+0

@YugalJindle Không, tôi nghĩ rằng bạn nên giữ dữ liệu của bạn trong quá trình cho đến khi thời gian như hồ sơ thực tế cho thấy rằng nó đang gây ra một vấn đề. – Marcin

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