Разное

Memcached: a distributed memory object caching system

12.06.2021

Содержание

Кэширование и memcached / Хабр

Этим постом хочу открыть небольшую серию постов по материалам доклада на HighLoad++-2008. Впоследствии весь текст будет опубликован в виде одной большой PDF-ки.

Введение


Для начала, о названии серии постов: посты будут и о кэшировании в Web’е (в высоконагруженных Web-проектах), и о применении memcached для кэширования, и о других применениях memcached в Web-проектах. То есть все три составляющие названия в различных комбинациях будут освещены в этой серии постов.

Кэширование сегодня является неотъемлемой частью любого Web-проекта, не обязательно высоконагруженного. Для каждого ресурса критичной для пользователя является такая характеристика, как время отклика сервера. Увеличение времени отклика сервера приводит к оттоку посетителей. Следовательно, необходимо минимизировать время отклика: для этого необходимо уменьшать время, требуемое на формирование ответа пользователю, а ответ пользователю требует получить данные из каких-то внешних ресурсов (backend). Этими ресурсами могут быть как базы данных, так и любые другие относительно медленные источники данных (например, удаленный файловый сервер, на котором мы уточняем количество свободного места). Для генерации одной страницы достаточно сложного ресурса нам может потребоваться совершить десятки подобных обращений. Многие из них будут быстрыми: 20 мс и меньше, однако всегда существует некоторое небольшое количество запросов, время вычисления которых может исчисляться секундами или минутами (даже в самой оптимизированной системе один могут быть, хотя их количество должно быть минимально). Если сложить всё то время, которое мы затратим на ожидание результатов запросов (если же мы будем выполнять запросы параллельно, то возьмем время вычисления самого долгого запроса), мы получим неудовлетворительное время отклика.

Решением этой задачи является кэширование: мы помещаем результат вычислений в некоторое хранилище (например, memcached), которое обладает отличными характеристиками по времени доступа к информации.
Теперь вместо обращений к медленным, сложным и тяжелым backend’ам нам достаточно выполнить запрос к быстрому кэшу.

Memcached и кэширование


Принцип локальности


Кэш или подход кэширования мы встречаем повсюду в электронных устройствах, архитектуре программного обеспечения: кэш ЦП (первого и второго уровня), буферы жесткого диска, кэш операционной системы, буфер в автомагнитоле. Чем же определяется такой успех кэширования? Ответ лежит в принципе локальности: программе, устройству свойственно в определенный промежуток времени работать с некоторым подмножеством данных из общего набора. В случае оперативной памяти это означает, что если программа работает с данными, находящимися по адресу 100, то с большей степенью вероятности следующее обращение будет по адресу 101, 102 и т.п., а не по адресу 10000, например. То же самое с жестким диском: его буфер наполняется данными из областей, соседних по отношению к последним прочитанным секторам, если бы наши программы работали в один момент времени не с некоторым относительно небольшим набором файлов, а со всем содержимым жесткого диска, буферы были бы бессмысленны.
Буфер автомагнитолы совершает упреждающее чтение с диска следующих минут музыки, потому что мы, скорее всего, будем слушать музыкальный файл последовательно, чем перескакивать по набору музыки и т.п.

В случае web-проектов успех кэширования определяется тем, что на сайте есть всегда наиболее популярные страницы, некоторые данные используются на всех или почти на всех страницах, то есть существуют некоторые выборки, которые оказываются затребованы гораздо чаще других. Мы заменяем несколько обращений к backend’у на одно обращения для построения кэша, а затем все последующие обращения будет делать через быстро работающий кэш.

Кэш всегда лучше, чем исходный источник данных: кэш ЦП на порядки быстрее оперативной памяти, однако мы не можем сделать оперативную память такой же быстрой, как кэш – это экономически неэффективно и технически сложно. Буфер жесткого диска удовлетворяет запросы за данными на порядки быстрее самого жесткого диска, однако буфер не обладает свойством запоминать данные при отключении питания – в этом смысле он хуже самого устройства.

Аналогичная ситуация и с кэшированием в Web’е: кэш быстрее и эффективнее, чем backend, однако он обычно в случае перезапуска или падения сервера не может сохранить данные, а также не обладает логикой по вычислению каких-либо результатов: он умеет возвращать лишь то, что мы ранее в него положили.

Memcached


Memcached представляет собой огромную хэш-таблицу в оперативной памяти, доступную по сетевому протоколу. Он обеспечивает сервис по хранению значений, ассоциированных с ключами. Доступ к хэшу мы получаем через простой сетевой протокол, клиентом может выступать программа, написанная на произвольном языке программирования (существуют клиенты для C/C++, PHP, Perl, Java и т.п.).

Самые простые операции – получить значение указанного ключа (get), установить значение ключа (set) и удалить ключ (del). Для реализации цепочки атомарных операций (при условии конкурентного доступа к memcached со стороны параллельных процессов) используются дополнительные операции: инкремент/декремент значения ключа (incr/decr), дописать данные к значению ключа в начало или в конец (append/prepend), атомарная связка получения/установки значения (gets/cas) и другие.

Memcached был реализован Брэдом Фитцпатриком (Brad Fitzpatrick) в рамках работы над проектом ЖЖ (LiveJournal). Он использовался для разгрузки базы данных от запросов при отдаче контента страниц. Сегодня memcached нашел своё применение в ядре многих крупных проектов, например, Wikipedia, YouTube, Facebook и другие.

Общая схема кэширования


В общем случае схема кэширования выглядит следующим образом: frontend’у (той части проекта, которая формирует ответ пользователю) требуется получить данные какой-то выборки. Frontend обращается к быстрому как гепард серверу memcached за кэшом выборки (get-запрос). Если соответствующий ключ будет обнаружен, работа на этом заканчивается. В противном случае следует обращение к тяжелому, неповоротливому, но мощному (как слон) backend’у, в роли которого чаще всего выступает база данных. Полученный результат сразу же записывается в memcached в качестве кэша (set-запрос). При этом обычно для ключа задается максимальное время жизни (срок годности), который соответствует моменту сброса кэша.

Такая стандартная схема кэширования реализуется всегда. Вместо memcached в некоторых проектах могут использоваться локальные файлы, иные способы хранения (другая БД, кэш PHP-акселератора и т.п.) Однако, как будет показано далее, в высоконагруженном проекте данная схема может работать не самым эффективным образом. Тем не менее, в нашем дальнейшем рассказе мы будем опираться именно на эту схему.

Архитектура memcached


Каким же образом устроен memcached? Как ему удаётся работать настолько быстро, что даже десятки запросов к memcached, необходимых для обработки одной страницы сайта, не приводят к существенной задержке. При этом memcached крайне нетребователен к вычислительным ресурсам: на нагруженной инсталляции процессорное время, использованное им, редко превышает 10%.

Во-первых, memcached спроектирован так, чтобы все его операции имели алгоритмическую сложность O(1), т.е. время выполнения любой операции не зависит от количества ключей, которые хранит memcached. Это означает, что некоторые операции (или возможности) будут отсутствовать в нём, если их реализация требует всего лишь линейного (O(n)) времени.

Так, в memcached отсутствуют возможность объединения ключей «в папки», т.е. какой-либо группировки ключей, также мы не найдем групповых операций над ключами или их значениями.

Основными оптимизированными операциями является выделение/освобождение блоков памяти под хранение ключей, определение политики самых неиспользуемых ключей (LRU) для очистки кэша при нехватке памяти. Поиск ключей происходит через хэширование, поэтому имеет сложность O(1).

Используется асинхронный ввод-вывод, не используются нити, что обеспечивает дополнительный прирост производительности и меньшие требования к ресурсам. На самом деле memcached может использовать нити, но это необходимо лишь для использования всех доступных на сервере ядер или процессоров в случае слишком большой нагрузки – на каждое соединение нить не создается в любом случае.

По сути, можно сказать, что время отклика сервера memcached определяется только сетевыми издержками и практически равно времени передачи пакета от frontend’а до сервера memcached (RTT). Такие характеристики позволяют использовать memcached в высоконагруженных web-проектов для решения различных задач, в том числе и для кэширования данных.

Потеря ключей

Memcached не является надежным хранилищем – возможна ситуация, когда ключ будет удален из кэша раньше окончания его срока жизни. Архитектура проекта должна быть готова к такой ситуации и должна гибко реагировать на потерю ключей. Можно выделить три основных причины потери ключей:
  1. Ключ был удален раньше окончания его срока годности в силу нехватки памяти под хранение значений других ключей. Memcached использует политику LRU, поэтому такая потеря означает, что данный ключ редко использовался и память кэша освобождается для хранения более популярных ключей.
  2. Ключ был удален, так как истекло его время жизни. Такая ситуация строго говоря не является потерей, так как мы сами ограничили время жизни ключа, но для клиентского по отношению к memcached кода такая потеря неотличима от других случаев – при обращении к memcached мы получаем ответ «такого ключа нет».
  3. Самой неприятной ситуацией является крах процесса memcached или сервера, на котором он расположен. В этой ситуации мы теряем все ключи, которые хранились в кэше. Несколько сгладить последствия позволяет кластерная организация: множество серверов memcached, по которым «размазаны» ключи проекта: так последствия краха одного кэша будут менее заметны.

Все описанные ситуации необходимо иметь в виду при разработке программного обеспечения, работающего с memcached. Можно разделить данные, которые мы храним в memcached, по степени критичности их потери.

«Можно потерять». К этой категории относятся кэши выборок из базы данных. Потеря таких ключей не так страшна, потому что мы можем легко восстановить их значения, обратившись заново к backend’у. Однако частые потери кэшей приводят к излишним обращениям к БД.

«Не хотелось бы потерять». Здесь можно упомянуть счетчики посетителей сайта, просмотров ресурсов и т.п. Хоть и восстановить эти значения иногда напрямую невозможно, но значения этих ключей имеют ограниченный по времени смысл: через несколько минут их значение уже неактуально, и будет рассчитано новое значение.

«Совсем не должны терять». Memcached удобен для хранения сессий пользователей – все сессии равнодоступны со всех серверов, входящих в кластер frontend’ов. Так вот содержимое сессий не хотелось бы терять никогда – иначе пользователей на сайте будет «разлогинивать». Как попытаться избежать? Можно дублировать ключи сессий на нескольких серверах memcached из кластера, так вероятность потери снижается.

Memcached | Распределенное хранилище данных типа «ключ-значение» | AWS

Преимущества Memcached

Время отклика на уровне долей миллисекунды

Все данные Memcached хранятся в основной памяти сервера. В отличие от баз данных (таких как PostgreSQL, Cassandra и MongoDB, в которых данные хранятся преимущественно на дисках или твердотельных накопителях), хранилища данных в памяти не совершают постоянных циклических обращений к диску. Благодаря этому многократно увеличивается количество выполняемых операций и сокращается время отклика. Это обеспечивает исключительное быстродействие: время чтения и записи измеряется долями миллисекунды, и хранилище может выполнять миллионы операций в секунду.

Простота и удобство

Простота и универсальность делают Memcached мощным и очень удобным решением для разработки приложений. При работе с Memcached разработчики получают в распоряжение множество готовых клиентов с открытым исходным кодом. Поддерживаемые языки программирования включают Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, Go и многие другие.

Возможность масштабирования

Распределенная многопоточная архитектура упрощает масштабирование Memcached. Данные можно распределить между несколькими узлами, что позволяет наращивать ресурсы путем добавления в кластер новых узлов. Благодаря многопоточности Memcached также может использовать несколько ядер в одном узле. Это позволяет просто наращивать вычислительную мощность. С помощью Memcached можно создавать высокомасштабируемые распределенные решения для кэширования, обеспечивающие стабильную высокую производительность.

Memcached – качественный проект с открытым исходным кодом и активным сообществом поддержки. Использование Memcached для повышения производительности поддерживается в таких приложениях, как WordPress и Django. Поскольку Memcached базируется на открытых стандартах, поддерживает открытые форматы данных и имеет множество клиентов, это исключает привязку к определенному поставщику или технологии.

Модуль ngx_http_memcached_module

Модуль ngx_http_memcached_module

Модуль ngx_http_memcached_module позволяет получать ответ из сервера memcached. Ключ задаётся в переменной $memcached_key. Ответ в memcached должен быть предварительно помещён внешним по отношению к nginx’у способом.

Пример конфигурации
server {
    location / {
        set            $memcached_key "$uri?$args";
        memcached_pass host:11211;
        error_page     404 502 504 = @fallback;
    }

    location @fallback {
        proxy_pass     http://backend;
    }
}
Директивы
Синтаксис: memcached_bind адрес [transparent ] | off;
Умолчание:
Контекст: http, server, location

Эта директива появилась в версии 0. 8.22.

Задаёт локальный IP-адрес с необязательным портом (1.11.2), который будет использоваться в исходящих соединениях с сервером memcached. В значении параметра допустимо использование переменных (1.3.12). Специальное значение off (1.3.12) отменяет действие унаследованной с предыдущего уровня конфигурации директивы memcached_bind, позволяя системе самостоятельно выбирать локальный IP-адрес и порт.

Параметр transparent (1.11.0) позволяет задать нелокальный IP-aдрес, который будет использоваться в исходящих соединениях с сервером memcached, например, реальный IP-адрес клиента:

memcached_bind $remote_addr transparent;

Для работы параметра обычно требуется запустить рабочие процессы nginx с привилегиями суперпользователя. В Linux этого не требуется (1.13.8), так как если указан параметр transparent, то рабочие процессы наследуют capability CAP_NET_RAW из главного процесса. Также необходимо настроить таблицу маршрутизации ядра для перехвата сетевого трафика с сервера memcached.

Синтаксис: memcached_buffer_size размер;
Умолчание:
memcached_buffer_size 4k|8k;
Контекст: http, server, location

Задаёт размер буфера, в который будет читаться ответ, получаемый от сервера memcached. Ответ синхронно передаётся клиенту сразу же по мере его поступления.

Синтаксис: memcached_connect_timeout время;
Умолчание:
memcached_connect_timeout 60s;
Контекст: http, server, location

Задаёт таймаут для установления соединения с сервером memcached. Необходимо иметь в виду, что этот таймаут обычно не может превышать 75 секунд.

Синтаксис: memcached_force_ranges on | off;
Умолчание:
memcached_force_ranges off;
Контекст: http, server, location

Эта директива появилась в версии 1.7.7.

Включает поддержку диапазонов запрашиваемых байт (byte-range) для кэшированных и некэшированных ответов сервера memcached вне зависимости от наличия поля “Accept-Ranges” в заголовках этих ответов.

Синтаксис: memcached_gzip_flag флаг;
Умолчание:
Контекст: http, server, location

Эта директива появилась в версии 1. 3.6.

Включает проверку указанного флага в ответе сервера memcached и установку поля “Content-Encoding” заголовка ответа в “gzip”, если этот флаг установлен.

Синтаксис: memcached_next_upstream error | timeout | invalid_response | not_found | off ...;
Умолчание:
memcached_next_upstream error timeout;
Контекст: http, server, location

Определяет, в каких случаях запрос будет передан следующему серверу:

error
произошла ошибка соединения с сервером, передачи ему запроса или чтения заголовка ответа сервера;
timeout
произошёл таймаут во время соединения с сервером, передачи ему запроса или чтения заголовка ответа сервера;
invalid_response
сервер вернул пустой или неверный ответ;
not_found
сервер не нашёл ответ;
off
запрещает передачу запроса следующему серверу.

Необходимо понимать, что передача запроса следующему серверу возможна только при условии, что клиенту ещё ничего не передавалось. То есть, если ошибка или таймаут возникли в середине передачи ответа, то исправить это уже невозможно.

Директива также определяет, что считается неудачной попыткой работы с сервером. Случаи error, timeout и invalid_response всегда считаются неудачными попытками, даже если они не указаны в директиве. Случай not_found никогда не считается неудачной попыткой.

Передача запроса следующему серверу может быть ограничена по количеству попыток и по времени.

Синтаксис: memcached_next_upstream_timeout время;
Умолчание:
memcached_next_upstream_timeout 0;
Контекст: http, server, location

