2009-06-22 2 views
5

У меня возникла ситуация, когда мне действительно удалось получить такую ​​систему, как memcached, но с возможностью хранения (по каждому ключу) отсортированного списка элементов и изменения списка путем добавления значений.Есть ли что-нибудь вроде memcached, но для отсортированных списков?

Например:

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') 

Что я тогда мог бы использовать так:

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 

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

Надеюсь, что описание будет ясным. И вопрос относительно прост: есть ли такая система?

ответ

4

Redis поддерживает оба списка и наборы.Вы можете отключить сохранение диска и использовать его как Memcached, а не для MongoDB, который сохранит данные на диске.

6

Посмотрите на MongoDB. Он использует файлы с отображением памяти, так что это невероятно быстро и должно выполняться на сравнительном уровне с MemCached.

MongoDB является схемой менее базы данных, которая должна поддерживать то, что вы ищете (индексация/сортировка)

+0

Как я понимаю документы, сортировка выполняется по времени поиска, что для меня не очень полезно - даже с использованием хранилища на основе памяти сортировка 1 миллионных элементов с использованием текстовых значений до 200 символов будет довольно медленной. Но, может быть, я ошибся - проверит документы в глубину. – 2009-06-22 15:03:52

3

MongoDB впишется. Что важно имеет индексы, так что вы можете добавить индекс по названию для сбора темы и затем получить элементы, упорядоченные по индексу:

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

почему не только хранить массив в Memcached? по крайней мере, на python и PHP API-интерфейсы memcached поддерживают это (я думаю, что python использует pickle, но я точно не помню).

Если вам нужно постоянное хранилище данных или резервное копирование, memcacheDB использует тот же API.

Основной пример pseudopython:

не получать сохраненные данные хранятся = cache.get (storedDataName) Список

инициализации, если вы не были сохранены ранее ничего если (хранится == None): сохранено = {}

---------------- находя хранятся предметы

попробовать: alreadyHaveItem = хранится [ItemKey] кроме KeyError: печать 'нет результата в кэшируются'

--------------- - добавление новых элементов

для элемента в newItemsDict: хранить [пункт] = newItems [пункт]

---------------- сохранение результатов в кеше cache.set (хранитсяDataName, сохраняется, TTL)

+0

, потому что сложно отсортировать список в том случае, если у нас есть более одного процесса добавления элементов к нему – 2009-07-02 06:57:01

+0

, вы также можете сохранить список диктонов или даже объектов или несколько отсортированных списков ключей для таких объектов. .etc ... и использовать сортировку вставки ... я делаю такие вещи для ранжирования пользователей. на самом деле у меня есть несколько процессов, отбрасывающих задания в одну очередь (которые ТАКЖЕ хранятся в memcached), а затем они обрабатываются по порядку, эффективно создавая один источник для вставки ... в любом случае, я уверен, что вы знаете свое проблемное пространство лучше, чем я делаю, я не могу определить сложность из того, что вы написали. Удача – 2009-07-02 16:33:59

+0

На самом деле, вы можете просто выполнить сортировку на стороне клиента и CAS в безопасном режиме независимо от параллелизма. Есть несколько стратегий, чтобы сделать такое. – Dustin

Смежные вопросы