2011-09-29 42 views
6

Tôi đã có kinh nghiệm với MongoDB, CouchDB, Redis, Tokyo Nội các và Cơ sở dữ liệu NoSQL khác. Gần đây tôi tình cờ gặp Riak và nó trông rất thú vị với tôi. Để bắt đầu với nó, tôi quyết định viết một bản sao twitter nhỏ, "hello world" trong NoSQL World. Để có được bản sao làm việc đầy đủ, cần phải đặt hàng các tweet theo thứ tự thời gian. Sau khi đọc các tài liệu của Riak tôi phát hiện ra rằng Map-Reduce là công cụ thích hợp cho công việc này. Trong môi trường phát triển của tôi, nó hoạt động khá tốt, nhưng hiệu suất trong sản xuất như thế nào, với hàng trăm truy vấn song song? Có cách nào khác, có thể nhanh hơn, các phương pháp phân loại dữ liệu, hoặc có thể lưu trữ dữ liệu theo dạng được đặt hàng (như Cassandra) không?Cách sắp xếp/sắp xếp dữ liệu trong Riak?

Cập nhật: Tôi nghĩ rằng tôi đã tìm thấy một giải pháp khác cho vấn đề này - một danh sách được liên kết đơn giản. Vì vậy, một triển khai có thể có thể là mỗi người dùng nhận "nhóm thời gian" của riêng mình, nơi liên kết đến chính dữ liệu tweets được lưu trữ (các tweet được lưu trữ riêng trong nhóm "tweets"). Như bạn biết, dòng thời gian này phải chứa khóa có tên "đầu tiên", liên kết đến đối tượng dòng thời gian mới nhất và là điểm bắt đầu của danh sách. Để chèn một tweet mới vào dòng thời gian, chỉ cần chèn một mục mới vào nhóm thời gian, hãy đặt liên kết "tiếp theo" của mục mới này thành mục "đầu tiên", sau đó, đặt mục mới thành "đầu tiên".

Nói tóm lại: Chèn một mục như bạn sẽ làm trong một danh sách liên kết ...

Như với twitter, timeline cá nhân chỉ nắm giữ 20 tweets hiển thị cho người dùng. Để nhận được 20 tweet cuối cùng, chỉ có 2 truy vấn cần thiết. Để tăng tốc mọi thứ, truy vấn đầu tiên sử dụng khả năng liên kết-đi bộ của Riak để có được 20 đối tượng mới nhất, được gắn thẻ "tiếp theo". Cuối cùng, truy vấn thứ hai và cuối cùng sử dụng các khóa được tính toán bởi truy vấn đầu tiên để nhận bản thân các tweet (sử dụng ánh xạ/giảm).

Để xóa các tweet của người dùng bạn vừa hủy theo dõi, tôi sẽ sử dụng khả năng chỉ mục phụ của Riak 1.0 để nhận các đối tượng dòng thời gian/tweet liên quan.

+0

Vì Riak 1.4 sắp xếp và phân trang có sẵn với Chỉ mục phụ: http://basho.com/basho-announces-availability-of-riak-1-4/ – nacmartin

Trả lời

2

Không thể lưu trữ dữ liệu ở dạng được đặt hàng ở Riak mà không cần phải viết lại các phần của lõi Riak. Dữ liệu được lưu trữ, gần như, trong bucket + thứ tự khóa. Thứ tự thực tế phụ thuộc vào cơ chế lưu trữ phụ trợ mà bạn đang sử dụng cho Riak.

Riak 1.0 cũng có một số tính năng có thể giúp bạn. Có hỗ trợ cho các chỉ mục phụ cũng như các cải tiến đối với các hoạt động Map Reduce - đặc biệt, chúng hoạt động tốt hơn nhiều trong các tình huống đồng thời cao.

Alexander Siculars đã viết một bài viết về Pagination with Riak. Nó vạch ra vấn đề khá tốt. Yammer cũng sử dụng rộng rãi Riak và hai kỹ sư của họ cùng nhau trình bày về Riak at Yammer. Nó không đi vào nhiều chi tiết triển khai, nhưng bạn có thể tìm hiểu rất nhiều về cách họ đã thiết kế giải pháp của họ.

Kết hợp các truy vấn chỉ mục phụ và Map Reduce giúp bạn dễ dàng giải quyết vấn đề của mình.

0

Như Jeremiah nói rằng không thể lưu trữ dữ liệu theo thứ tự được sắp xếp, nhưng bạn vẫn có thể làm cho nó trả về kết quả được sắp xếp bằng cách sử dụng chỉ mục phụ và ánh xạ/giảm. Vấn đề, như được mô tả, là bạn không thể giới hạn truy vấn một cách hiệu quả theo cách được sắp xếp.

Dưới đây là một ví dụ sử dụng truy vấn nhiều để liệt kê tất cả các phím và sau đó sắp xếp chúng bằng cách sử dụng được xây dựng trong các chức năng trong * riak_kv_mapreduce * ::

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 
riakc_pb_socket:mapred(Pid            
    , {index, colonel_riak:bucket(context), <<"$key">>, <<0>>, <<255>>}  
    , [{reduce, {modfun, riak_kv_mapreduce, reduce_sort}, none, true}]) 

Bạn có thể sử dụng chức năng trong module lists trong erlang hoặc sử dụng chức năng sắp xếp javascript gốc. Đặt hàng bằng cách có thể đạt được bằng cách lists:reverse/1 trong erlang.

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