Эта директива появилась в версии 1. 7.5.

Ограничивает время, в течение которого возможна передача запроса следующему серверу. Значение 0 отключает это ограничение.

Синтаксис: memcached_next_upstream_tries число;
Умолчание:
memcached_next_upstream_tries 0;
Контекст: http, server, location

Эта директива появилась в версии 1.7.5.

Ограничивает число допустимых попыток для передачи запроса следующему серверу. Значение 0 отключает это ограничение.

Синтаксис: memcached_pass адрес;
Умолчание:
Контекст: location, if в location

Задаёт адрес сервера memcached. Адрес может быть указан в виде доменного имени или IP-адреса, и порта:

memcached_pass localhost:11211;

или в виде пути UNIX-сокета:

memcached_pass unix:/tmp/memcached.socket;

Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). И, кроме того, адрес может быть группой серверов.

Синтаксис: memcached_read_timeout время;
Умолчание:
memcached_read_timeout 60s;
Контекст: http, server, location

Задаёт таймаут при чтении ответа сервера memcached. Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями чтения. Если по истечении этого времени сервер memcached ничего не передаст, соединение закрывается.

Синтаксис: memcached_send_timeout время;
Умолчание:
memcached_send_timeout 60s;
Контекст: http, server, location

Задаёт таймаут при передаче запроса серверу memcached. Таймаут устанавливается не на всю передачу запроса, а только между двумя операциями записи. Если по истечении этого времени сервер memcached не примет новых данных, соединение закрывается.

Синтаксис: memcached_socket_keepalive on | off;
Умолчание:
memcached_socket_keepalive off;
Контекст: http, server, location

Эта директива появилась в версии 1.15.6.

Конфигурирует поведение “TCP keepalive” для исходящих соединений к серверу memcached. По умолчанию для сокета действуют настройки операционной системы. Если указано значение “on”, то для сокета включается параметр SO_KEEPALIVE.

Встроенные переменные
$memcached_key
Задаёт ключ для получения ответа из сервера memcached.

Установка и настройка Memcached в Ubuntu

Memcached — программное обеспечение, реализующее сервис кэширования данных в оперативной памяти на основе хеш-таблицы.

Также вы можете установить данное приложение при оформлении заказа в один клик.
Подробное описание данного One-Click-Apps

Memcached представляет собой сервер, хранящий в оперативной памяти некоторые данные с заданным временем жизни. Доступ к данным осуществляется по ключу (имени). Вы можете думать о Memcached, как о хэш-таблице, хранящейся на сервере. Применяется он в основном для кэширования кода веб-страниц, результатов запросов к базе данных и тп.

Перед установкой обновим систему:

# apt-get update && apt-get upgrade

Теперь используйте следующую команду для установки Memcached и модуля memcache для PHP:

# apt-get install memcached php5-memcache

Далее проверяем запустился ли демон

# netstat -tap | grep memcached
tcp 0 0 localhost:11211 *:* LISTEN 21488/memcached  

По умолчанию порт memcached 11211 с IP:127. 0.0.1 (localhost).

Также есть возможность отредактировать эти настройки, например вы хотите открыть доступ из внешнего IP, то нужно отредактировать файл настроек memcached — /etc/memcached.conf.

-l 127.0.0.1

параметр отвечает за IP адрес, который слушает демон memcached.

-m 256

параметр указывает сколько памяти выделить для кеширования в мегабайтах.

-p 11211

стандартный порт, который слушает демон memcached.

Далее требуется перегрузить веб сервер для подключения модуля memcache

/etc/init.d/apache2 restart

Или перезагрузить сам конфигурационный файл:

/etc/init.d/memcached restart

Настройка фаэрвола для Memcached

Добавьте следующие правила для разрешения соединения (для работы memcached):

iptables -A INPUT -p tcp --destination-port 11211 -m state --state NEW -m iprange --src-range 111. 161.1.10-111.161.1.15 -j ACCEPT  
iptables -A INPUT -p udp --destination-port 11211 -m state --state NEW -m iprange --src-range 111.161.1.10-111.161.1.15 -j ACCEPT  

открыть все исходящие порты

iptables -P OUTPUT ACCEPT  

открыть порт 80 для всех входящих соединений

iptables -A INPUT —dport 80 -j ACCEPT  

открыть 22 и 5432 порты только для конкретного IP

iptables -A INPUT -m multiport —dports 22,5432 -s IP_ADDRESS -j ACCEPT  

Установка и настройка memcached в CentOS 7 и Debian 9

Memchached — это популярный сервер кэширования данных в оперативной памяти. С помощью него можно существенно увеличить производительность различных веб-приложений. В CMS 1С-Битрикс вы можете хранить в нём кэш, он необходим (хоть и не обязателен) для действительно быстрой работы технологии «Композитный сайт», можно даже настроить хранение сессий Битрикса в memcached!

1. Установка сервиса memcached

Сама по себе установка Memcached не вызовет проблем. Вам достаточно выполнить такую команду:

Установка memcached в Centos 7

yum install memcached -y

Установка memcached в Debian 9

apt-get install memcached -y

Настройка memcached

Вся настройка выполняется через изменение файла конфигурации /etc/memcahced.conf. В этом файле содержаться опции, которые будут переданы сервису при запуске:

  • -d — работать в режиме сервиса;
  • -v — режим более подробного вывода информации;
  • -vv — ещё более подробный вывод информации;
  • -m — количество оперативной памяти, которую будет использовать сервис, рекомендую увеличить этот параметр, так как значения 64 мегабайта, установленных по умолчанию, будет мало;
  • -p — порт, на котором будет работать сервис;
  • -u — пользователь, от имени которого запущен сервис;
  • -l — IP-дрес, на котором Memcached будет ожидать соединения, лучше использовать 127. 0.0.1, чтобы из внешней сети ни у кого не было доступа к вашим данным;
  •  — количество одновременных подключений;
  • -P — путь к PID-файлу сервиса в файловой системе.

Таким образом, большинство опций можно оставить по умолчанию. Изменить нужно только объём оперативной памяти (не забудьте что оперативная память не бесконечная) и IP-адрес (но для Битрикса хватит и 127.0.0.1).
После изменения конфигурации не забудьте перезапустить сам сервис командой:

systemctl restart memcached

Сбор статистики использования memcached

Для просмотра статистики использования memcached необходимо в терминале ввести простую команду:
memcstat --servers="127.0.0.1"

Как видите установить и настроить memcached для работы совершенно не сложно. Осталось только выполнить настройки на стороне Битрикса: 

  1. Включить хранение сессий в memcached
  2. Настроить хранение файлов композита 1С-Битрикс на memcached

Почему Redis превосходит Memcached по кешированию

Memcached или Redis? Этот вопрос почти всегда возникает в любой дискуссии о повышении производительности современного веб-приложения, управляемого базой данных. Когда необходимо повысить производительность, кеширование часто является первым шагом, а Memcached или Redis — это обычно первые места, на которые нужно обратить внимание.

Эти известные механизмы кэширования имеют ряд общих черт, но у них также есть важные различия.Redis, более новый и универсальный из двух, почти всегда лучший выбор.

Redis и Memcached для кеширования

Начнем с общих черт. И Memcached, и Redis служат хранилищами данных «ключ-значение» в памяти, хотя Redis более точно описывается как хранилище структур данных. И Memcached, и Redis принадлежат к семейству решений для управления данными NoSQL, и оба основаны на модели данных «ключ-значение». Они оба хранят все данные в ОЗУ, что, конечно же, делает их чрезвычайно полезными в качестве уровня кэширования.С точки зрения производительности два хранилища данных также удивительно похожи, демонстрируя почти идентичные характеристики (и показатели) в отношении пропускной способности и задержки.

И Memcached, и Redis — зрелые и очень популярные проекты с открытым исходным кодом. Memcached был первоначально разработан Брэдом Фитцпатриком в 2003 году для веб-сайта LiveJournal. С тех пор Memcached был переписан на C (исходная реализация была на Perl) и помещен в общественное достояние, где он стал краеугольным камнем современных веб-приложений.Текущая разработка Memcached ориентирована на стабильность и оптимизацию, а не на добавление новых функций.

Redis был создан Сальваторе Санфилиппо в 2009 году, и сегодня Санфилиппо остается ведущим разработчиком проекта. Redis иногда называют «Memcached на стероидах», что неудивительно, учитывая, что некоторые части Redis были созданы с учетом уроков, извлеченных из использования Memcached. Redis имеет больше функций, чем Memcached, и поэтому он более мощный и гибкий.

Используемые многими компаниями и в бесчисленных критически важных производственных средах, Memcached и Redis поддерживаются клиентскими библиотеками на всех мыслимых языках программирования и включены во множество пакетов для разработчиков.Фактически, это редкий веб-стек, который не включает встроенную поддержку ни для Memcached, ни для Redis.

Почему так популярны Memcached и Redis? Они не только чрезвычайно эффективны, но и относительно просты. Начало работы с Memcached или Redis считается легкой работой для разработчика. Их настройка и подготовка к работе с приложением занимает всего несколько минут. Таким образом, небольшие затраты времени и усилий могут оказать немедленное драматическое влияние на производительность — обычно на порядки.Простое решение с огромной пользой; это настолько близко к магии, насколько это возможно.

Когда использовать Memcached

Memcached может быть предпочтительнее при кэшировании относительно небольших и статических данных, таких как фрагменты кода HTML. Управление внутренней памятью Memcached, хотя и не такое сложное, как у Redis, более эффективно в простейших случаях использования, поскольку оно потребляет сравнительно меньше ресурсов памяти для метаданных. Строки (единственный тип данных, поддерживаемый Memcached) идеально подходят для хранения данных, которые только читаются, поскольку строки не требуют дальнейшей обработки.

Большие наборы данных часто включают сериализованные данные, для хранения которых всегда требуется больше места. Хотя Memcached фактически ограничен хранением данных в их сериализованной форме, структуры данных в Redis могут хранить любой аспект данных изначально, тем самым снижая накладные расходы на сериализацию.

Второй сценарий, в котором Memcached имеет преимущество перед Redis, — это масштабирование. Поскольку Memcached является многопоточным, вы можете легко масштабировать его, предоставив ему больше вычислительных ресурсов, но вы потеряете часть или все кэшированные данные (в зависимости от того, используете ли вы согласованное хеширование).Redis, который в основном является однопоточным, может масштабироваться по горизонтали с помощью кластеризации без потери данных. Кластеризация — эффективное решение для масштабирования, но оно сравнительно сложнее в настройке и эксплуатации.

Когда использовать Redis

Вы почти всегда захотите использовать Redis из-за его структур данных. Используя Redis в качестве кеша, вы получаете большую мощность (например, возможность тонкой настройки содержимого и надежности кеша) и большую эффективность в целом. Как только вы используете структуры данных, повышение эффективности становится огромным для конкретных сценариев приложений.

Превосходство Redis очевидно почти во всех аспектах управления кешем. Кеши используют механизм, называемый вытеснением данных, чтобы освободить место для новых данных путем удаления старых данных из памяти. Механизм удаления данных Memcached использует алгоритм наименее недавно использованного и в некоторой степени произвольно удаляет данные, которые по размеру аналогичны новым данным.

Redis, напротив, обеспечивает детальный контроль над выселением, позволяя вам выбирать из шести различных политик выселения. Redis также использует более сложные подходы к управлению памятью и выбору кандидатов на вытеснение.Redis поддерживает как ленивое, так и активное выселение, при котором данные удаляются только тогда, когда требуется больше места, или заранее.

Redis дает вам гораздо большую гибкость в отношении объектов, которые вы можете кэшировать. В то время как Memcached ограничивает имена ключей до 250 байтов и работает только с простыми строками, Redis позволяет именам ключей и значениям быть размером до 512 МБ каждое, и они безопасны для двоичного кода. Кроме того, Redis имеет пять основных структур данных на выбор, открывая мир возможностей для разработчика приложений за счет интеллектуального кэширования и управления кэшированными данными.

Redis для сохранения данных

Использование структур данных Redis может упростить и оптимизировать несколько задач — не только при кэшировании, но даже если вы хотите, чтобы данные были постоянными и всегда доступными. Например, вместо хранения объектов в виде сериализованных строк разработчики могут использовать Redis Hash для хранения полей и значений объекта и управления ими с помощью одного ключа. Redis Hash избавляет разработчиков от необходимости извлекать всю строку, десериализовать ее, обновлять значение, повторно сериализовать объект и заменять всю строку в кеше новым значением для каждого тривиального обновления — это означает меньшее потребление ресурсов и повышение производительности.

Другие структуры данных, предлагаемые Redis (например, списки, наборы, отсортированные наборы, гиперлоги, растровые изображения и геопространственные индексы), могут использоваться для реализации еще более сложных сценариев. Сортированные наборы для приема и анализа данных временных рядов — еще один пример структуры данных Redis, которая предлагает значительно меньшую сложность и меньшее потребление полосы пропускания.

Еще одним важным преимуществом Redis является то, что данные, которые он хранит, непрозрачны, поэтому сервер может управлять ими напрямую. Значительная часть из 180 с лишним команд, доступных в Redis, посвящена операциям обработки данных и встраиванию логики в само хранилище данных с помощью сценариев Lua на стороне сервера.Эти встроенные команды и пользовательские сценарии позволяют гибко решать задачи обработки данных непосредственно в Redis без необходимости отправлять данные по сети в другую систему для обработки.

Redis предлагает дополнительную и настраиваемую постоянство данных, предназначенную для начальной загрузки кеша после запланированного завершения работы или незапланированного сбоя. Хотя мы склонны рассматривать данные в кэше как изменчивые и временные, сохранение данных на диске может быть весьма ценным в сценариях кэширования. Наличие данных кэша, доступных для загрузки сразу после перезапуска, позволяет значительно сократить время прогрева кэша и снимает нагрузку, связанную с повторным заполнением и пересчетом содержимого кеша из основного хранилища данных.

Redis Репликация данных в памяти

Redis также может реплицировать данные, которыми он управляет. Репликация может использоваться для реализации высокодоступной настройки кэша, которая может выдерживать сбои и обеспечивать бесперебойное обслуживание приложения. Отказ кэша лишь немного уступает отказу приложения с точки зрения влияния на взаимодействие с пользователем и производительность приложений, поэтому наличие проверенного решения, которое гарантирует содержимое кэша и доступность услуг, является главным преимуществом в большинстве случаев.

И последнее, но не менее важное, с точки зрения операционной видимости, Redis предоставляет множество показателей и множество интроспективных команд, с помощью которых можно отслеживать и отслеживать использование и ненормальное поведение. Статистика в реальном времени по каждому аспекту базы данных, отображение всех выполняемых команд, список и управление клиентскими подключениями — в Redis есть все это и многое другое.

Когда разработчики осознают эффективность персистентности и возможностей репликации в памяти Redis, они часто используют ее в качестве базы данных первого респондента, как правило, для анализа и обработки данных с высокой скоростью и предоставления ответов пользователю в то время как вторичный (часто более медленный) база данных хранит исторические записи о том, что произошло.При таком использовании Redis также может быть идеальным вариантом для использования в аналитике.

Redis для анализа данных

На ум сразу приходят три сценария аналитики. В первом сценарии при использовании чего-то вроде Apache Spark для итеративной обработки больших наборов данных вы можете использовать Redis в качестве уровня обслуживания для данных, ранее рассчитанных Spark. Во втором сценарии использование Redis в качестве общего распределенного хранилища данных в памяти может повысить скорость обработки Spark в 45–100 раз. Наконец, очень распространенный сценарий — это сценарий, в котором отчеты и аналитика должны настраиваться пользователем, но получение данных из изначально пакетных хранилищ данных (таких как Hadoop или СУБД) занимает слишком много времени. В этом случае хранилище структуры данных в памяти, такое как Redis, является единственным практическим способом получить субмиллисекундное время подкачки и ответа.

