Перейти к содержанию

cache: Http кэш для redis, может обслуживать устаревшие ответы и с использованием "lua-resty-lock" позволяет только одному запросу заполнять новый кэш

Установка

Если вы еще не настроили подписку на RPM репозиторий, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-cache

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-cache

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-cache v1.0.0, выпущенный 7 августа 2015 года.


одна библиотека lua для работы с srcache, может обслуживать устаревшие ответы и с использованием "lua-resty-lock" позволяет только одному запросу заполнять новый кэш.

  1. если кэш отсутствует, пропустите srcache_fetch и сделайте единственный запрос для заполнения нового кэша, другие запросы с тем же cache_key просто ждут успешного обновления кэша.
  2. всегда устанавливайте время истечения redis на (реальное время истечения + время устаревания), чтобы можно было найти устаревшие данные в redis.
  3. если получены устаревшие данные из redis, просто отправьте устаревшие данные клиенту (используя ngx.eof(), клиент может закрыть это соединение).
  4. затем сделайте подзапрос для заполнения нового кэша (используя lua-resty-lock, чтобы только один запрос отправлялся на бэкенд сервер).

Синопсис

upstream www {
    server 127.0.0.1:9999;
}
upstream redis {
    server 127.0.0.1:6379;
    keepalive 1024;
}
lua_shared_dict srcache_locks 1m;
location /api {
    set $cache_lock srcache_locks;
    set $cache_ttl /redisttl;
    set $cache_persist /redispersist;
    set $cache_key "$http_user_agent|$uri";
    set $cache_stale 100;
    set $cache_lock_exptime 30;
    set $cache_backend_lock_timeout 0.01;
    set $cache_lock_timeout 3;
    set $cache_lock_timeout_wait 0.06;
    set $cache_skip_fetch "X-Skip-Fetch";
    set_escape_uri $escaped_key $cache_key;

    rewrite_by_lua_file /usr/local/openresty/lualib/resty/cache.lua;

    if ($http_x_skip_fetch != TRUE){ srcache_fetch GET /redis $cache_key;}
    srcache_store PUT /redis2 key=$escaped_key&exptime=105;
    add_header X-Cache $srcache_fetch_status;
    add_header X-Store $srcache_store_status;
    #echo hello world;
    proxy_pass http://www;
}
location = /redisttl {
    internal;
    set_unescape_uri $key $arg_key;
    set_md5 $key;
    redis2_query ttl $key;
    redis2_pass redis;
}
location = /redispersist {
    internal;
    set_unescape_uri $key $arg_key;
    set_md5 $key;
    redis2_query persist $key;
    redis2_pass redis;
}
location = /redis {
    internal;
    set_md5 $redis_key $args;
    redis_pass redis;
}
location = /redis2 {
    internal;
    set_unescape_uri $exptime $arg_exptime;
    set_unescape_uri $key $arg_key;
    set_md5 $key;
    redis2_query set $key $echo_request_body;
    redis2_query expire $key $exptime;
    redis2_pass redis;
}

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-cache.