Memcached представляет собой сервер, хранящий в оперативной памяти некоторые данные с заданным временем жизни. Доступ к данным осуществляется по ключу (имени). Вы можете думать о Memcached, как о хэш-таблице , хранящейся на сервере. Применяется он в основном для кэширования кода веб-страниц, результатов запросов к базе данных и тп.
Также ничто не мешает использовать Memcached в качестве «не очень надежного» key-value хранилища. Например, в нем можно хранить сессии пользователей, коды капч или счетчик посетителей, находящихся в данный момент на сайте.
Установка Memcached под FreeBSD
Memcached очень прост в установке и настройке. Например, чтобы поднять его под FreeBSD, достаточно выполнить следующие шаги. Ставим бинарный пакет с мемкэш о м:
В /etc/rc.conf пишем:
memcached_flags=»-l 127.0.0.1 -m 1024″
Флагами мы говорим Memcached использовать не более 1 Гб памяти, а также принимать соединения только от приложений, запущенных на локалхосте. Запускаем сервер:
Готово!
Использование Memcached в скриптах на Perl
Для работы с мемкэш о м из Perl нам потребуется модуль Cache::Memcached :
Дополнение: См также Cache::Memcached::XS . Спасибо @xomaa за подсказку.
Рассмотрим простейший скрипт:
# memcached-example.pl
# (c) Alexandr A Alexeev 2012 | http://remontka.com/
use Mojo :: Base — strict ;
use Cache :: Memcached ;
# если указать несколько серверов, данные будут распределяться
# между ними в зависимости от хэша ключа
my $cache = Cache :: Memcached -> new (
servers => [ ‘127.0.0.1:11211’ ]
) ;
# присваиваем example_key значение 123
# (время жизни — 2 часа или меньше, если кончится память)
$cache -> set ( ‘example_key’ , 123 , 60 * 60 * 2 ) ;
# увеличиваем значение example_key на 5
$cache -> incr ( ‘example_key’ , 5 ) ;
# считываем значение example_key
my $val = $cache -> get ( ‘example_key’ ) ;
say «val = $val» ;
Запускаем:
val = 128
Помимо чисел также можно хранить строки. Для хранения более сложных объектов требуется сериализация. Например, для сохранения массивов и хэшей можно воспользоваться модулем JSON::XS .
Текстовый протокол Memcached
Протокол, используемый Memcached , прост до безобразия:
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
version
VERSION 1.4.10
get example_key
VALUE example_key 0 3
128
END
decr example_key 3
125
delete example_key
DELETED
flush_all
OK
quit
Протокол Memcahced используется во многих приложениях помимо самого мемкэш а . Например, через тот же модуль Cache::Memcached можно работать с MemcacheQ, MemcacheDB, а также Tarantool/Box. Но это — темы для отдельных заметок.
Коротко о главном
В отношении Memcached справедливы следующие утверждения:
- Все данные хранятся в памяти для ускорения чтения-записи (не забудьте отключить swap!);
- Максимальная длина ключа по умолчанию составляет 250 байт, а длина значения — 1 Мб;
- Будьте осторожнее со спец-символами ;
- Ключи можно «расширить», воспользовавшись каким-нибудь MD5 или SHA512 (в этом случае нехэшированный ключ будет разумно продублировать в значении);
- Если хочется хранить очень длинные значения, можно сжимать их и/или разбивать на части;
- Memcached использует алгоритм кэширования LRU ;
- Весь ввод-вывод осуществляется с помощью libevent ;
- Для ускорения работы память выделяется при запуске демона и не освобождается до его остановки;
- Для борьбы с фрагментацией памяти используется slab allocator ;
- Все операции являются атомарными, есть поддержка compare-and-swap ;
- С Memcached можно работать по UDP;
- Помимо текстового протокола также существует бинарный ;
- Написан на Си, распространяется под лицензией BSD;
- Используется в LiveJournal, Mail.ru, Twitter, Wikipedia, YouTube, Typepad и многих других проектах;
- Memcached был создан тем самым Брэдом Фитцпатриком;
Как обычно, вопросы и указания на неточности приветствуются.
Перекрестная ссылка: Redis и области его применения