Нашел полезную статью про такого зверя как memcached. В последнее время о нем стали часто вспоминать во многих статьях и обзорах. Поэтому, представляю вашему вниманию краткое введение в основы Мemcached от создателя блога eax.me.
Memcached представляет собой сервер, хранящий в оперативной памяти некоторые
данные с заданным временем жизни. Доступ к данным осуществляется по ключу (имени). Вы можете думать о Memcached, как о хэш-таблице, хранящейся на сервере. Применяется он в основном для кэширования кода веб-страниц, результатов запросов к базе данных и тп.
Также ничто не мешает использовать Memcached в качестве «не очень надежного» key-value хранилища. Например, в нем можно хранить сессии пользователей, коды капч или счетчик посетителей, находящихся в данный момент на сайте.
Установка Memcached под FreeBSD
Memcached очень прост в установке и настройке. Например, чтобы поднять его под FreeBSD, достаточно выполнить следующие шаги. Ставим бинарный пакет с мемкэшом:
1 | pkg_add -r memcached |
В /etc/rc.conf пишем:
1 2 | memcached_enable="YES" memcached_flags="-l 127.0.0.1 -m 1024" |
Флагами мы говорим Memcached использовать не более 1 Гб памяти, а также принимать соединения только от приложений, запущенных на локалхосте. Запускаем сервер:
1 | /usr/local/etc/rc.d/memcached start |
Готово!
Использование Memcached в скриптах на Perl
Для работы с мемкэшом из Perl нам потребуется модуль Cache::Memcached:
1 | cpan -i Cache::Memcached |
Дополнение: См также Cache::Memcached::XS. Спасибо @xomaa за подсказку.
Рассмотрим простейший скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/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"; |
Запускаем:
1 2 | ./memcached.pl val = 128 |
Помимо чисел также можно хранить строки. Для хранения более сложных объектов требуется сериализация. Например, для сохранения массивов и хэшей можно воспользоваться модулем JSON::XS.
Текстовый протокол Memcached
Протокол, используемый Memcached, прост до безобразия:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ 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;
- Используется в LiveJournal, Mail.ru, Twitter, Wikipedia, YouTube, Typepad и многих других проектах;
А если у вас задача усилить не прикладную, а именно сетевую инфраструктуру, тогда вам стоит задуматься о приобретении роутера cisco2911/k9. Этот мощный инструмент позволит вашей сети выйти на новый уровень стабильности и управляемости. Продукты компании cisco давно зарекомендовали себя как надежные решения, которые выбирают профессионалы отрасли.
Leave a Reply
Using Gravatars in the comments - get your own and be recognized!
XHTML: These are some of the tags you can use:
<a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>