2009-06-22 23 views
5

Tôi có một tình huống mà tôi thực sự có thể hưởng lợi từ việc có hệ thống như memcached, nhưng với khả năng lưu trữ (mỗi khóa) danh sách các yếu tố được sắp xếp, và sửa đổi danh sách bằng cách thêm các giá trị.Có điều gì giống như memcached, nhưng đối với danh sách được sắp xếp?

Ví dụ:

something.add_to_sorted_list('topics_list_sorted_by_title', 1234, 'some_title') 
something.add_to_sorted_list('topics_list_sorted_by_title', 5436, 'zzz') 
something.add_to_sorted_list('topics_list_sorted_by_title', 5623, 'aaa') 

Mà tôi sau đó có thể sử dụng như thế này:

something.get_list_size('topics_list_sorted_by_title') 
// returns 3 
something.get_list_elements('topics_list_sorted_by_title', 1, 10) 
// returns: 5623, 1234, 5436 

hệ thống bắt buộc sẽ cho phép tôi dễ dàng có được mục đếm trong mỗi mảng, và lấy bất kỳ số lượng các giá trị từ mảng, với giả định rằng các giá trị được sắp xếp bằng cách sử dụng giá trị đính kèm.

Tôi hy vọng rằng mô tả là rõ ràng. Và câu hỏi tương đối đơn giản: có hệ thống nào như vậy không?

Trả lời

4

Redis hỗ trợ cả danh sách và bộ.Bạn có thể vô hiệu hóa đĩa lưu và sử dụng nó như Memcached thay vì đi cho MongoDB mà sẽ lưu dữ liệu vào đĩa.

6

Hãy xem MongoDB. Nó sử dụng bộ nhớ ánh xạ các tập tin, do đó, là cực kỳ nhanh chóng và nên thực hiện ở một mức độ so sánh để MemCached.

MongoDB là một cơ sở dữ liệu schema-ít mà nên hỗ trợ những gì bạn đang tìm kiếm (indexing/phân loại)

+0

Khi tôi hiểu tài liệu, phân loại được thực hiện vào thời gian truy xuất, không thực sự hữu ích cho tôi - thậm chí sử dụng bộ nhớ dựa trên bộ nhớ, sắp xếp 1 phần tử milion, sử dụng giá trị văn bản lên tới 200 ký tự. Nhưng có thể tôi hiểu sai - sẽ kiểm tra tài liệu chuyên sâu. –

3

MongoDB sẽ phù hợp. Điều quan trọng nó có chỉ số, vì vậy bạn có thể thêm một chỉ số theo tiêu đề cho các chủ đề bộ sưu tập và sau đó lấy mục được sắp xếp theo chỉ số:

db.topics.ensureIndex({"title": 1}) 
db.topics.find().sort({"title": 1}) 
0

tại sao không chỉ lưu trữ một mảng trong memcached? ít nhất trong python và PHP các memcached API hỗ trợ điều này (tôi nghĩ python sử dụng dưa nhưng tôi không nhớ lại chắc chắn).

nếu bạn cần lưu trữ hoặc sao lưu dữ liệu vĩnh viễn, memcacheDB sử dụng cùng một API.

cơ bản pseudopython dụ:

bị lưu trữ dữ liệu lưu trữ = cache.get (storedDataName) danh sách

khởi tạo nếu bạn đã không được lưu trữ bất cứ điều gì trước đây if (lưu trữ == None): được lưu trữ = {}

---------------- Phát hiện lưu trữ các mặt hàng

thử: alreadyHaveItem = lưu trữ [itemKey] trừ KeyError: in 'không có kết quả trong cache'

--------------- - thêm các mục mới

cho mặt hàng trong newItemsDict: lưu trữ [item] = newItems [item]

---------------- lưu kết quả vào bộ nhớ cache cache.set (được lưu trữDataName, được lưu trữ, TTL)

+0

vì rất khó để giữ cho danh sách được sắp xếp trong trường hợp chúng tôi có nhiều hơn 1 quá trình thêm các mục vào nó –

+0

, bạn cũng có thể duy trì danh sách các dicts hoặc thậm chí các đối tượng hoặc một danh sách khóa được sắp xếp cho các đối tượng đó. .etc ... và sử dụng sắp xếp chèn ... tôi thực hiện loại công cụ này cho xếp hạng của người dùng. thực sự tôi có nhiều công việc của tôi thả các công việc vào cùng một hàng đợi (được lưu trữ trong memcached) và sau đó chúng được xử lý theo thứ tự, có hiệu quả làm cho một nguồn để chèn ... anyway, tôi chắc chắn bạn biết không gian vấn đề của bạn tốt hơn tôi làm, tôi hoàn toàn không thể xác định sự phức tạp từ những gì bạn đã viết. chúc may mắn –

+0

Trên thực tế, bạn chỉ có thể thực hiện sắp xếp ở phía máy khách và CAS nó một cách an toàn bất kể đồng thời. Đây là một vài chiến lược để làm một điều như vậy. – Dustin

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