При использовании очень больших наборов операционных данных или аналитических рабочих нагрузок запуск всего в памяти может оказаться неэффективным. Чтобы достичь производительности менее миллисекунды при меньших затратах, Redis Labs создала версию Redis, которая работает на комбинации ОЗУ и флэш-памяти, с возможностью настройки соотношения ОЗУ и флэш-памяти.Хотя это открывает несколько новых возможностей для ускорения обработки рабочих нагрузок, это также дает разработчикам возможность просто запускать свой «кэш на флэш-памяти».

Программное обеспечение с открытым исходным кодом продолжает предоставлять одни из лучших технологий, доступных сегодня. Когда дело доходит до повышения производительности приложений за счет кэширования, Redis и Memcached являются наиболее признанными и проверенными в производстве кандидатами. Однако, учитывая более богатую функциональность Redis, более продвинутый дизайн, множество потенциальных применений и большую экономическую эффективность при масштабировании, Redis должен быть вашим первым выбором почти в каждом случае.

Итамар Хабер (@itamarhaber) — главный защитник разработчиков в Redis Labs, которая предлагает Memcached и Redis в качестве полностью управляемых облачных сервисов для разработчиков. Его разнообразный опыт включает разработку и управление программными продуктами, а также руководящие должности в Xeround, Etagon, Amicada и MNS Ltd. Итамар имеет степень магистра делового администрирования по совместной программе Kellogg-Recanati Северо-Западного и Тель-Авивского университетов, а также степень бакалавра. наук в области компьютерных наук.

Форум новых технологий предоставляет площадку для изучения и обсуждения новых корпоративных технологий с беспрецедентной глубиной и широтой. Выбор является субъективным и основан на нашем выборе технологий, которые мы считаем важными и представляющими наибольший интерес для читателей InfoWorld. InfoWorld не принимает маркетинговые материалы для публикации и оставляет за собой право редактировать весь предоставленный контент. Все запросы отправляйте на [email protected].

Авторские права © IDG Communications, Inc., 2017.

Что такое Memcached? — Поддержка KeyCDN

Обновлено 4 октября 2018 г.

Наличие надлежащих механизмов кэширования — одна из самых важных вещей, которые вы можете сделать, чтобы ускорить доставку ресурсов вашего веб-сайта. Кэширование гарантирует, что активы хранятся где-то ближе к пользователю, чтобы минимизировать задержку, вызванную расстоянием. Узнайте больше о тонкостях кэширования, ознакомившись с нашим руководством по определению и объяснению кеша.

Если вы изучаете, какие варианты доступны при выборе системы кэширования, возможно, вы встречали Memcached. Этот пост будет посвящен объяснению, что такое Memcached, как он работает и как вы можете установить его, чтобы ускорить работу ваших динамических веб-приложений.

Что такое Memcached?

Memcached — это система кэширования распределенной памяти с открытым исходным кодом. Он используется для ускорения динамических веб-приложений за счет уменьшения нагрузки на базу данных. Другими словами, каждый раз, когда делается запрос к базе данных, он добавляет дополнительную нагрузку на сервер. Memcached снижает эту нагрузку, сохраняя объекты данных в динамической памяти (воспринимайте ее как краткосрочную память для приложений).Memcached хранит данные на основе пар «ключ-значение» для небольших произвольных строк или объектов, включая:

  • Результаты вызовов базы данных
  • Вызовы API
  • Отрисовка страницы

Memcached состоит из четырех основных компонентов. Эти компоненты позволяют клиенту и серверу работать вместе для максимально эффективной доставки кэшированных данных:

  1. Клиентское программное обеспечение — которому дан список доступных серверов Memcached
  2. Клиентский алгоритм хеширования — Выбирает сервер на основе «ключа»
  3. Серверное программное обеспечение — Сохраняет значения и их ключи во внутренней хэш-таблице
  4. LRU — Определяет, когда выбросить старые данные или повторно использовать память

Как работает Memcached?

Как упоминалось выше, Memcached состоит из четырех основных компонентов, и именно эти компоненты позволяют ему хранить и извлекать данные. Каждый элемент состоит из ключа , срока действия и необработанных данных . На высоком уровне Memcached работает следующим образом:

  1. Клиент запрашивает часть данных, которые Memcached проверяет, хранятся ли они в кэше.
  2. Здесь есть два возможных результата:
    1. Если данные хранятся в кеше: вернуть данные из Memcached (нет необходимости проверять базу данных).
    2. Если данные не хранятся в кэше: запросите базу данных, получите данные и впоследствии сохраните их в Memcached.
  3. Каждый раз при изменении информации или истечении срока действия элемента Memcached обновляет свой кэш, чтобы гарантировать доставку нового содержимого клиенту.

Типичная установка включает различные серверы Memcached и множество клиентов. Клиенты используют алгоритм хеширования, чтобы определить, какой сервер хранения Memcached использовать — это помогает распределить нагрузку. Затем сервер вычисляет второй хэш ключа, чтобы определить, где ему следует сохранить соответствующее значение во внутренней хеш-таблице. Вот несколько важных моментов об архитектуре Memcached:

  • Данные отправляются только на один сервер.
  • Серверы не обмениваются данными.
  • Серверы хранят значения в ОЗУ. Если RAM заканчивается, самое старое значение отбрасывается.

Установка Memcached

Есть несколько способов установить Memcached. В зависимости от того, какую систему вы используете, метод будет отличаться. Как указано в официальной вики установки Memcached, установка из пакета проста.Если вы используете Debian или Ubuntu, используйте следующий фрагмент:

  apt-get install memcached
  

Для пользователей Redhat / Fedora используйте следующее:

  yum install memcached
  

Есть несколько других способов установки Memcached, которые вы можете рассмотреть в зависимости от ваших требований, как указано в Wiki. Если вы хотите узнать больше о настройке, использовании и обслуживании Memcached, настоятельно рекомендуется ознакомиться с их полной Wiki, размещенной на GitHub.

Сводка

Memcached существует некоторое время (с 2003 г.) и до сих пор используется для ускорения запросов к базе данных для динамических приложений. Если время загрузки является для вас приоритетом (а оно должно быть) и вы хотите реализовать проверенное решение кеширования для своего приложения, подумайте о том, чтобы попробовать Memcached.

Обзор Memorystore для Memcached | Google Cloud

На этой странице представлена ​​служба Memorystore для Memcached, включая варианты использования, ключевые концепции и преимущества использования Memcached.

Memorystore for Memcached — это хорошо масштабируемая, полностью управляемая служба Memcached для Google Cloud. Служба построена на базе Memcached с открытым исходным кодом и совместима с двоичным кодом и протоколом ASCII. Доступ к этой службе можно получить с помощью стандартных клиентских библиотек OSS Memcached на всех языках, что позволяет легко поднимать и переносить существующие приложения практически без изменений кода.

Высокопроизводительные масштабируемые веб-приложения часто используют распределенное хранилище данных в памяти для достижения низкой задержки и высокой производительности.Memcached — это популярное распределенное хранилище ключей в памяти, используемое для создания таких приложений. Некоторые из распространенных вариантов использования Memcached включают кеширование справочных данных, кеширование запросов к базе данных и, в некоторых случаях, использование в качестве хранилища сеансов.

Чтобы узнать больше о Memcached, см. Страницу о программном обеспечении с открытым исходным кодом (OSS), посвященном Memcached.

Memorystore также упрощает развертывание службы Memcached. Вы развертываете Memorystore, а Google управляет службой за вас, чтобы вы могли сосредоточиться на своем приложении.Memorystore дает вам все преимущества Memcached без дополнительных затрат на его установку и управление.

Ключевые концепции

Memorystore for Memcached позволяет создать полностью управляемый кластер Memcached. Перед использованием сервиса важно понять некоторые ключевые понятия и термины.

  • Экземпляр Memcached представляет один экземпляр кластера Memcached. Экземпляр может состоять из одного узла или набора узлов. Все узлы в экземпляре должны иметь одинаковую память на узел и одинаковое количество виртуальных ЦП.Ключи, записанные в ваш экземпляр, распределяются между всеми узлами в вашем кластере и не реплицируются.

  • Узел Memcached — это основная единица экземпляра Memcached. Перед созданием кластера важно определить количество узлов, объем памяти на узел и количество виртуальных ЦП на узел, которые будут использоваться для создания кластера Memcached. Конфигурация узла и количество узлов зависит от размера набора данных, допуска к потере ключа и характеристик рабочей нагрузки.У каждого узла есть IP-адрес и порт. Вы можете получить список IP-адресов всех узлов вручную или с помощью службы Auto Discovery.

  • Расположение позволяет указать регион, в котором вы развертываете свой экземпляр, и то, как узлы распределяются по зонам внутри региона.

    При создании экземпляра Memorystore сначала выберите регион, в котором будет развернут экземпляр. Выбор региона — важное соображение. Вы должны развернуть экземпляр в том же регионе, где развернуто приложение, обращающееся к экземпляру Memorystore.Доступ к экземпляру Memorystore из ресурса Google Cloud в другом регионе не поддерживается.

    Все узлы Memorystore распределены в пределах указанного вами региона. Внутри региона у вас есть возможность автоматически распределить узлы по всем зонам или выбрать определенные зоны, в которых они должны быть расположены. Мы рекомендуем автоматически распределять узлы, чтобы позволить Memorystore оптимально распределять узлы в доступных зонах. Вам следует избегать инициализации всех узлов в одной зоне, чтобы повысить отказоустойчивость вашего приложения.

  • Авторизованная сеть VPC указывает, какую сеть Google VPC использует ваш экземпляр. Авторизованная сеть устанавливается во время создания экземпляра и не может быть изменена позже. Для работы с Memorystore для Memcached в сети VPC необходимо установить соединение для доступа к частным службам. Только ресурсы и пользователи, имеющие доступ к авторизованной сети VPC, могут получить доступ к экземпляру.

  • Доступ к частным службам необходимо установить соединение для авторизованной сети VPC, которую использует экземпляр Memcached, прежде чем вы сможете создать экземпляр Memcached.Мы рекомендуем вам связаться с вашей группой по сети / безопасности для настройки соединения перед созданием экземпляра. Соединение для доступа к частным службам позволяет создавать экземпляры с использованием внутренних IP-адресов и предоставляет администраторам контроль над диапазоном внутренних IP-адресов, используемых экземплярами Memorystore. Для получения дополнительной информации см. Сеть.

  • Конфигурации позволяют устанавливать определенные конфигурации Memcached во время создания экземпляра, а также позволяют изменять конфигурации во время выполнения. Список поддерживаемых конфигураций см. В разделе Конфигурации Memcache.

  • Служба автоматического обнаружения предоставляет клиентам Memcached программный способ обнаружения всех узлов в кластере. Клиенты могут периодически запрашивать конечную точку обнаружения, чтобы получить список IP-адресов узлов. Список обычно используется для распределения ключей по всем узлам с использованием согласованного хеширования. Использование службы Auto Discovery особенно полезно для сред, в которых периодически увеличивается количество узлов в экземпляре.Дополнительные сведения см. В разделе Служба автоматического обнаружения.

В следующей таблице представлены различные функции и возможности, доступные Memorystore для Memcached:

Функции и возможности Описание
Версия Memcached В настоящее время сервис поддерживает версию 1.5.16
Размер экземпляра Экземпляр может иметь максимум 20 узлов. Все узлы имеют одинаковую конфигурацию.Узел может иметь минимум 1 виртуальный ЦП и максимум 32 виртуальных ЦП. Минимальный объем памяти на узел составляет 1 ГБ, а максимальный поддерживаемый объем памяти на узел — 256 ГБ. Память может быть указана с шагом 1 ГБ. Максимальный размер экземпляра — 5 ТБ.
Масштабирование экземпляра Вы можете масштабировать экземпляр по горизонтали, увеличивая или уменьшая количество узлов. Вертикальное масштабирование ваших узлов требует воссоздания экземпляра.
Конфигурации Memcached Вы можете настроить экземпляр для своей конкретной рабочей нагрузки.Список конфигураций см. В разделе Конфигурации Memcached.
Безопасность и контроль доступа
  • Доступ к экземпляру ограничен клиентами, подключенными к VPC вашего проекта. Сеть. Если экземпляр использует общую сеть VPC, все клиенты в Общая сеть VPC может получить доступ к экземпляру.
  • Аутентификация на уровне экземпляра недоступна.
  • Операции администратора контролируются с помощью ролей управления идентификацией и доступом, перечисленных на Контроль доступа страница.
Опора платформы Доступ к Memorystore для Memcached можно получить со следующих платформ.

Поддерживаемые платформы:


Не поддерживается:
Клиентские библиотеки Поддерживаются все стандартные клиентские библиотеки Memcached на всех языках.
Сервис Auto Discovery Включает программное обнаружение узлов в экземпляре. Поддержка автоматического обнаружения в настоящее время доступна в следующих клиентах:

Вы также можете изменить любые существующие клиенты Memcached, чтобы добавить автоматическое обнаружение служба поддержки.Для получения дополнительной информации см. Сервис Auto Discovery.

Служба Auto Discovery также совместима с большинством клиентов, поддерживающих Автоматическое обнаружение AWS Elasticache.

Мониторинг Memorystore для Memcached предоставляет метрики и информационные панели в облачной консоли для мониторинга экземпляра. Дополнительные сведения см. В разделе Мониторинг экземпляров Memcached.

Что дальше

Обзор

Memcache | Стандартная среда App Engine для Python 2

Python 2.7/3 | Java 8/11 | PHP 5/7 | Рубин | Вперед 1.11 / 1.12+ | Node.js

На этой странице представлен обзор службы кэша памяти App Engine. Высокая веб-приложения с масштабируемой производительностью часто используют распределенные данные в памяти кэш перед или вместо надежного постоянного хранилища для некоторых задач. Приложение Для этой цели Engine включает службу кеширования памяти. Чтобы узнать, как настраивать, контролировать и использовать службу memcache, прочтите Использование Memcache.

Примечание: Кэш является глобальным и используется во внешнем интерфейсе приложения, backend, а также все его сервисы и версии. Это решение больше не рекомендуется: На этой странице описано, как использовать устаревшая служба App Engine. Приложения, использующие эту службу, могут работать только в Среда выполнения Python 2 и ее необходимо обновить до рекомендуемое решение перед переходом на Python 3 время выполнения.

Когда использовать кэш памяти

Одно из применений кеш-памяти — ускорение общих запросов к хранилищу данных. Если многие запросы выполняют один и тот же запрос с теми же параметрами и изменяют результаты не обязательно должны сразу появляться на сайте, приложение может кэшировать результаты в кэше памяти.Последующие запросы могут проверять кэш памяти, и выполнять запрос к хранилищу данных только в том случае, если результаты отсутствуют или просрочены. Данные сеанса, пользовательские настройки и другие данные, возвращаемые запросами для веб-страниц. являются хорошими кандидатами для кеширования.

Memcache может быть полезен для других временных значений. Однако при рассмотрении следует ли хранить значение исключительно в кэше памяти и не поддерживаться другими постоянное хранилище, убедитесь, что ваше приложение ведет себя приемлемо, когда значение внезапно недоступно.Значения могут истечь из кэша памяти в любой момент. время, и срок его действия может быть истек до истечения крайнего срока, установленного для значения. Для Например, если внезапное отсутствие данных сеанса пользователя приведет к тому, что сеанс в случае неисправности эти данные, вероятно, должны быть дополнительно сохранены в хранилище данных. в кэш памяти.

Уровни обслуживания

App Engine поддерживает два уровня службы memcache:

  • Общий кэш памяти — это бесплатный доступ по умолчанию для приложений App Engine. Это обеспечивает емкость кеш-памяти по принципу «максимальных усилий» и зависит от общей потребность всех приложений App Engine, использующих общую службу memcache.

  • Выделенный кэш памяти обеспечивает фиксированную емкость кэша, назначенную исключительно к вашему приложению. Он оплачивается по ГБ-часу размера кеша и требует выставление счетов для включения. Наличие контроля над размером кеша означает, что ваше приложение может работают более предсказуемо и с меньшим количеством чтений из более дорогостоящих и надежных место хранения.

Оба уровня обслуживания memcache используют один и тот же API. Чтобы настроить службу memcache для вашего приложения см. Использование Memcache.

