memdata: складируем :)
В одном из проектов потребовалось хранить данные о пользователях и иметь к ним быстрый доступ… Базы данных не прокатывают из-за своей медлительности. Memcache подходит, но для данной задачи ему не хватает одного функционала, — возможности группировать ключи и выбирать сразу группу ключей. Например, у нас есть ключи key1.key11, key1.key12, key2.key21, должна быть возможность сделать запрос /get key1. и получить в ответ значения key1.key11 и key1.key12.
В результате был написан демон memdata… Коротко о функционале:
устанавливаем значения для двух ключей:
/set 123|key1.key12.key123=value1|key1.key13.key133=value2|
получаем два ключа одним запросом:
/get 123|key1.key12.key123|key1.key13.key133|
в ответ получаем:
OK key1.key12.key123=value1|key1.key13.key133=value2|
другой способ:
/get 123|key1.|
в ответ получаем:
OK key1.key12.key123=value1|key1.key13.key133=value2|
а вот так:
/get 123|key3|
получим:
NF
т.е. данные не найдены…
Есть ещё одна полезная команда кроме get и set:
/flush
этой командой все данные сбрасываются в текстовый файл, который хранится по-умолчанию в memdata/data/storage/data.dmp, а при последующем запуске программы, данные из этого файла загружаются в память… Если в конфиге есть: worker.is_flush_on_stop = 1, то, при остановке демона (killall memdata), данные так же сбрасываются в этот файл.
Что-то лень писать… Будет интерес, напишу подробнее…
ЗЫ: да, как всегда используются libevent и, полюбившиеся мне, JudyArray.
Взять всё это добро можно тут: memdata-0.0.1.tgz



Подписалась на rss но приходят только заголовки ((( Почему ?
Здоровски написал!
Классно написано!Интересный материал, видно что автор старался.
А мне вот интересно, а сам автор читает комментарии к этому сообщению. Или мы тут сами для себя пишем?
Читает, читает…
Да, есть интерес
Опишите пожалуйста подробнее. Так же интересен исход при условии нестабильности среды. Как я понимаю, все теряем? Т.е. подход все равно необходимо использовать вместе БД или постоянно флушить?
А что поподробнее интересует? Есть идентификатор пользователя (любая строка), для которого мы устанавливаем некоторые свойства и их значения…
Если сервер внезапно валится, и система не успевает погасить демон через kill, то всё теряем… Если останавливаем демон командой kill -9, то тоже теряем… Так что только флашить… Флаш выполняется очень быстро, на тестовом сервере 100Мб данных вывалилось меньше чем за 2 секунды…
если вместо memcache использовать redis
то задача решается без написания собственного демона =)