Memcached представляет собой сервер, хранящий в оперативной памяти некоторые данные с заданным временем жизни. Доступ к данным осуществляется по ключу (имени). Вы можете думать о Memcached, как о
хэш-таблице , хранящейся на сервере. Применяется он в основном для кэширования (кода веб-страниц, результатов запросов к БД), хотя ничто не мешает также использовать Memcached в качестве «не очень надежного» key-value хранилища.
Установка Memcached под FreeBSD
Memcached очень прост в установке и настройке. Например, чтобы поднять его под FreeBSD, достаточно выполнить следующие шаги. Ставим
бинарный пакет с мемкэшом:
В /etc/rc.conf пишем:
memcached_enable="YES"
memcached_flags="-l 127.0.0.1 -m 1024"
Флагами мы говорим Memcached использовать не более 1 Гб памяти, а также принимать соединения только от приложений, запущенных на локалхосте. Запускаем сервер:
/usr/local/etc/rc.d/memcached start
Готово!
Использование Memcached в скриптах на Perl
Рассмотрим простейший скрипт:
#!/usr/bin/perl
# memcached-example.pl
# (c) Alexandr A Alexeev 2012 | http://eax.me/
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";
Запускаем скрипт:
Помимо чисел также можно хранить строки. Для хранения более сложных объектов требуется сериализация. Например, для сохранения массивов и хэшей можно воспользоваться
модулем JSON::XS .
Текстовый протокол Memcached
$ telnet localhost 11211
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; Как обычно, вопросы и указания на неточности приветствуются.
Источник: http://eax.me/memcached/