Как отсортировать / заказать данные? - PullRequest
6 голосов
/ 29 сентября 2011

У меня уже есть опыт работы с MongoDB, CouchDB, Redis, Tokyo Cabinet и другими базами данных NoSQL.Недавно я наткнулся на Риака, и это выглядит очень интересно для меня.Чтобы начать с этим, я решил написать небольшой клон Twitter, «привет мир» в мире NoSQL.Чтобы получить полностью работающий клон, необходимо заказать твиты в хронологическом порядке.Прочитав Riak Docs, я обнаружил, что Map-Reduce является подходящим инструментом для этой работы.В моей среде разработки это работает довольно хорошо, но как производительность в производстве с сотнями параллельных запросов?Существуют ли другие, может быть, более быстрые методы сортировки данных или есть возможность хранить данные в упорядоченном виде (например, Cassandra)?

Я думаю, что нашел другое решение этой проблемы - простой связанный список,Таким образом, одной из возможных реализаций может быть то, что каждый пользователь получает свое собственное «хранилище временной шкалы», где хранятся ссылки на сами данные твитов (твиты хранятся отдельно в корзине «твитов»).Как вы знаете, этот интервал времени должен содержать ключ с именем «first», который ссылается на последний объект timeline и является отправной точкой списка.Чтобы вставить новый твит во временную шкалу, просто вставьте новый элемент в корзину, установите ссылку «следующий» для этого нового элемента в «первый», после этого установите новый элемент в «первый».

Короче говоря: Вставьте элемент, как вы бы сделали в связанном списке ...

Как и в Twitter, личная временная шкала содержит только 20 твитов, показанных пользователю.,Чтобы получить последние 20 твитов, нужно всего 2 запроса.Чтобы ускорить процесс, в первом запросе Riak использует способность ходить по ссылкам, чтобы получить последние 20 объектов, помеченных тегом «next».Наконец, во втором и последнем запросе используются ключи, вычисленные в первом запросе, для получения самих твитов (используя map / уменьшает).

Чтобы удалить твиты пользователей, которых вы только что отписали, я бы использовалспособность вторичного индекса Riak 1.0 принимать связанные объекты / твиты времени.

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Невозможно хранить данные в упорядоченном виде в Riak, не прибегая к перезаписи частей ядра Riak.Данные хранятся, примерно, в порядке + ключ.Фактический порядок зависит от механизма внутреннего хранилища, который вы используете для Riak.

Riak 1.0 имеет некоторые функции, которые также могут вам помочь.Есть поддержка вторичных индексов, а также улучшения операций Map Reduce - в частности, они работают намного лучше в сильно параллельных сценариях.

Александр Сайкулов написал статью о Пагинации с Riak .Это очерчивает проблему довольно хорошо.Yammer также широко использует Riak, и два их инженера составили презентацию о Riak на Yammer .В нем нет подробностей реализации, но вы можете многое узнать о том, как они разработали свое решение.

Объединение запросов вторичного индекса и Map Reduce позволяет очень легко решить вашу проблему.1011 *

0 голосов
/ 09 октября 2012

Как говорит Иеремия, невозможно хранить данные в отсортированном порядке, но вы все равно можете заставить их возвращать отсортированные результаты, используя вторичные индексы и map / проводить.Проблема, как описано, состоит в том, что вы не можете эффективно ограничить запрос отсортированным способом.

Вот пример использования запроса диапазона для вывода списка всех ключей и последующей их сортировки с использованием встроенных функций в * 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}])

Вы можете использовать функции в модуле lists в erlang или использовать встроенную функцию сортировки javascript.Порядок может быть достигнут с помощью lists:reverse/1 в эрланге.

...