Кэширование данных
в web приложениях.
Использование
memcached
Краснощёк Юрий
Омнониевые
торсиометры
Каждый разработчик web приложений рано или
поздно сталкивается с довольно типичной
проблемой:
перед ним стоит задача построить фабрику
по производству омнониевых торсиометров.
Что делать?
Нужно применить типовую
схему фабрики по
производству торсиометров
Калибровка
для калибровки прибора
необходим чистый
омноний, за которым
приходится летать
Склад омнониума
Самое очевидное решение
проблемы - построить склад
рядом с фабрикой
Это не бесплатно
• Вырастает сложность
предприятия
• Нужно организовать
логистику
• Вести складской учет
Терминология
• Источник чистого
омнония - origin
• Cклад ограничен по
объему - cache size
• Поиск образца нужной
формы и породы - cache
hit / cache miss
Терминология
• Омнониум быстро
портится - freshness
• испорченным
омнониумом
торсиометры калибровать
нельзя - stale data
Терминология
• нужно проверить
пригодность - validation
• выбросить просроченный
омнониум со склада -
invalidation
Терминология
• Иногда случается обидная
ситуация: cклад
переполняется, и
приходится выбрасывать
ещё годный омнониум -
eviction
Браузер HTTP сервер
БэкендПрокси
Где кэшировать?
“Хорошие” данные
• Не кэшировать часто
изменяющиеся данные
• Кэшировать 20% данных,
которые используются
80% времени
• размер данных имеет
значение
Кандидаты на
кэширование
• Статика, картинки и
медиа
• Java script / CSS / HTML
• Объекты бизнес-логики
• Временные данные:
сессии, статистика
HTTP Headers
• Expires:
• Cache-Control:
• Last-Modified:
• Etag:
• Content-Length:
• Vary:
Expires
Время в формате HTTP-date,
до которого контент валиден
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Нужно использовать, как
fallback
Cache-Control
Новый механизм
управления кэшем
Cache-Control: max-age=3600,
must-revalidate, public
Cache-Control: no-cache
Cache-Control
• no-store указывает на то, что
данные нельзя кэшировать ни
при каких обстоятельствах
HTTP Headers
• Expires:
• Cache-Control:
• Last-Modified:
• Etag:
• Content-Length:
• Vary:
Кэш на стороне
бэкенда
• Бэкенд хранит копии
объектов из базы прямо в
коде
• Используется библиотека,
или компонент для
кэширования
Где хранить?
• Используется отдельный
кэширующий сервер, или
хранилище: memcached,
redis, hazelcast, etc.
• http://db-engines.com
Где хранить?
Когда нужен
кэширующий сервер
• доступ к данным из
разных мест
• availability
• масштабирование
noSQL - это хорошо
• Низкий latency
• Легко хранить плохо
структурированные,
разнородные данные
• Упрощается код
хранилища (уменьшается
риск порчи данных)
Memcached
• key value, поддерживает
freshness
• Фиксированный объем
памяти (-m)
• 16-тибитные флаги
• Работает в режиме LRU,
или консистентного кэша
Memcached
Лучшая документация - это
описание протокола
https://github.com/
memcached/memcached/
blob/master/doc/protocol.txt
Memcached
• get
• set / add / delete / replace
• prepend / append
• touch
• incr / decr
Memcached
• gets / cas
• ключ -C
Эффективное
использование
memcahed
• Много сессий
• Batch запросов
• Настройка потоков (-t)
• UDP
Статистика memcached
• Команда stats
• hits / misses
• evictions
• conn_yields прерывание
батча и ключ (-R)
Memcached slabs и LRU
96
120
…
1M
Head … Tail
Per-slab stats
• stats slabs
• stats items
Кластер memcached
• Клиент выбирает инстанс
(например libketama)
• Используется брокер
(например mcrouter)
Кластер memcached
• Выбор ноды для чтения,
или записи (hash %
num_nodes не работает)
• Consistent hashing ring
Спасибо
Краснощек Юрий
www.cachelot.io
cachelot@cachelot.io
@cachelot_io
Для презентации использованы иконки http://www.flaticon.com/

Кэширование данных в web приложениях. Использование memcached / Юрий Краснощек (Delphi LLC, Dell)