Примечание: Кэш памяти не является надежным хранилищем, независимо от того, является ли он общим или выделенным. Ключи могут быть удаляется при заполнении кеша в соответствии с политикой LRU кеша. Изменения в конфигурации кеша или событиях обслуживания центра обработки данных также могут сбрасывать некоторые или весь кеш.

В следующей таблице приведены различия между двумя классами. службы memcache:

Элемент Выделенный кэш памяти Общий кэш памяти
Цена 0 руб.06 за ГБ в час Бесплатно
Вместимость
центральный нас
от 1 до 100 ГБ
другие регионы
от 1 до 20 ГБ
Нет гарантированной вместимости
Производительность До 10 тыс. Операций чтения или 5 тыс. Операций записи (исключая) в секунду на 1 ГБ (элементы < 1 КБ). Дополнительные сведения см. В разделе Статистика кеша. Не гарантируется
Магазин длительного пользования
SLA Нет Нет

Плата за выделенный кэш памяти взимается с шагом 15 минут.6 байтов).

  • Ключ не может быть больше 250 байт. В среде выполнения Python ключи, которые являются строками более 250 байт будут хешированы. (Другие среды выполнения ведут себя иначе.)
  • «Многоканальные» пакетные операции могут иметь любое количество элементов. Общий размер вызова и общий размер извлекаемых данных не должен превышать 32 мегабайты.
  • Ключ кэша памяти не может содержать нулевой байт.
  • Срок действия кэшированных данных

    Memcache содержит пары ключ / значение.Пары в памяти в любой момент меняются как элементы записываются и извлекаются из кеша.

    По умолчанию значения, хранящиеся в кэше памяти, сохраняются как можно дольше. Значения может быть исключен из кеша, когда новое значение добавляется в кеш и в кэше мало памяти. Когда значения вытесняются из-за нехватки памяти, в первую очередь удаляются наименее использованные значения.

    Приложение может указать время истечения срока хранения значения в виде количество секунд относительно того, когда значение добавлено, или как абсолютное значение Unix эпоха в будущем (количество секунд от полуночи 1 января, 1970). Стоимость выселена не позднее этого времени, но может быть выселены ранее по другим причинам. Увеличение значения, сохраненного для существующего ключ не обновляет время истечения срока действия.

    В редких случаях значения также могут исчезнуть из кеша до истечение срока по причинам, отличным от нехватки памяти. Пока кэш памяти устойчив при сбоях сервера значения memcache не сохраняются на диск, поэтому сбой службы может стать причиной недоступности значений.

    В общем, приложение не должно ожидать, что кешированное значение всегда будет имеется в наличии.

    Вы можете стереть весь кеш приложения через API или в кэше памяти. раздел Google Cloud Console.

    Примечание: Фактическое удаление просроченных данных кэша выполняется лениво. Просроченный элемент удаляется, когда кто-то безуспешно пытается его получить. В качестве альтернативы, истекшие данные кэша выпадают из кеша в соответствии с поведением кэша LRU, который применяется ко всем предметам, как действующим, так и просроченным. Это означает, что когда кеш размер указывается в статистике, в число могут входить как действующие, так и просроченные предметы.

    Статистика кеша

    Операций в секунду по размеру элемента

    Примечание: Эта информация относится только к выделенному кэшу памяти.

    Выделенный кэш памяти оценивается в операциях в секунду на ГБ, где операция определяется как доступ к отдельному элементу кеша, например, get , установить , или удалить . Скорость работы зависит от размера товара. примерно по следующей таблице. Превышая эти рейтинги могут привести к увеличению задержки API или ошибкам.

    В следующих таблицах указано максимальное количество устойчивых эксклюзивных get-hit или задают операций на 1 ГБ кеш-памяти. Обратите внимание, что операция get-hit это вызов get , который обнаруживает, что существует значение, сохраненное с указанным ключом, и возвращает это значение.

    Размер элемента (КБ) Максимум Get-Hit ops / s Максимальный набор операций / с
    ≤1 10 000 5 000
    100 2 000 1 000 90 248
    512 500 250

    Приложение, настроенное на несколько ГБ кеш-памяти, теоретически может достичь совокупного скорость работы вычисляется как количество ГБ, умноженное на скорость за ГБ.Например, приложение, настроенное на 5 ГБ кеш-памяти, может достичь 50 000 кешей памяти. операций / сек для элементов размером 1 КБ. Достижение этого уровня требует хорошей раздачи. нагрузки через пространство ключей кэша памяти.

    Для каждого шаблона ввода-вывода указанные выше ограничения относятся к показаниям или . пишет. Для одновременных чтений и записи ограничения находятся на скользящем шкала. Чем больше операций чтения выполняется, тем меньше операций записи может быть выполнено. выполняется, и наоборот. Каждое из следующих значений — это пример IOP. ограничения на одновременное чтение и запись значений размером 1 КБ на 1 ГБ кеш-памяти:

    Чтение операций ввода-вывода в секунду Запись операций ввода-вывода в секунду
    10000 0
    8000 1000
    5000 2500
    1000 4500
    0 5000

    Вычислительные блоки Memcache (MCU)

    Примечание: Эта информация относится только к выделенному кэшу памяти. Пропускная способность

    Memcache может варьироваться в зависимости от размера элемента, к которому вы обращаетесь. и операцию, которую вы хотите выполнить с элементом. Вы можете примерно связать стоить с операциями и оценить пропускную способность трафика, которую вы можете ожидать от выделенный кэш памяти с использованием модуля, называемого Memcache Compute Unit (MCU). MCU — это определены таким образом, что вы можете ожидать 10 000 MCU в секунду на 1 ГБ выделенного кэш памяти. Консоль Google Cloud показывает, сколько MCU в настоящее время использует ваше приложение.

    Обратите внимание, что MCU — это приблизительная статистическая оценка, а также не линейная Блок.Каждая операция кеширования, которая читает или записывает значение, имеет соответствующий MCU. Стоимость, которая зависит от размера стоимости. MCU для набора зависит от размер значения: это в 2 раза превышает стоимость успешной операции get-hit .

    Примечание: Способ, которым Memcache Compute Units (MCU) могут быть изменены. Стоимость Стоимость
    Размер элемента значения (КБ) MCU для get-hit MCU для набора
    ≤1 1.0 2,0
    2 1,3 2,6
    10 1,7 3,4
    100 5,0 10,0
    512 20,0 40,0
    1024 50,0 100,0

    Операции, которые не читают и не записывают значение, имеют фиксированную стоимость MCU:

    Эксплуатация MCU
    Get-Miss 1.0
    удалить 2,0
    шаг 2,0
    заподлицо 100,0
    статистика 100,0

    Обратите внимание, что операция get-miss — это операция get , которая обнаруживает, что значение отсутствует хранится с указанным ключом.

    Сравнить и установить

    «Сравнить и установить» — это функция, которая позволяет выполнять несколько запросов. обрабатывается одновременно для атомарного обновления значения одного и того же ключа кэша памяти, избегая условий гонки.

    Примечание: Для полного обсуждения функции сравнения и установки для Python см. Сообщение в блоге Гвидо ван Россума Сравнить-и-установить в Memcache.

    Ключевые логические компоненты сравнения и установки

    Если вы обновляете значение ключа кэша памяти, который может получить другой одновременных запросов на запись, вы должны использовать объект memcache Client , который хранит определенную информацию о состоянии, используемую методами которые поддерживают сравнить и установить. Вы не можете использовать функции memcache get () или set () , потому что они не имеют состояния. Сам класс Client не является потокобезопасный, поэтому вам не следует использовать один и тот же объект Client более чем в одном нить.

    Когда вы извлекаете ключи, вы должны использовать методы memcache Client , которые поддерживают сравнить и установить: gets () или get_multi () с параметром for_cas , установленным на Правда .

    При обновлении ключа необходимо использовать методы memcache Client , которые поддерживают сравните и установите: cas () или cas_multi () .

    Другой ключевой логический компонент — это служба кэша памяти App Engine и ее поведение в отношении сравнения и набора. Сам сервис memcache в App Engine ведет себя атомарно. То есть, когда два параллельных запроса (для одного и того же идентификатора приложения) использовать memcache, они перейдут к тому же экземпляру службы memcache, а Служба memcache имеет достаточную внутреннюю блокировку, так что одновременные запросы для тот же ключ правильно сериализован. В частности, это означает, что два cas () запросы на один и тот же ключ фактически не выполняются параллельно — служба обрабатывает первый поступивший запрос до завершения (то есть обновление значения и timestamp) перед тем, как он начнет обрабатывать второй запрос.

    Чтобы узнать, как использовать сравнение и установить в Python, прочтите Обработка одновременных записей.

    Лучшие практики

    Ниже приведены некоторые рекомендации по использованию memcache:

    • Изящно обрабатывать сбои API memcache. Операции с Memcache могут завершиться ошибкой по разным причинам. Приложения должны быть разработаны так, чтобы ловить неудачные операций, не подвергая эти ошибки конечным пользователям. Это руководство особенно относится к операциям Set.

    • По возможности используйте возможность дозирования API , особенно для мелкие предметы.Это повысит производительность и эффективность вашего приложение.

    • Распределите нагрузку по пространству ключей вашего кэша памяти. Имея одиночный или малый набор элементов кэша памяти представляет непропорционально большой объем трафика, препятствовать масштабированию вашего приложения. Это руководство применимо к обеим операциям в секунду. и пропускная способность. Эту проблему часто можно решить, явным образом сегментируя ваши данные.

      Например, вы можете разделить часто обновляемый счетчик между несколько ключей, считывая их и суммируя только тогда, когда вам нужна сумма.Точно так же вы можете разделить 500 КБ данных, которые должны быть прочитаны на каждом HTTP-запрос по нескольким ключам и считывание их с помощью одного пакета Вызов API. (Еще лучше было бы кэшировать значение в памяти экземпляра.) Для выделенного кэша памяти пиковая скорость доступа для одного ключа должна быть 1-2. на несколько порядков меньше, чем рейтинг на гигабайт.

    Что дальше

    Эффективное кэширование в распределенных приложениях — Real Python

    При написании приложений Python важно кэширование.Использование кеша, чтобы избежать повторного вычисления данных или доступа к медленной базе данных, может значительно повысить производительность.

    Python предлагает встроенные возможности для кэширования, от простого словаря до более полной структуры данных, такой как functools.lru_cache . Последний может кэшировать любой элемент, используя алгоритм Least-Recently Used для ограничения размера кеша.

    Эти структуры данных, однако, по определению являются локальными для вашего процесса Python. Когда несколько копий вашего приложения работают на большой платформе, использование структуры данных в памяти запрещает совместное использование кэшированного содержимого. Это может быть проблемой для крупномасштабных и распределенных приложений.

    Следовательно, когда система распределена по сети, ей также требуется кэш, который распределен по сети. В настоящее время существует множество сетевых серверов, предлагающих возможность кэширования — мы уже рассмотрели, как использовать Redis для кэширования с Django.

    Как вы увидите в этом руководстве, memcached — еще один отличный вариант для распределенного кэширования. После краткого введения в основы использования memcached вы узнаете о расширенных шаблонах, таких как «кэширование и установка», а также об использовании резервных кешей, чтобы избежать проблем с производительностью холодного кеша.

    Установка memcached

    Memcached доступен для многих платформ:

    • Если вы используете Linux , вы можете установить его с помощью apt-get install memcached или yum install memcached . Это установит memcached из предварительно созданного пакета, но вы также можете собрать memcached из исходного кода, как описано здесь.
    • Для macOS использование Homebrew — самый простой вариант. Просто запустите brew install memcached после установки диспетчера пакетов Homebrew.
    • В Windows вам придется скомпилировать memcached самостоятельно или найти предварительно скомпилированные двоичные файлы.

    После установки memcached можно просто запустить, вызвав команду memcached :

    Прежде чем вы сможете взаимодействовать с memcached из Python-land, вам необходимо установить клиентскую библиотеку memcached . Вы увидите, как это сделать, в следующем разделе вместе с некоторыми основными операциями доступа к кешу.

    Сохранение и получение кэшированных значений с использованием Python

    Если вы никогда не использовали memcached , это довольно легко понять.По сути, это огромный словарь, доступный в сети. Этот словарь имеет несколько свойств, которые отличаются от классического словаря Python, в основном:

    • Ключи и значения должны быть байтами
    • Ключи и значения автоматически удаляются по истечении времени

    Следовательно, две основные операции для взаимодействия с memcached : set и get . Как вы могли догадаться, они используются для присвоения значения ключу или для получения значения из ключа соответственно.

    Моя любимая библиотека Python для взаимодействия с memcached pymemcache — я рекомендую ее использовать. Вы можете просто установить его с помощью pip:

    Следующий код показывает, как вы можете подключиться к memcached и использовать его в качестве сетевого распределенного кеша в ваших приложениях Python:

      >>> из базы импорта pymemcache.client
    
    # Не забудьте запустить `memcached 'перед запуском следующей строки:
    >>> client = base.Client (('локальный хост', 11211))
    
    # После создания экземпляра клиента вы можете получить доступ к кешу:
    >>> клиент.set ('some_key', 'какое-то значение')
    
    # Снова получить ранее установленные данные:
    >>> client.get ('some_key')
    'некоторая ценность'
      

    Сетевой протокол memcached действительно прост, а его реализация очень быстрая, что делает его полезным для хранения данных, которые в противном случае были бы медленными при извлечении из канонического источника данных или повторном вычислении:

    Хотя этот пример достаточно прост, он позволяет хранить кортежи ключ / значение по сети и получать к ним доступ через несколько распределенных работающих копий вашего приложения.Это упрощенно, но мощно. И это отличный первый шаг к оптимизации вашего приложения.

    Автоматическое истечение срока хранения кэшированных данных

    При сохранении данных в memcached вы можете установить время истечения срока — максимальное количество секунд для memcached , чтобы ключ и значение оставались рядом. После этой задержки memcached автоматически удаляет ключ из своего кеша.

    Какое значение следует установить для этого времени кеширования? У этой задержки нет магического числа, и она будет полностью зависеть от типа данных и приложения, с которым вы работаете.Это может быть несколько секунд или несколько часов.

    Аннулирование кеша , который определяет, когда следует удалить кеш, поскольку он не синхронизирован с текущими данными, также является тем, что ваше приложение должно будет обработать. Особенно, если следует избегать представления слишком старых данных или устаревших .

    Здесь снова нет волшебного рецепта; это зависит от типа создаваемого вами приложения. Однако есть несколько необычных случаев, которые необходимо рассмотреть, но мы еще не рассмотрели их в приведенном выше примере.

    Кэширующий сервер не может расти бесконечно — память — это ограниченный ресурс. Следовательно, ключи будут сброшены кэширующим сервером, как только ему потребуется больше места для хранения других вещей.

    Некоторые ключи также могут быть просрочены, потому что они достигли своего времени истечения (также иногда называемого «время жизни» или TTL.) В этих случаях данные теряются, и канонический источник данных должен быть запрошен снова.

    Звучит сложнее, чем есть на самом деле. Обычно при работе с memcached в Python можно использовать следующий шаблон:

      из pymemcache.клиентская база импорта
    
    
    def do_some_query ():
        # Заменить фактическим кодом запроса к базе данных,
        # удаленный REST API и т. д.
        возврат 42
    
    
    # Не забудьте запустить `memcached 'перед запуском этого кода
    client = base.Client (('локальный хост', 11211))
    результат = client.get ('some_key')
    
    если результат None:
        # Кеш пуст, нужно получить значение
        # из канонического источника:
        результат = do_some_query ()
    
        # Кешировать результат для следующего раза:
        client.set ('some_key', результат)
    
    # Нужно ли нам обновлять кеш или нет,
    # на этом этапе вы можете работать с данными
    # хранится в переменной `result`:
    печать (результат)
      

    Примечание: Обработка отсутствующих ключей является обязательной из-за обычных операций очистки.Также обязательно обрабатывать сценарий холодного кеширования, то есть когда memcached имеет только что началось. В этом случае кеш будет полностью пуст, и его необходимо полностью повторно заполнить, по одному запросу за раз.

    Это означает, что вы должны рассматривать любые кэшированные данные как эфемерные. И вы никогда не должны ожидать, что кеш будет содержать значение, которое вы ранее записали в него.

    Разогрев холодного кэша

    Некоторые сценарии холодного кеширования невозможно предотвратить, например, сбой memcached .Но некоторые могут, например, перейти на новый сервер memcached .

    Если можно предсказать, что произойдет сценарий холодного кеширования, лучше его избегать. Кэш, который необходимо пополнить, означает, что внезапно каноническое хранилище кэшированных данных будет сильно поражено всеми пользователями кеша, которым не хватает данных кеша (также известная как проблема громового стада).

    pymemcache предоставляет класс с именем FallbackClient , который помогает в реализации этого сценария, как показано здесь:

      из pymemcache.клиентская база импорта
    из резервной копии импорта pymemcache
    
    
    def do_some_query ():
        # Заменить фактическим кодом запроса к базе данных,
        # удаленный REST API и т. д.
        возврат 42
    
    
    # Установите `ignore_exc = True`, чтобы можно было завершить работу
    # старый кеш перед удалением его использования из
    # программа, если когда-нибудь понадобится.
    old_cache = base.Client (('localhost', 11211), ignore_exc = True)
    new_cache = base.Client (('локальный хост', 11212))
    
    client = fallback.FallbackClient ((новый_кэш, старый_кэш))
    
    результат = client.get ('some_key')
    
    если результат None:
        # Кеш пуст, нужно получить значение
        # из канонического источника:
        результат = do_some_query ()
    
        # Кешировать результат для следующего раза:
        клиент.set ('some_key', результат)
    
    печать (результат)
      

    FallbackClient запрашивает старый кэш, переданный его конструктору, соблюдая порядок. В этом случае новый кэш-сервер всегда будет опрашиваться первым, а в случае промаха кеша будет опрошен старый, что позволит избежать возможного возврата к первичному источнику данных.

    Если установлен какой-либо ключ, он будет установлен только для нового кеша. Через некоторое время старый кэш может быть выведен из эксплуатации, а FallbackClient может быть заменен клиентом new_cache .

    Проверка и установка

    При обмене данными с удаленным кешем возвращается обычная проблема параллелизма: несколько клиентов могут одновременно пытаться получить доступ к одному и тому же ключу. memcached обеспечивает проверку и устанавливает операцию , сокращенную до CAS , что помогает решить эту проблему.

    Самый простой пример — это приложение, которое хочет подсчитать количество пользователей. Каждый раз, когда посетитель подключается, счетчик увеличивается на 1.Используя memcached , простая реализация будет:

      def on_visit (клиент):
        result = client.get ('посетители')
        если результат None:
            результат = 1
        еще:
            результат + = 1
        client.set ('посетители', результат)
      

    Однако что произойдет, если два экземпляра приложения попытаются обновить этот счетчик одновременно?

    Первый вызов client.get ('Посетители') вернет одинаковое количество посетителей для них обоих, скажем, 42.Затем оба прибавят 1, вычисят 43 и установят количество посетителей на 43. Это число неверно, и результат должен быть 44, то есть 42 + 1 + 1.

    Для решения этой проблемы параллелизма удобна операция CAS memcached . Следующий фрагмент кода реализует правильное решение:

      def on_visit (клиент):
        в то время как True:
            результат, cas = client.gets ('посетители')
            если результат None:
                результат = 1
            еще:
                результат + = 1
            если клиент.cas ('посетители', результат, cas):
                перерыв
      

    Метод gets возвращает значение, как и метод get , но также возвращает значение CAS .

    То, что находится в этом значении, не имеет значения, но оно используется для следующего вызова метода cas . Этот метод эквивалентен операции set , за исключением того, что он не работает, если значение изменилось, поскольку получает операцию . В случае успеха цикл разрывается.В противном случае операция возобновляется с самого начала.

    В сценарии, когда два экземпляра приложения пытаются обновить счетчик одновременно, только одному удается переместить счетчик с 42 на 43. Второй экземпляр получает значение False , возвращаемое вызовом client.cas , и нужно повторить цикл. На этот раз он получит 43 как значение, увеличит его до 44, и его вызов cas завершится успешно, тем самым решив нашу проблему.

    Увеличение счетчика интересно в качестве примера, объясняющего, как работает CAS, потому что это упрощенно.Однако memcached также предоставляет методы incr и decr для увеличения или уменьшения целого числа в одном запросе, вместо того, чтобы выполнять несколько вызовов get / cas . В реальных приложениях получает и cas используются для более сложных типов данных или операций

    Большинство удаленных серверов кэширования и хранилищ данных предоставляют такой механизм для предотвращения проблем параллелизма. Очень важно знать об этих случаях, чтобы правильно использовать их функции.

    Помимо кэширования

    Простые методы, проиллюстрированные в этой статье, показали, насколько легко использовать memcached для повышения производительности вашего приложения Python.

    Просто используя две основные операции «установить» и «получить», вы часто можете ускорить извлечение данных или избежать повторного вычисления результатов снова и снова. С memcached вы можете совместно использовать кеш среди большого количества распределенных узлов.

    Другие, более сложные шаблоны, которые вы видели в этом руководстве, например, операция Check And Set (CAS) , позволяют обновлять данные, хранящиеся в кэше, одновременно в нескольких потоках или процессах Python, избегая при этом повреждения данных.

    Если вам интересно узнать больше о продвинутых методах написания более быстрых и масштабируемых приложений Python, ознакомьтесь с Scaling Python. Он охватывает множество сложных тем, таких как сетевое распределение, системы очередей, распределенное хеширование и профилирование кода.

    Кэш-фреймворк

    Django | Документация Django

    Фундаментальный компромисс в динамических веб-сайтах заключается в том, что они динамичны. Каждый когда пользователь запрашивает страницу, веб-сервер производит всевозможные вычисления — от запросов к базе данных до рендеринга шаблонов и бизнес-логики — для создания страницу, которую видит посетитель вашего сайта.Это намного дороже, от перспектива обработки накладных расходов, чем ваш стандарт устройство сервера чтения файла вне файловой системы.

    Для большинства веб-приложений эти накладные расходы не имеют большого значения. Большинство веб-сайтов приложения не Washdot.com или slashdot.org ; они маленькие- на сайты среднего размера с средней посещаемостью. Но для среднего и высокого трафика сайтов, важно максимально сократить накладные расходы.

    Вот тут и пригодится кеширование.

    Кэшировать что-либо — значит сохранить результат дорогостоящего вычисления, чтобы в следующий раз выполнять расчет не нужно.Вот какой-то псевдокод объясняя, как это будет работать для динамически генерируемой веб-страницы:

    , учитывая URL-адрес, попробуйте найти эту страницу в кеше.
    если страница находится в кеше:
        вернуть кешированную страницу
    еще:
        создать страницу
        сохранить сгенерированную страницу в кеше (в следующий раз)
        вернуть сгенерированную страницу
     

    Django поставляется с надежной системой кеширования, которая позволяет сохранять динамические страницы, чтобы их не нужно рассчитывать для каждого запроса. Для удобства Django предлагает разные уровни детализации кеша: вы можете кэшировать вывод определенные виды, вы можете кэшировать только те части, которые сложно создать, или вы можете кэшировать весь свой сайт.

    Django также хорошо работает с «нисходящими» кэшами, такими как Squid и кешами на основе браузера. Это типы кешей, которые вы не контролируете напрямую, но для которых вы можете давать подсказки (через заголовки HTTP) о том, какие части вашего сайта и как следует кэшировать.

    Настройка кеша¶

    Система кэширования требует небольшой настройки. А именно, вы должны это сказать где должны находиться ваши кэшированные данные — будь то в базе данных или в файловой системе или прямо в памяти.Это важное решение, которое влияет на ваш кеш представление; да, некоторые типы кешей быстрее других.

    Ваши предпочтения кеша находятся в настройке CACHES в вашем файл настроек. Вот объяснение всех доступных значений для КЭШОВ .

    Memcached¶

    Самый быстрый и эффективный тип кеша, изначально поддерживаемый Django, Memcached — полностью основанный на памяти кэш-сервер, первоначально разработанный справляться с большими нагрузками на LiveJournal.com, а затем с открытым исходным кодом Danga Interactive. Он используется такими сайтами, как Facebook и Wikipedia, чтобы уменьшить доступ к базе данных и значительно повысить производительность сайта.

    Memcached работает как демон, и ему выделяется определенный объем оперативной памяти. Все это действительно предоставляет быстрый интерфейс для добавления, извлечения и удаления данных в кеш. Все данные хранятся непосредственно в памяти, поэтому нет накладных расходов на использование базы данных или файловой системы.

    После установки самого Memcached вам потребуется установить Memcached. привязка.Доступно несколько привязок Python Memcached; в два, поддерживаемые Django, — это pylibmc и pymemcache.

    Для использования Memcached с Django:

    • Установить BACKEND на django.core.cache.backends.memcached.PyMemcacheCache или django.core.cache.backends.memcached.PyLibMCCache (в зависимости от вашего выбрана привязка memcached)
    • Установить МЕСТОПОЛОЖЕНИЕ на ip: значения порта , где ip — это IP-адрес демона Memcached, а порт — это порт, на котором работает Memcached, или значение unix: путь , где путь — это путь к файлу сокета Memcached Unix.

    В этом примере Memcached работает на локальном (127.0.0.1) порту 11211, используя привязка pymemcache :

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
            "МЕСТОПОЛОЖЕНИЕ": "127.0.0.1:11211",
        }
    }
     

    В этом примере Memcached доступен через локальный файл сокета Unix. /tmp/memcached.sock с использованием привязки pymemcache :

     КЭШИ = {
        'По умолчанию': {
            'НАЗАД': 'django.core.cache.backends.memcached.PyMemcacheCache ',
            'МЕСТОПОЛОЖЕНИЕ': 'unix: /tmp/memcached.sock',
        }
    }
     

    Отличной особенностью Memcached является возможность совместного использования кеша несколько серверов. Это означает, что вы можете запускать демоны Memcached на нескольких машин, и программа будет рассматривать группу машин как одиночных cache, без необходимости дублировать значения кеша на каждой машине. Брать Преимущество этой функции, включение всех адресов серверов в МЕСТО , либо точка с запятой, либо запятая. строка с разделителями или в виде списка.

    В этом примере кеш совместно используется экземплярами Memcached, работающими на IP. адрес 172.19.26.240 и 172.19.26.242, оба на порту 11211:

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
            'МЕСТО РАСПОЛОЖЕНИЯ': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }
     

    В следующем примере кеш используется совместно с запущенными экземплярами Memcached. по IP-адресам 172.19.26.240 (порт 11211), 172.19.26.242 (порт 11212) и 172.19.26.244 (порт 11213):

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
            'МЕСТО РАСПОЛОЖЕНИЯ': [
                '172.19.26.240:11211',
                '172.19.26.242:11212',
                '172.19.26.244:11213',
            ]
        }
    }
     

    Последний пункт о Memcached заключается в том, что кэширование на основе памяти имеет Недостаток: поскольку кешированные данные хранятся в памяти, данные будут потеряно, если ваш сервер выйдет из строя.Очевидно, что память не предназначена для постоянных данных. хранилище, поэтому не полагайтесь на кеширование в памяти как на единственное хранилище данных. Без сомнения, нет из бэкэндов кеширования Django не следует использовать для постоянное хранилище — все они предназначены для решения проблемы кеширования, а не хранилище — но мы указываем на это здесь, потому что кэширование на основе памяти особенно временный.

    Изменено в Django 3.2:

    Добавлен бэкэнд PyMemcacheCache .

    Не рекомендуется, начиная с версии 3.2. Серверная часть MemcachedCache устарела, поскольку python-memcached имеет некоторые проблемы и, похоже, не устранены. Используйте PyMemcacheCache или PyLibMCCache вместо этого.

    Кэширование базы данных¶

    Django может хранить свои кэшированные данные в вашей базе данных. Это лучше всего работает, если вы получил быстрый, хорошо индексируемый сервер баз данных.

    Чтобы использовать таблицу базы данных в качестве серверной части кеша:

    • Установить BACKEND на джанго.core.cache.backends.db.DatabaseCache
    • Установить МЕСТО на имя таблицы , имя таблица базы данных. Это имя может быть любым, если это действительное имя таблицы, которое еще не используется в вашей базе данных.

    В этом примере имя таблицы кеша — my_cache_table :

     КЭШИ = {
        'По умолчанию': {
            'НАЗАД': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_table',
        }
    }
     
    Создание кэш-таблицы¶

    Перед использованием кэша базы данных вы должны создать таблицу кэша с этим команда:

     управление питоном.py createcachetable
     

    Это создает таблицу в вашей базе данных в правильном формате, Система кеширования баз данных Django ожидает. Название таблицы взято из МЕСТО .

    Если вы используете несколько кешей базы данных, createcachetable создает одна таблица для каждого кеша.

    Если вы используете несколько баз данных, createcachetable соблюдает allow_migrate () вашего маршрутизатора базы данных (см. Ниже).

    Как и , миграция , createcachetable не коснется существующего Таблица.Это только создаст недостающие таблицы.

    Чтобы распечатать SQL, который будет запускаться, а не запускать его, используйте createcachetable --dry-run option.

    Несколько баз данных¶

    Если вы используете кэширование нескольких баз данных, вам также понадобится для настройки инструкций по маршрутизации для таблицы кэша вашей базы данных. Для Для целей маршрутизации таблица кэша базы данных отображается как модель с именем CacheEntry в приложении с именем django_cache .Эта модель не будет отображаться в кеше моделей, но детали модели могут быть использованы для целей маршрутизации.

    Например, следующий маршрутизатор будет направлять все чтение кеша. операций в cache_replica , а все операции записи в cache_primary . Таблица кеша будет синхронизироваться только на cache_primary :

     класс CacheRouter:
        "" "Маршрутизатор для управления всеми операциями с кешем базы данных" ""
    
        def db_for_read (сам, модель, ** подсказки):
            «Все операции чтения из кеша переходят в реплику»
            если модель._meta.app_label == 'django_cache':
                вернуть 'cache_replica'
            return None
    
        def db_for_write (сам, модель, ** подсказки):
            «Все операции записи в кэш переходят в основной»
            если model._meta.app_label == 'django_cache':
                вернуть 'cache_primary'
            return None
    
        def allow_migrate (self, db, app_label, model_name = None, ** подсказки):
            «Устанавливать модель кеша только на основной»
            если app_label == 'django_cache':
                вернуть db == 'cache_primary'
            return None
     

    Если вы не укажете направления маршрутизации для модели кэша базы данных, бэкэнд кеша будет использовать базу данных по умолчанию .

    И если вы не используете серверную часть кеширования базы данных, вам не нужно беспокоиться о предоставление инструкций по маршрутизации для модели кэша базы данных.

    Кэширование файловой системы¶

    Бэкэнд на основе файлов сериализует и сохраняет каждое значение кеша как отдельное файл. Чтобы использовать этот бэкэнд, установите BACKEND на "django.core.cache.backends.filebased.FileBasedCache" и МЕСТО в подходящий каталог. Например, для хранения кэшированных данных в / var / tmp / django_cache используйте этот параметр:

     КЭШИ = {
        'По умолчанию': {
            'НАЗАД': 'django.core.cache.backends.filebased.FileBasedCache ',
            'МЕСТОПОЛОЖЕНИЕ': '/ var / tmp / django_cache',
        }
    }
     

    Если вы работаете в Windows, укажите букву диска в начале пути, как это:

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
            'МЕСТОПОЛОЖЕНИЕ': 'c: / foo / bar',
        }
    }
     

    Путь к каталогу должен быть абсолютным, то есть он должен начинаться с корня. вашей файловой системы. Неважно, поставили ли вы косую черту в конце параметр.

    Убедитесь, что каталог, на который указывает этот параметр, существует и читаемый и доступный для записи, или что он может быть создан пользователем системы, под которым ваш веб-сервер работает. Продолжая приведенный выше пример, если ваш сервер работает как пользователь apache , убедитесь, что каталог / var / tmp / django_cache существует и доступен для чтения и записи пользователем apache , или что он может быть создан с помощью пользователь apache .

    Предупреждение

    Когда кэш МЕСТО содержится в MEDIA_ROOT , STATIC_ROOT или STATICFILES_FINDERS , конфиденциальные данные могут быть раскрыты.

    Злоумышленник, получивший доступ к файлу кеша, может не только подделать HTML. контент, которому будет доверять ваш сайт, но также удаленно выполнять произвольные код, так как данные сериализуются с использованием pickle .

    Кэширование в локальной памяти¶

    Это кэш по умолчанию, если другой не указан в вашем файле настроек. Если вам нужны преимущества скорости кэширования в памяти, но у вас нет возможности Для запуска Memcached рассмотрите бэкэнд кеш-памяти в локальной памяти. Этот кеш на процесс (см. ниже) и потокобезопасный.Чтобы использовать его, установите BACKEND на "django.core.cache.backends.locmem.LocMemCache" . Для пример:

     КЭШИ = {
        'По умолчанию': {
            'НАЗАД': 'django.core.cache.backends.locmem.LocMemCache',
            "МЕСТО": "уникальная снежинка",
        }
    }
     

    Кэш МЕСТО используется для идентификации личности память хранит. Если у вас только один кеш locmem , вы можете опустить МЕСТО ; однако, если у вас более одного местного кеш памяти, вам нужно будет присвоить имя хотя бы одному из них в чтобы держать их отдельно.

    Кэш использует стратегию отбраковки наименее недавно использовавшихся (LRU).

    Обратите внимание, что каждый процесс будет иметь свой собственный экземпляр частного кеша, что означает, что возможно межпроцессное кеширование. Это также означает, что кэш локальной памяти не особенно эффективен с точки зрения памяти, поэтому, вероятно, это не лучший выбор для производственная среда. Это хорошо для развития.

    Фиктивное кэширование (для разработки)

    Наконец, Django поставляется с «фиктивным» кешем, который на самом деле не кеширует — он просто реализует интерфейс кеша, ничего не делая.

    Это полезно, если у вас есть производственный сайт, который использует усиленное кэширование в различные места, кроме среды разработки / тестирования, в которой вы не хотите кэшировать и не хочу менять свой код на особый случай. К активируйте фиктивное кеширование, установите BACKEND так:

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        }
    }
     

    Использование настраиваемого серверного модуля кеширования¶

    В то время как Django включает в себя поддержку ряда механизмов кэширования прямо из коробки, иногда вы можете захотеть использовать настраиваемый бэкэнд кеширования.Чтобы использовать внешний бэкэнд кеширования с Django, используйте путь импорта Python в качестве BACKEND настройки CACHES , например:

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'path.to.backend',
        }
    }
     

    Если вы создаете собственный бэкэнд, вы можете использовать стандартные бэкэнды кеширования. в качестве эталонных реализаций. Вы найдете код в django / core / cache / backends / каталог исходного кода Django.

    Примечание. Без веских причин, например, если хост не поддерживает их следует придерживаться бэкэндов кеширования, включенных в Django.Они есть были хорошо протестированы и хорошо задокументированы.

    Аргументы кеша¶

    Каждому бэкэнду кеширования можно дать дополнительные аргументы для управления кешированием поведение. Эти аргументы предоставляются как дополнительные ключи в КЭШЕТ настройка. Допустимые аргументы:

    • TIMEOUT : Тайм-аут по умолчанию, в секунд, чтобы использовать для кеша. По умолчанию этот аргумент равен 300 секунд (5 минут). Вы можете установить TIMEOUT на None , чтобы по умолчанию ключи кеширования никогда не истек.Значение 0 приводит к немедленному истечению срока действия ключей (фактически «Не кэшировать»).

    • ОПЦИИ : любые параметры, которые должны быть передается в бэкэнд кеша. Список допустимых вариантов будет отличаться с каждым бэкэндом, и бэкэнды кеширования, поддерживаемые сторонней библиотекой передаст свои параметры непосредственно в базовую библиотеку кеша.

      Кэш-бэкэнды, которые реализуют собственную стратегию отбраковки (т. Е. locmem , файловая система и база данных бэкэнды) будут соблюдайте следующие параметры:

      • MAX_ENTRIES : максимальное количество записей, разрешенных в кеш перед удалением старых значений.Этот аргумент по умолчанию 300 .

      • CULL_FREQUENCY : доля отбракованных записей при достижении MAX_ENTRIES . Фактическое соотношение составляет 1 ​​/ CULL_FREQUENCY , поэтому установите CULL_FREQUENCY на 2 на отбраковывать половину записей при достижении MAX_ENTRIES . Этот аргумент должно быть целым числом и по умолчанию 3 .

        Значение 0 для CULL_FREQUENCY означает, что весь кеш будет сброшен при достижении MAX_ENTRIES .На некоторых бэкэндах (в частности, в базе данных ) это значительно усложняет отсечение . быстрее за счет большего количества промахов в кэше.

      Серверные модули Memcached передают содержимое OPTIONS в качестве аргументов ключевого слова для конструкторов клиента, что позволяет использовать более продвинутые контроль поведения клиентов. Пример использования см. Ниже.

    • KEY_PREFIX : строка, которая будет автоматически включается (добавляется по умолчанию) ко всем ключам кеша используется сервером Django.

      См. Документацию по кэш-памяти для больше информации.

    • ВЕРСИЯ : Номер версии по умолчанию для ключей кеша, сгенерированных сервером Django.

      Подробнее см. В документации по кэшу. Информация.

    • КЛЮЧ_ФУНКЦИЯ Строка, содержащая пунктирный путь к функции, определяющей, как чтобы составить префикс, версию и ключ в окончательный ключ кеша.

      См. Документацию по кэшу. для дополнительной информации.

    В этом примере серверная часть файловой системы настраивается с тайм-аутом 60 секунд, максимальная вместимость — 1000 элементов:

     КЭШИ = {
        'По умолчанию': {
            'НАЗАД': 'django.core.cache.backends.filebased.FileBasedCache ',
            'МЕСТОПОЛОЖЕНИЕ': '/ var / tmp / django_cache',
            «ТАЙМ-АУТ»: 60,
            'ПАРАМЕТРЫ': {
                "MAX_ENTRIES": 1000
            }
        }
    }
     

    Вот пример конфигурации серверной части на основе pylibmc , которая позволяет бинарный протокол, аутентификация SASL и режим поведения ketama :

     КЭШИ = {
        'По умолчанию': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            "МЕСТО": "127.0.0.1: 11211 ',
            'ПАРАМЕТРЫ': {
                'двоичный': Верно,
                'имя пользователя': 'пользователь',
                'пароль': 'пароль',
                'behavior': {
                    "ketama": Верно,
                }
            }
        }
    }
     

    Вот пример конфигурации серверной части pymemcache , которая позволяет объединение клиентов в пул (что может повысить производительность, если клиенты останутся подключенными), обрабатывает ошибки кэша памяти / сети как промахи кеша и устанавливает TCP_NODELAY флаг на разъеме подключения:

     КЭШИ = {
        'По умолчанию': {
            'НАЗАД': 'django.core.cache.backends.memcached.PyMemcacheCache ',
            "МЕСТОПОЛОЖЕНИЕ": "127.0.0.1:11211",
            'ПАРАМЕТРЫ': {
                'no_delay': Верно,
                ignore_exc: Верно,
                'max_pool_size': 4,
                'use_pooling': Верно,
            }
        }
    }
     

    Кэш для каждого сайта¶

    После настройки кеша самый простой способ использовать кеширование — это кэшировать ваши весь сайт. Вам нужно будет добавить 'django.middleware.cache.UpdateCacheMiddleware' и 'django.middleware.cache.FetchFromCacheMiddleware ' на ваш MIDDLEWARE , как в этом примере:

     ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ = [
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
    ]
     

    Примечание

    Нет, это не опечатка: промежуточное ПО «update» должно быть первым в списке, и промежуточное ПО «выборки» должно быть последним. Детали немного неясны, но см. Порядок ПОСТОЯННОГО ОБЕСПЕЧЕНИЯ ниже, если вам нужна полная история.

    Затем добавьте следующие необходимые настройки в файл настроек Django:

    • CACHE_MIDDLEWARE_ALIAS — Псевдоним кеша, используемый для хранения.
    • CACHE_MIDDLEWARE_SECONDS — Количество секунд, в течение которых каждая страница должна кэшироваться.
    • CACHE_MIDDLEWARE_KEY_PREFIX — Если кеш используется совместно несколько сайтов, использующих одну и ту же установку Django, задайте для этого имя сайт или другая строка, уникальная для этого экземпляра Django, чтобы предотвратить столкновения ключей.Если вам все равно, используйте пустую строку.

    FetchFromCacheMiddleware кэширует ответы GET и HEAD со статусом 200, где позволяют заголовки запроса и ответа. Ответы на запросы о том же URL с разными параметрами запроса считаются уникальными страницами и кешируется отдельно. Это промежуточное ПО ожидает, что на запрос HEAD будет дан ответ те же заголовки ответа, что и соответствующий запрос GET; в этом случае это может вернуть кешированный ответ GET на запрос HEAD.

    Кроме того, UpdateCacheMiddleware автоматически устанавливает несколько заголовков в каждый HttpResponse , которые влияют на кеши нисходящего потока:

    См. Промежуточное ПО для получения дополнительной информации о промежуточном программном обеспечении.

    Если представление устанавливает собственное время истечения срока действия кеша (т.е. оно имеет раздел max-age в его заголовок Cache-Control ), то страница будет кэшироваться до истечения срока time, а не CACHE_MIDDLEWARE_SECONDS . Использование декораторов в джанго.views.decorators.cache вы можете легко установить время истечения срока действия представления. (с использованием декоратора cache_control () ) или отключить кеширование для представления (используя never_cache () декоратор). Увидеть используя другой раздел заголовков, чтобы узнать больше об этих декораторах.

    Если для USE_I18N установлено значение True , то сгенерированный ключ кеша будет включить название активного языка — см. также Как Django обнаруживает языковые предпочтения). Это позволяет легко кэшировать многоязычные сайты без необходимости создавать ключ кеширования самостоятельно.

    Ключи кэша также включают текущий часовой пояс, если для USE_TZ установлено значение True .

    Кэш для каждого просмотра¶

    django.views.decorators.cache. cache_page () ¶

    Более детальный способ использования инфраструктуры кэширования — это кэширование вывода индивидуальные взгляды. django.views.decorators.cache определяет cache_page декоратор, который автоматически кэширует для вас ответ представления:

     из django.views.decorators.cache import cache_page
    
    @cache_page (60 * 15)
    def my_view (запрос):
        ...
     

    cache_page принимает единственный аргумент: тайм-аут кеша в секундах. в В приведенном выше примере результат представления my_view () будет кэширован для 15 минут. (Обратите внимание, что мы написали это как 60 * 15 для целей читаемость. 60 * 15 будет оцениваться как 900 — то есть 15 минут умноженное на 60 секунд в минуту.)

    Тайм-аут кеша, установленный параметром cache_page , имеет приоритет над максимальным возрастом директива из заголовка Cache-Control .

    Кэш для каждого просмотра, как и для каждого сайта, отключен от URL-адреса. Если несколько URL-адресов указывают на одно и то же представление, каждый URL-адрес будет кэшироваться отдельно. Продолжая пример my_view , если ваш URLconf выглядит так:

     urlpatterns = [
        путь ('foo /  /', my_view),
    ]
     

    затем запросы к / foo / 1/ и / foo / 23/ будут кэшироваться отдельно, как вы можете ожидать. Но как только конкретный URL (например, / foo / 23/) был запрошено, последующие запросы к этому URL-адресу будут использовать кеш.

    cache_page также может принимать необязательный аргумент ключевого слова, cache , который предписывает декоратору использовать определенный кеш (из вашего CACHES setting) при кешировании результатов просмотра. По умолчанию по умолчанию будет использоваться кеш , но вы можете указать любой кеш, который вы хочу:

     @cache_page (60 * 15, cache = "special_cache")
    def my_view (запрос):
        ...
     

    Вы также можете переопределить префикс кеша для каждого просмотра. cache_page принимает необязательный аргумент ключевого слова, key_prefix , который работает так же, как CACHE_MIDDLEWARE_KEY_PREFIX настройка промежуточного программного обеспечения.Его можно использовать так:

     @cache_page (60 * 15, key_prefix = "site1")
    def my_view (запрос):
        ...
     

    Аргументы key_prefix и cache могут быть указаны вместе. В key_prefix аргумент и KEY_PREFIX указанные в КЭШЕ будут объединены.

    Кроме того, cache_page автоматически устанавливает Cache-Control и Истекает срок действия заголовков в ответе, влияющих на кэши нисходящего потока.

    Изменено в Django 3.1:

    В более старых версиях директива max-age из Cache-Control заголовок имел приоритет над тайм-аутом кеша, установленным cache_page .

    Указание кеша для каждого просмотра в URLconf¶

    Примеры в предыдущем разделе жестко закрепили тот факт, что представление cached, потому что cache_page заменяет функцию my_view на месте. Этот подход объединяет ваше представление с системой кеширования, что не идеально для нескольких причины.Например, вы можете захотеть повторно использовать функции просмотра на другом, сайт без кеша, или вы можете захотеть распространить просмотры среди людей, которые могут хотите использовать их без кеширования. Решение этих проблем — укажите кеш просмотра в URLconf, а не рядом с функциями просмотра сами себя.

    Вы можете сделать это, заключив функцию просмотра в cache_page при обращении к нему в URLconf. Вот старый URLconf из более ранней версии:

     urlpatterns = [
        путь ('foo /  /', my_view),
    ]
     

    Здесь то же самое, с my_view , заключенным в cache_page :

     из django.views.decorators.cache import cache_page
    
    urlpatterns = [
        путь ('foo /  /', cache_page (60 * 15) (my_view)),
    ]
     

    Кеширование фрагментов шаблона¶

    Если вам нужен еще больший контроль, вы также можете кэшировать фрагменты шаблона, используя тег шаблона cache . Чтобы предоставить вашему шаблону доступ к этому тегу, поместите {% load cache%} в верхней части шаблона.

    Тег шаблона {% cache%} кэширует содержимое блока для заданного количество времени.Требуется как минимум два аргумента: тайм-аут кеша в секундах, и имя для фрагмента кеша. Фрагмент кешируется навсегда, если таймаут Нет . Имя будет принято как есть, не используйте переменную. Для пример:

     {% загрузки кеша%}
    {% cache 500 боковая панель%}
        .. боковая панель ..
    {% endcache%}
     

    Иногда может потребоваться кэшировать несколько копий фрагмента в зависимости от некоторые динамические данные, которые появляются внутри фрагмента. Например, вам может понадобиться отдельная кешированная копия боковой панели, использованная в предыдущем примере, для каждого пользователя вашего сайта.Сделайте это, передав один или несколько дополнительных аргументов, которые могут быть переменные с фильтрами или без них, в тег шаблона {% cache%} , чтобы однозначно идентифицировать фрагмент кеша:

     {% загрузки кеша%}
    {% cache 500 sidebar request.user.username%}
        .. боковая панель для вошедшего в систему пользователя ..
    {% endcache%}
     

    Если для параметра USE_I18N установлено значение True , кэш промежуточного ПО для каждого сайта будет уважайте активный язык. Для шаблона cache тег, вы можете использовать один из специфичные для перевода переменные, доступные в шаблоны для достижения того же результата:

     {% load i18n%}
    {% загрузки кеша%}
    
    {% get_current_language как LANGUAGE_CODE%}
    
    {% cache 600 добро пожаловать LANGUAGE_CODE%}
        {% translate "Добро пожаловать в пример.com "%}
    {% endcache%}
     

    Тайм-аут кеширования может быть переменной шаблона, если переменная шаблона разрешается в целочисленное значение. Например, если переменная шаблона my_timeout устанавливается на значение 600 , тогда следующие два примера: эквивалент:

     {% cache 600 sidebar%} ... {% endcache%}
    {% cache my_timeout боковая панель%} ... {% endcache%}
     

    Эта функция полезна, чтобы избежать повторения в шаблонах. Вы можете установить тайм-аут в переменной в одном месте и повторно использовать это значение.

    По умолчанию тег кеша будет пытаться использовать кеш с именем «template_fragments». Если такого кеша не существует, он вернется к использованию кеша по умолчанию. Вы можете выберите альтернативный бэкэнд кеша для использования с , используя аргумент ключевого слова , который должен быть последним аргументом тега.

     {% cache 300 local-thing ... using = "localcache"%}
     

    Указание не настроенного имени кэша считается ошибкой.

    django.core.cache.utils. make_template_fragment_key ( имя_фрагмента , var_on = None ) ¶

    Если вы хотите получить ключ кеша, используемый для кэшированного фрагмента, вы можете использовать make_template_fragment_key . имя_фрагмента совпадает со вторым аргументом в тег шаблона cache ; variable_on — список всех дополнительных аргументов перешли в тег. Эта функция может быть полезна для аннулирования или перезаписи кэшированный элемент, например:

     >>> из django.кеш импорта core.cache
    >>> из django.core.cache.utils import make_template_fragment_key
    # ключ кеша для {% cache 500 имя пользователя боковой панели%}
    >>> key = make_template_fragment_key ('боковая панель', [имя пользователя])
    >>> cache.delete (key) # делает недействительным кешированный фрагмент шаблона
    Правда
     

    API низкоуровневого кэша7

    Иногда кеширование всей отображаемой страницы не приносит вам особой выгоды и требует, собственно говоря, неудобный перебор.

    Возможно, например, на вашем сайте есть представление, результаты которого зависят от несколько дорогостоящих запросов, результаты которых меняются с разной периодичностью.В этом случае было бы не идеально использовать кэширование всей страницы, которое Стратегии кеширования для каждого сайта или просмотра предлагают, потому что вы не хотите кэшировать весь результат (поскольку некоторые данные часто меняются), но вы все равно хотите кэшировать результаты, которые редко меняются.

    Для подобных случаев Django предоставляет низкоуровневый API кеширования. Вы можете использовать этот API для хранения объектов в кеше с любым уровнем детализации, который вам нравится. Ты можешь кэшировать любой объект Python, который можно безопасно мариновать: строки, словари, списки объектов модели и т. д.(Наиболее распространенные объекты Python могут быть маринованный; обратитесь к документации Python для получения дополнительной информации о травление.)

    Доступ к кеш-памяти¶

    django.core.cache. тайники

    Вы можете получить доступ к кешам, настроенным в настройке CACHES через dict-подобный объект: django.core.cache.caches . Повторяется запросы на один и тот же псевдоним в одном потоке вернут одинаковые объект.

     >>> из django.core.cache импортные кеши
    >>> cache1 = кеши ['myalias']
    >>> cache2 = кеши ['myalias']
    >>> cache1 - это cache2
    Правда
     

    Если указанный ключ не существует, InvalidCacheBackendError будет поднятый.

    Для обеспечения безопасности потоков другой экземпляр серверной части кеша будет возвращаться для каждого потока.

    django.core.cache. кэш

    В качестве ярлыка кэш по умолчанию доступен как джанго.core.cache.cache :

     >>> из кеша импорта django.core.cache
     

    Этот объект эквивалентен кэшам ['default'] .

    Базовое использование¶

    Базовый интерфейс:

    кеш. установить ( ключ , значение , тайм-аут = DEFAULT_TIMEOUT , версия = None ) ¶
     >>> cache.set ('my_key', 'привет, мир!', 30)
     
    кеш. получить ( ключ , по умолчанию = нет , версия = нет ) ¶
     >>> cache.get ('my_key')
    'Привет мир!'
     

    ключ должен быть str , а значение может быть любым выбираемым объектом Python.

    Аргумент тайм-аут является необязательным и по умолчанию используется аргумент тайм-аут соответствующего бэкэнда в настройке CACHES (объяснено выше).Это количество секунд, в течение которых значение должно храниться в кеше. Проходя в Нет для тайм-аута будет кэшировать значение навсегда. Время ожидания из 0 не кэширует значение.

    Если объект не существует в кеше, cache.get () возвращает Нет :

     >>> # Подождите 30 секунд, пока истечет срок действия my_key ...
    >>> cache.get ('my_key')
    Никто
     

    Если вам нужно определить, существует ли объект в кеше и у вас есть сохранено буквальное значение Нет , по умолчанию используется объект-дозорный:

     >>> часовой = объект ()
    >>> кеш.get ('my_key', sentinel) - дозорный
    Ложь
    >>> # Подождите 30 секунд, пока истечет срок действия my_key ...
    >>> cache.get ('my_key', sentinel) - дозорный
    Правда
     

    MemcachedCache

    Из-за ограничения python-memcached невозможно различить между сохраненным значением Нет и промахом в кэше, обозначенным возвращаемым значением из Нет на устаревшем бэкэнде MemcachedCache .

    cache.get () может принимать аргумент по умолчанию .Это указывает, какое значение вернуть, если объекта нет в кеше:

     >>> cache.get ('my_key', 'истек')
    'истек'
     
    кеш. добавить ( ключ , значение , тайм-аут = DEFAULT_TIMEOUT , версия = None ) ¶

    Чтобы добавить ключ, только если он еще не существует, используйте метод add () . Он принимает те же параметры, что и set () , но не пытается обновить кеш, если указанный ключ уже присутствует:

     >>> кеш.set ('add_key', 'Начальное значение')
    >>> cache.add ('add_key', 'Новое значение')
    >>> cache.get ('add_key')
    'Начальное значение'
     

    Если вам нужно знать, хранит ли add () значение в кеше, вы можете проверьте возвращаемое значение. Он вернет True , если значение было сохранено, Неверно иначе.

    кеш. get_or_set ( ключ , по умолчанию , тайм-аут = DEFAULT_TIMEOUT , версия = None ) ¶

    Если вы хотите получить значение ключа или установить значение, если ключа нет в кеше, есть метод get_or_set () .Принимает те же параметры, что и get () но по умолчанию устанавливается новое значение кеша для этого ключа, а не возвращено:

     >>> cache.get ('my_new_key') # не возвращает None
    >>> cache.get_or_set ('my_new_key', 'мое новое значение', 100)
    "моя новая ценность"
     

    Вы также можете передать любой вызываемый объект как значение по умолчанию :

     >>> дата и время импорта
    >>> cache.get_or_set ('ключ-отметка времени', datetime.datetime.now)
    datetime.datetime (2014, 12, 11, 0, 15, 49, 457920)
     
    кеш. get_many ( ключей , версия = нет ) ¶

    Существует также интерфейс get_many () , который попадает в кеш только один раз. get_many () возвращает словарь со всеми ключами, которые вы просили для этого действительно существуют в кеше (и срок их действия не истек):

     >>> cache.set ('а', 1)
    >>> cache.set ('b', 2)
    >>> cache.set ('c', 3)
    >>> cache.get_many (['a', 'b', 'c'])
    {'a': 1, 'b': 2, 'c': 3}
     
    кеш. set_many ( dict , тайм-аут ) ¶

    Чтобы установить несколько значений более эффективно, используйте set_many () для передачи словаря пар ключ-значение:

     >>> cache.set_many ({'a': 1, 'b': 2, 'c': 3})
    >>> cache.get_many (['a', 'b', 'c'])
    {'a': 1, 'b': 2, 'c': 3}
     

    Подобно cache.set () , set_many () принимает необязательный параметр timeout .

    На поддерживаемых серверных ВМ (memcached) set_many () возвращает список ключей, которые не удалось вставить.

    кеш. удалить (ключ , версия = нет ) ¶

    Вы можете удалить ключи явно с помощью delete () , чтобы очистить кеш для конкретный объект:

     >>> cache.delete ('а')
    Правда
     

    delete () возвращает Истина , если ключ был успешно удален, Ложь иначе.

    Изменено в Django 3.1:

    Добавлено логическое возвращаемое значение.

    кеш. delete_many ( ключей , версия = нет ) ¶

    Если вы хотите очистить сразу несколько ключей, delete_many () может взять список ключей, подлежащих очистке:

     >>> cache.delete_many (['a', 'b', 'c'])
     
    кеш. прозрачный () ¶

    Наконец, если вы хотите удалить все ключи в кеше, используйте cache.clear () . Будьте осторожны с этим; clear () удалит все из кеша, а не только ключи, установленные вашим приложением.

    кеш. сенсорный ( ключ , тайм-аут = DEFAULT_TIMEOUT , версия = нет ) ¶

    cache.touch () устанавливает новый срок действия ключа. Например, чтобы обновить ключ срок действия истекает через 10 секунд:

     >>> cache.touch ('а', 10)
    Правда
     

    Как и другие методы, аргумент тайм-аут является необязательным и по умолчанию TIMEOUT вариант соответствующего бэкэнда в настройке CACHES .

    touch () возвращает True , если клавиша была успешно нажата, False иначе.

    кеш. incr ( ключ , дельта = 1 , версия = нет ) ¶
    кеш. decr ( ключ , дельта = 1 , версия = нет ) ¶

    Вы также можете увеличивать или уменьшать уже существующий ключ, используя incr () или decr () соответственно.По умолчанию существующий кеш значение будет увеличиваться или уменьшаться на 1. Другие значения увеличения / уменьшения можно указать, предоставив аргумент для вызова увеличения / уменьшения. А ValueError будет вызвано, если вы попытаетесь увеличить или уменьшить несуществующий ключ кеша .:

     >>> cache.set ('число', 1)
    >>> cache.incr ('число')
    2
    >>> cache.incr ('число', 10)
    12
    >>> cache.decr ('число')
    11
    >>> cache.decr ('число', 5)
    6
     

    Примечание

    incr () / decr () методы не гарантированно являются атомарными.На тех бэкэнды, поддерживающие атомарное приращение / декремент (в первую очередь, memcached backend) операции увеличения и уменьшения будут атомарными. Однако, если бэкэнд изначально не обеспечивает увеличение / уменьшение операция, она будет реализована с использованием двухэтапного извлечения / обновления.

    кеш. закрыть () ¶

    Вы можете закрыть соединение с кешем с помощью close () , если реализовано бэкэнд кеша.

    Примечание

    Для кешей, которые не реализуют методы close , это не работает.

    Префикс ключа кеша¶

    Если вы разделяете экземпляр кеша между серверами или между вашими среды производства и разработки, возможно кэширование данных одним сервером для использования другим сервером. Если формат кешированного данные на разных серверах различаются, это может привести к тому, что некоторые диагностировать проблемы.

    Чтобы предотвратить это, Django предоставляет возможность добавлять префиксы ко всем ключам кеша. используется сервером. Когда определенный ключ кеша сохраняется или извлекается, Django автоматически префикс ключа кеша со значением KEY_PREFIX настройка кеша.

    Убедившись, что каждый экземпляр Django имеет разные KEY_PREFIX , вы можете убедиться, что не будет коллизии в значениях кеша.

    Управление версиями кэша¶

    Когда вы изменяете работающий код, который использует кешированные значения, вам может потребоваться очистить все существующие кэшированные значения. Самый простой способ сделать это — очистить весь кеш, но это может привести к потере значений кеша которые по-прежнему актуальны и полезны.

    Django предоставляет лучший способ нацеливать отдельные значения кеша.Фреймворк кеширования Django имеет общесистемный идентификатор версии, указывается с помощью параметра кэша ВЕРСИЯ . Значение этого параметра автоматически комбинируется с кешем. префикс и предоставленный пользователем ключ кеша для получения окончательного ключа кеша.

    По умолчанию любой ключевой запрос будет автоматически включать сайт версия ключа кеша по умолчанию. Однако примитивный кеш функционирует все включить аргумент версии , чтобы вы могли указать конкретный кеш версия ключа, которую нужно установить или получить.Например:

     >>> # Установить версию 2 ключа кеширования
    >>> cache.set ('my_key', 'привет, мир!', версия = 2)
    >>> # Получить версию по умолчанию (при условии, что версия = 1)
    >>> cache.get ('my_key')
    Никто
    >>> # Получить 2 версию того же ключа
    >>> cache.get ('my_key', версия = 2)
    'Привет мир!'
     

    Версия определенного ключа может увеличиваться и уменьшаться с помощью методы incr_version () и decr_version () . Этот позволяет перенести определенные ключи на новую версию, оставляя другие ключи не затронуты.Продолжая наш предыдущий пример:

     >>> # Увеличить версию my_key
    >>> cache.incr_version ('my_key')
    >>> # Версия по умолчанию все еще недоступна
    >>> cache.get ('my_key')
    Никто
    # Версия 2 тоже недоступна
    >>> cache.get ('my_key', версия = 2)
    Никто
    >>> # Но есть версия 3 * *
    >>> cache.get ('my_key', версия = 3)
    'Привет мир!'
     

    Преобразование ключа кэша¶

    Как описано в предыдущих двух разделах, ключ кеша, предоставляемый user не используется дословно — он сочетается с префиксом кеша и key version, чтобы предоставить окончательный ключ кеша.По умолчанию три части соединяются с использованием двоеточия для получения последней строки:

     def make_key (ключ, префикс ключа, версия):
        вернуть '% s:% s:% s'% (префикс_ключа, версия, ключ)
     

    Если вы хотите объединить части по-разному или применить другие обработка до последнего ключа (например, взятие хеш-дайджеста ключа частей), вы можете предоставить настраиваемую ключевую функцию.

    Настройка кэша KEY_FUNCTION указывает пунктирный путь к функции, соответствующей прототипу make_key () выше.Если эта функция предусмотрена, эта настраиваемая клавиша будет использоваться вместо функции комбинирования клавиш по умолчанию.

    Предупреждения о ключах кеширования¶

    Memcached, наиболее часто используемый серверный модуль кеш-памяти, не позволяет ключи кеша длиннее 250 символов или содержащие пробелы или элементы управления символов, и использование таких ключей вызовет исключение. Поощрять кеш-переносимый код и минимизация неприятных сюрпризов, другой встроенный кеш бэкенды выдают предупреждение ( django.core.cache.backends.base.CacheKeyWarning ) если используется ключ, это вызовет ошибку в memcached.

    Если вы используете производственный бэкэнд, который может принимать более широкий диапазон ключей ( пользовательский бэкэнд или один из встроенных бэкэндов без memcached) и хотите использовать этот более широкий диапазон без предупреждений, вы можете отключить CacheKeyWarning с помощью этот код в модуле управления одного из ваших УСТАНОВЛЕННЫЕ ПРИЛОЖЕНИЯ :

     предупреждения об импорте
    
    из django.core.cache import CacheKeyWarning
    
    предупреждения.simplefilter ("игнорировать", CacheKeyWarning)
     

    Если вы хотите вместо этого предоставить настраиваемую логику проверки ключа для одного из встроенные бэкэнды, вы можете создать подклассы, переопределив только validate_key и следуйте инструкциям по использованию настраиваемого серверного модуля кеширования. Для Например, чтобы сделать это для бэкэнда locmem , поместите этот код в модуль:

     из django.core.cache.backends.locmem импорт LocMemCache
    
    класс CustomLocMemCache (LocMemCache):
        def validate_key (сам, ключ):
            "" "Пользовательская проверка, создание исключений или предупреждений по мере необходимости."" "
            ...
     

    … и используйте пунктирный путь Python к этому классу в BACKEND часть настройки CACHES .

    Кэш нисходящего потока¶

    До сих пор этот документ был посвящен кэшированию ваших собственных данных . Но другой тип кэширования актуально и для веб-разработки: кеширование выполняется «Нисходящие» кеши. Это системы, которые кэшируют страницы для пользователей еще до того, как запрос достигает вашего веб-сайта.

    Вот несколько примеров нисходящих кешей:

    • Ваш интернет-провайдер может кэшировать определенные страницы, поэтому, если вы запросили страницу из https: // пример.com /, ваш интернет-провайдер отправит вам страницу без необходимости доступ к example.com напрямую. Сопровождающие example.com не имеют знание этого кеширования; Интернет-провайдер находится между example.com и вашим Интернетом. браузер, прозрачно обрабатывающий все кеширование.
    • Ваш сайт Django может находиться за прокси-кешем , таким как Squid Web Прокси-кеш (http://www.squid-cache.org/), который кэширует страницы для представление. В этом случае каждый запрос сначала будет обрабатываться прокси, и он будет передан вашему приложению только в случае необходимости.
    • Ваш веб-браузер также кэширует страницы. Если веб-страница отправляет соответствующие заголовки, ваш браузер будет использовать локальную кэшированную копию для последующие запросы к этой странице, даже не обращаясь к веб-странице еще раз, чтобы увидеть, изменилось ли оно.

    Кэширование в нисходящем направлении — хороший прирост эффективности, но в этом есть опасность: Содержание многих веб-страниц различается в зависимости от аутентификации и множества других переменные и системы кеширования, которые слепо сохраняют страницы, основанные исключительно на URL-адресах, могут предоставлять неверные или конфиденциальные данные последующим посетителям этих страниц.

    Например, если вы используете систему электронной почты в Интернете, то содержимое Страница «Входящие» зависит от того, какой пользователь вошел в систему. Если интернет-провайдер слепо кэшировал ваш сайт, то первый пользователь, вошедший через этого интернет-провайдера, будет иметь пользовательская страница почтового ящика кэшируется для последующих посетителей сайта. Это не круто.

    К счастью, HTTP предоставляет решение этой проблемы. Количество заголовков HTTP существуют, чтобы дать указание нижестоящим кэшам различать их содержимое кеша в зависимости от обозначенные переменные, и сообщить механизмам кэширования не кэшировать определенные страниц.Мы рассмотрим некоторые из этих заголовков в следующих разделах.

    Использование заголовков

    Vary

    Заголовок Vary определяет, какие заголовки запросов кэшировать. Механизм должен учитывать при построении своего ключа кеша. Например, если содержание веб-страницы зависит от языковых предпочтений пользователя, страница сказал, чтобы «варьироваться в зависимости от языка».

    По умолчанию система кеширования Django создает свои ключи кеша, используя запрошенные полный URL — например,, "https://www.example.com/stories/2005/?order_by=author" . Это означает, что каждый запрос к этому URL-адресу будет использовать ту же кешированную версию, независимо от пользовательского агента различия, такие как файлы cookie или языковые предпочтения. Однако, если эта страница создает разный контент на основе некоторой разницы в заголовках запросов — например, в качестве файла cookie, языка или агента пользователя — вам необходимо использовать Vary заголовок, чтобы сообщить механизмам кеширования, что вывод страницы зависит от этих вещей.

    Для этого в Django используйте удобный джанго.views.decorators.vary.vary_on_headers () декоратор представления, например:

     из django.views.decorators.vary импортировать var_on_headers
    
    @vary_on_headers ("Пользователь-агент")
    def my_view (запрос):
        ...
     

    В этом случае механизм кэширования (такой как собственное промежуточное ПО кеширования Django) будет кешировать отдельную версию страницы для каждого уникального пользовательского агента.

    Преимущество использования декоратора variable_on_headers , а не вручную установка заголовка Vary (используя что-то вроде ответа .заголовки ['Vary'] = 'user-agent' ) заключается в том, что декоратор добавляет к заголовку Vary (который может уже существует), а не устанавливать его с нуля и потенциально переопределять все, что уже было там.

    Вы можете передать несколько заголовков в vary_on_headers () :

     @vary_on_headers ('User-Agent', 'Cookie')
    def my_view (запрос):
        ...
     

    Это говорит о том, что нижестоящие кеши должны различаться на и , что означает, что каждая комбинация user-agent и cookie получат собственное значение кеша.Например, запрос с будут учитываться пользовательский агент Mozilla и значение cookie foo = bar отличается от запроса с пользовательским агентом Mozilla и значением cookie foo = ветчина .

    Поскольку изменение файлов cookie является обычным явлением, существует django.views.decorators.vary.vary_on_cookie () декоратор. Эти два взгляда эквивалентны:

     @vary_on_cookie
    def my_view (запрос):
        ...
    
    @vary_on_headers ('Cookie')
    def my_view (запрос):
        ...
     

    Заголовки, которые вы передаете в variable_on_headers , не чувствительны к регистру; «User-Agent» — это то же самое, что «user-agent» .

    Вы также можете использовать вспомогательную функцию django.utils.cache.patch_vary_headers () , напрямую. Эта функция устанавливает или добавляет заголовок Vary . Например:

     из django.shortcuts import render
    из django.utils.cache импортировать patch_vary_headers
    
    def my_view (запрос):
        ...
        response = render (запрос, 'имя_шаблона', контекст)
        patch_vary_headers (ответ, ['Cookie'])
        ответ на ответ
     

    patch_vary_headers принимает экземпляр HttpResponse как его первый аргумент и список / кортеж имен заголовков без учета регистра в качестве его Второй аргумент.

    Подробнее о заголовках Vary см. В официальной спецификации Vary .

    Управление кешем: использование других заголовков¶

    Другие проблемы с кешированием — это конфиденциальность данных и вопрос о том, где данные должны храниться в каскаде кешей.

    Пользователь обычно сталкивается с двумя типами кешей: их собственный кеш браузера (частный cache) и кеш их провайдера (публичный кеш). Публичный кеш используется несколько пользователей и контролируются кем-то другим. Это создает проблемы с конфиденциальные данные — например, вы не хотите, чтобы номер вашего банковского счета хранился в публичный кеш.Таким образом, веб-приложениям нужен способ сообщать кешам, какие данные частный и публичный.

    Решение состоит в том, чтобы указать, что кеш страницы должен быть «частным». Сделать это в Django, используйте представление cache_control () декоратор. Пример:

     из django.views.decorators.cache импорт cache_control
    
    @cache_control (частный = Истина)
    def my_view (запрос):
        ...
     

    Этот декоратор заботится об отправке соответствующего HTTP-заголовка за сцены.

    Обратите внимание, что параметры управления кешем «частный» и «общедоступный» являются взаимно эксклюзивный.Декоратор гарантирует, что директива «public» будет удалена, если «Частный» должен быть установлен (и наоборот). Пример использования двух директив был бы сайтом блога, который предлагает как частные, так и публичные записи. Общественные записи могут кэшироваться в любом общем кэше. В следующем коде используется patch_cache_control () , ручной способ изменения заголовок управления кешем (он вызывается изнутри cache_control () декоратор):

     из django.views.decorators.cache импортировать patch_cache_control
    из джанго.views.decorators.vary import var_on_cookie
    
    @vary_on_cookie
    def list_blog_entries_view (запрос):
        если request.user.is_anonymous:
            response = render_only_public_entries ()
            patch_cache_control (ответ, общедоступный = True)
        еще:
            response = render_private_and_public_entries (request.user)
            patch_cache_control (ответ, частный = True)
    
        ответ на ответ
     

    Вы можете управлять кэшем нисходящего потока и другими способами (см. RFC 7234 для подробности о HTTP-кешировании).Например, даже если вы не используете Django’s фреймворк кеширования на стороне сервера, вы все равно можете указать клиентам кэшировать представление для определенное количество времени с максимальным возрастом директива:

     из django.views.decorators.cache импорт cache_control
    
    @cache_control (max_age = 3600)
    def my_view (запрос):
        ...
     

    (если вы и используете промежуточное ПО кэширования, оно уже устанавливает max-age с значение параметра CACHE_MIDDLEWARE_SECONDS . В этом случае, кастом max_age из cache_control () декоратор примет приоритет, и значения заголовков будут правильно объединены.)

    Любая допустимая директива ответа Cache-Control действительна в cache_control () . Вот еще несколько примеров:

    • no_transform = Истина
    • must_revalidate = True
    • устаревшее_time_revalidate = num_seconds
    • no_cache = True

    Полный список известных директив можно найти в реестре IANA. (обратите внимание, что не все из них применимы к ответам).

    Если вы хотите использовать заголовки для полного отключения кеширования, never_cache () — декоратор представления, добавляет заголовки, чтобы гарантировать, что ответ не будет кеширован браузерами или другими тайники.Пример:

     из django.views.decorators.cache импорт never_cache
    
    @ Never_cache
    def myview (запрос):
        ...
     

    Заказ

    СРЕДНЕЕ ОБЕСПЕЧЕНИЕ

    Если вы используете промежуточное ПО для кэширования, важно размещать каждую половину в правильном поместите в настройку MIDDLEWARE . Это потому, что кеш промежуточному программному обеспечению необходимо знать, какие заголовки используются для изменения кеш-хранилища. Промежуточное ПО всегда добавляет что-то в заголовок ответа Vary , когда это возможно.

    UpdateCacheMiddleware запускается во время фазы ответа, где промежуточное ПО выполняются в обратном порядке, поэтому элемент в верхней части списка запускает последних во время фаза ответа. Таким образом, вам необходимо убедиться, что UpdateCacheMiddleware появляется перед , любое другое промежуточное ПО, которое может что-то добавить к Vary заголовок. Следующие промежуточные модули делают это:

    • SessionMiddleware добавляет Cookie
    • GZipMiddleware добавляет Accept-Encoding
    • LocaleMiddleware добавляет Accept-Language

    FetchFromCacheMiddleware , с другой стороны, выполняется во время фазы запроса, где промежуточное ПО применяется в порядке очереди, поэтому элемент в верхней части списка запускает первый на этапе запроса. FetchFromCacheMiddleware также должен запускаться после того, как другое промежуточное ПО обновит заголовок Vary , поэтому FetchFromCacheMiddleware должен быть после любого элемента, который это делает.

    Модуль ngx_http_memcached_module

    Модуль ngx_http_memcached_module

    Модуль ngx_http_memcached_module используется для получения ответы от сервера memcached. Ключ устанавливается в переменной $ memcached_key . Ответ нужно заранее поместить в memcached с помощью внешний по отношению к nginx.

    Пример конфигурации
    server {
        место расположения / {
            установить $ memcached_key "$ uri? $ args";
            хост memcached_pass: 11211;
            error_page 404 502 504 = @fallback;
        }
    
        location @fallback {
            proxy_pass http: // backend;
        }
    }
     
    Директивы
    Синтаксис: memcached_bind адрес [ прозрачный ] | с ;
    По умолчанию:
    Контекст: http , сервер , расположение

    Эта директива появилась в версии 0.8.22.

    Создает исходящие соединения с сервером memcached с указанного локального IP-адреса с дополнительным портом (1.11.2). Значение параметра может содержать переменные (1.3.12). Специальное значение от (1.3.12) отменяет эффект директивы memcached_bind унаследованный от предыдущего уровня конфигурации, что позволяет система для автоматического назначения локального IP-адреса и порта.

    Параметр transparent (1.11.0) позволяет исходящие соединения с сервером memcached исходят с нелокального IP-адреса, например, с реального IP-адреса клиента:

    memcached_bind $ remote_addr прозрачный;
     

    Чтобы этот параметр работал, обычно необходимо запускать рабочие процессы nginx с привилегии суперпользователя.В Linux это не требуется (1.13.8), как если бы указан параметр transparent , рабочие процессы унаследовать возможность CAP_NET_RAW от главного процесса. Также необходимо настроить таблицу маршрутизации ядра. для перехвата сетевого трафика с сервера memcached.

    Синтаксис: memcached_buffer_size размер ;
    По умолчанию:
     memcached_buffer_size 4k | 8k; 
    Контекст: http , сервер , расположение

    Устанавливает размер буфера, используемого для чтения ответа получено с сервера memcached.Ответ передается клиенту синхронно, как только он получен.

    Синтаксис: memcached_connect_timeout время ;
    По умолчанию:
     memcached_connect_timeout 60 с; 
    Контекст: http , сервер , расположение

    Определяет тайм-аут для установления соединения с сервером memcached.Следует отметить, что этот таймаут обычно не может превышать 75 секунд.

    Синтаксис: memcached_force_ranges на | с ;
    По умолчанию:
     memcached_force_ranges выключено; 
    Контекст: http , сервер , расположение

    Эта директива появилась в версии 1.7.7.

    Включает поддержку байтового диапазона как для кешированных, так и для некэшированных ответов от сервера memcached независимо от поля «Accept-Ranges» в этих ответах.

    Синтаксис: memcached_gzip_flag флаг ;
    По умолчанию:
    Контекст: http , сервер , расположение

    Эта директива появилась в версии 1.3.6.

    Включает проверку наличия флага в memcached ответ сервера и устанавливает « Content-Encoding » поле заголовка ответа на « gzip » если установлен флаг.

    Синтаксис: memcached_next_upstream ошибка | тайм-аут | invalid_response | not_found | с ...;
    По умолчанию:
     время ожидания ошибки memcached_next_upstream; 
    Контекст: http , сервер , расположение

    Определяет, в каких случаях запрос должен быть передан следующему серверу:

    ошибка
    произошла ошибка при установлении соединения с сервер, передавая ему запрос или читая заголовок ответа;
    тайм-аут
    истекло время ожидания при установлении соединения с сервер, передавая ему запрос или читая заголовок ответа;
    invalid_response
    сервер вернул пустой или недопустимый ответ;
    not_found
    ответ на сервере не найден;
    выкл.
    запрещает передачу запроса следующему серверу.

    Следует иметь в виду, что передача запроса на следующий сервер — это возможно только в том случае, если клиенту еще ничего не отправлено. То есть, если ошибка или тайм-аут происходит в середине передача отзыва, исправить это невозможно.

    Директива также определяет, что считается неудачный попытка связи с сервером. Случаи ошибки , таймаута и invalid_response всегда считаются неудачными попытками, даже если они не указаны в директиве.Дело not_found никогда не считается неудачной попыткой.

    Передача запроса на следующий сервер может быть ограничена количество попыток и по времени.

    Синтаксис: memcached_next_upstream_timeout время ;
    По умолчанию:
     memcached_next_upstream_timeout 0; 
    Контекст: http , сервер , расположение

    Эта директива появилась в версии 1.7.5.

    Ограничивает время, в течение которого запрос может быть передан в следующий сервер. Значение 0 снимает это ограничение.

    Синтаксис: memcached_next_upstream_tries номер ;
    По умолчанию:
     memcached_next_upstream_tries 0; 
    Контекст: http , сервер , расположение

    Эта директива появилась в версии 1.7.5.

    Ограничивает количество возможных попыток передачи запроса в следующий сервер. Значение 0 снимает это ограничение.

    Синтаксис: memcached_pass адрес ;
    По умолчанию:
    Контекст: место , если место

    Устанавливает адрес сервера memcached.Адрес может быть указан как доменное имя или IP-адрес, и порт:

    memcached_pass localhost: 11211;
     

    или как путь к сокету домена UNIX:

    memcached_pass unix: /tmp/memcached.socket;
     

    Если доменное имя разрешается на несколько адресов, все они будут используется в циклическом режиме. Кроме того, адрес можно указать как группа серверов.

    Синтаксис: memcached_read_timeout время ;
    По умолчанию:
     memcached_read_timeout 60 с; 
    Контекст: http , сервер , расположение

    Определяет тайм-аут для чтения ответа от сервера memcached.Тайм-аут устанавливается только между двумя последовательными операциями чтения, не для передачи всего ответа. Если сервер memcached ничего не передает в течение этого времени, соединение закрыто.

    Синтаксис: memcached_send_timeout время ;
    По умолчанию:
     memcached_send_timeout 60 с; 
    Контекст: http , сервер , расположение

    Устанавливает тайм-аут для передачи запроса на сервер memcached.Тайм-аут устанавливается только между двумя последовательными операциями записи, не для передачи всего запроса. Если за это время сервер memcached ничего не получит, соединение закрыто.

    Синтаксис: memcached_socket_keepalive на | с ;
    По умолчанию:
     memcached_socket_keepalive выключен; 
    Контекст: http , сервер , расположение

    Эта директива появилась в версии 1.15.6.

    Настраивает поведение TCP keepalive. для исходящих подключений к серверу memcached. По умолчанию для сокета действуют настройки операционной системы.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *