Установка, настройка, оптимизация хранилища Redis

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

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

  • высокая скорость;
  • GitHub, Weibo, Pinterest, Snapchat, Craigslist, Digg, StackOverflow, Flickr выбрали это хранилище;
  • поддерживается практически всеми языками программирования, в том числе JavaScript, Java, Go, C, C++, C#, Python, Objective-C, PHP;
  • имеет открытый исходный код.

Redis легко устанавливается Как установить Redis в Docker.

В Ubuntu 22 для установки Redis выполните нижеприведенную команду, вторая команда включает поддержку Redis в PHP:

apt install redis
apt install php8.1-redis

Чтобы проверить, что Redis работает, воспользуйтесь командной строкой Redis. Для доступа к командной строке используйте команду redis-cli.

redis-cli

Примечание: Если вы уже установили пароль для Redis, авторизуйтесь после установки соединения с помощью auth.

auth your_redis_password

Ответ: OK

Проверьте соединение с сервером с помощью команды ping:

Если Redis работает правильно, вы увидите ответ: PONG

Вывести полностью информацию о сервер Redis или для конкретного блока:

redis-cli info
redis-cli info stats

Вывести все базы и количество ключей в них

redis-cli INFO keyspace
# Keyspace
db0:keys=6871,expires=51,avg_ttl=351286990

Посмотреть объем памяти, выделенной для Redis:

redis-cli INFO memory | grep used_memory
 
used_memory:871696
used_memory_human:851.27K
used_memory_rss:11415552
used_memory_rss_human:10.89M
used_memory_peak:933904
used_memory_peak_human:912.02K
used_memory_peak_perc:93.34%
used_memory_overhead:809688
used_memory_startup:809688
used_memory_dataset:62008
used_memory_dataset_perc:100.00%
used_memory_lua:41984
used_memory_lua_human:41.00K
used_memory_scripts:0
used_memory_scripts_human:0B
  • used_memory_human сообщает общее количество памяти, занятой сервисом Redis для хранения данных. Из-за фрагментации памяти это значение будет отличаться от объема памяти, выделенной для Redis операционной системой.
  • used_memory_peak_human показывает максимальное значение памяти, занимаемой Redis.

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

Метрика connected_clients показывает количество клиентов, подключенных к Redis. Если клиентов слишком много, возможны проблемы с обработкой запросов. Параметр maxclients в файле конфигурации Redis /etc/redis/redis.conf задает максимально допустимое количество клиентов. По умолчанию это количество равно 10000, но в зависимости от конфигурации ОС, например, от ограничений на количество открытых файлов, может потребоваться уменьшить значение параметра maxclients.

redis-cli INFO | grep connected_clients

Место хранения логов настраивается в конфигурационном файле redis.conf (/etc/redis/redis.conf).

Откройте этот файл:

sudo nano /etc/redis/redis.conf

Найдите строку logfile:

logfile /var/log/redis/redis-server.log

Чтобы изменить имя лог-файла или выбрать другой каталог для его хранения, отредактируйте путь.

Если логи не находятся в указанных выше каталогах, попробуйте найти файлы при помощи команды find в каталоге /var/logs.

find /var/log/* -name *redis*

Самый простой способ очистить кеш Redis - использовать команду redis-cli. Базы данных в Redis хранятся индивидуально. Использование команды redis-cli позволяет удалить ключи либо из всех баз данных, либо только из одной указанной базы данных.

redis-cli [номер базы данных] [опция]

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

Чтобы удалить ключи из всех баз данных Redis, используйте следующую команду:

redis-cli flushall

Начиная с версии 4.0.0, Redis может очищать ключи в фоновом режиме, не блокируя ваш сервер. Для этого используйте команду flushall с параметром async:

redis-cli flushall async

По умолчанию объект не ограничен временем жизни, поэтому TTL возвращает -1, после установки значения командой EXPIRE команда TTL уже возвращает оставшееся количество секунд.

redis 127.0.0.1:6379> ttl test:1:string
(integer) -1
redis 127.0.0.1:6379> expire test:1:string 6000
(integer) 1
redis 127.0.0.1:6379> ttl test:1:string
(integer) 5997

Параметры expires и ttl в Redis играют ключевую роль в механизме управления временем жизни ключей. Вот как они функционируют:

expires:

  1. Этот параметр отображает общее количество ключей, для которых установлено время жизни (TTL).
  2. Под "установленным временем жизни" понимается, что эти ключи будут автоматически удалены из базы данных Redis по истечении заданного временного интервала.

ttl (time-to-live):

  1. Для конкретного ключа ttl показывает, сколько времени (в секундах) осталось до его автоматического удаления.
  2. Если к ключу применен TTL, эта команда вернет количество секунд, оставшихся до истечения срока действия ключа. Если ключу не установлен TTL, Redis вернет значение, указывающее на это (обычно -1 или -2, в зависимости от ситуации).

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

Redis хранит данные в памяти и может быть очень быстрым. Однако, если к вашему серверу Redis может подключиться любой, это создает серьезный риск безопасности. AUTH позволяет установить простой пароль, который должен быть предоставлен при подключении к серверу, чтобы обеспечить, что только уполномоченные пользователи могут выполнять команды. Начиная с Redis 6, поддерживается концепция пользователей и ACL (Access Control Lists). Это позволяет создавать разные учетные записи с различными уровнями доступа к командам и ключам. Каждый пользователь может иметь свой собственный пароль и набор разрешений.

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

redis-cli AUTH ваш_пароль
redis-cli -h localhost -a ваш_пароль info

Настройте Redis для использования пароля:

  1. Откройте конфигурационный файл Redis (redis.conf).
  2. Найдите строку, содержащую # requirepass foobared.
  3. Удалите символ # (это комментарий) и замените foobared на ваш собственный пароль.
  4. Сохраните файл и перезапустите Redis.

Пример использования команды AUTH в PHP:

Для использования Redis с авторизацией в PHP, вы можете использовать расширение phpredis. Вот пример кода, демонстрирующего, как подключиться к серверу Redis и выполнить команду с использованием аутентификации:

<?php
// Подключение к Redis
$redis = new Redis();
 
// Попытка подключения
try {
    $redis->connect('127.0.0.1', 6379); // подключение к серверу Redis
    $redis->auth('ваш_пароль'); // аутентификация с паролем
 
    // После аутентификации вы можете использовать команды Redis
    $redis->set('testKey', 'Hello Redis');
    echo "Значение testKey: " . $redis->get('testKey') . PHP_EOL;
 
} catch (RedisException $e) {
    die($e->getMessage());
}
?>

В этом примере:

  • Мы создаем новый экземпляр клиента Redis.
  • Подключаемся к серверу Redis по адресу 127.0.0.1 и порту 6379.
  • Выполняем аутентификацию с помощью метода auth, передавая пароль, который вы установили в конфигурации Redis.
  • Если аутентификация проходит успешно, можно выполнить любую команду, в примере мы устанавливаем и получаем значение ключа testKey.

Убедитесь, что расширение phpredis установлено и настроено для использования в вашем проекте на PHP.

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

Redis поддерживает два типа распределения данных – replication (mirroring, дублирование данных) и sharding (partitioning, сегментирование).

Для подключения Redis к CMS WordPress, вам необходимо выполнить следующие шаги:

  1. Установка Redis на Сервер: Сначала убедитесь, что Redis установлен на вашем сервере. Если вы используете общий хостинг, уточните у вашего провайдера, доступен ли Redis.
  2. Установка PHP расширения для Redis: Установите PHP расширение для Redis на ваш сервер. Это можно сделать через командную строку, используя команду apt install php-redis (для Debian/Ubuntu) или аналогичную в вашей системе.
    apt install php-redis
  3. Установка и активация плагина в WordPress: В WordPress установите плагин, который поддерживает кэширование через Redis, например: Redis Object Cache, W3 Total Cache или платный Object Cache Pro.

Согласно документации на github плагин Redis Object Cache поддерживает Predis, PhpRedis, Relay, репликацию, сентинелы, кластеризацию и WP-CLI.

Открываем файл wp-config.php и прописываем следующие строки в его начало:

<?php
define('WP_REDIS_SCHEME', 'unix');
define('WP_REDIS_PATH', '/var/www/example/.system/redis/socket');
define('WP_CACHE_KEY_SALT', 'prefix');

Вместо prefix в параметре WP_CACHE_KEY_SALT подставьте уникальный префикс для хранения данных в Redis, что важно при использовании Redis для нескольких сайтов.

Redis Object Cache имеет различные команды WP-CLI. Для получения дополнительной информации запустите wp help redis.

  • wp redis status Shows the object cache status and diagnostics
  • wp redis enable Enables the object cache
  • wp redis disable Disables the object cache
  • wp redis update-dropin Updates the object cache drop-in

Краткий ответ:

echo 1 > /proc/sys/vm/overcommit_memory

И тоже самое, если хотите, чтобы изменение сохранилось и после перезагрузки сервера, добавьте строку в /etc/sysctl.conf:

vm.overcommit_memory = 1

И перечитайте конфиг:

# sysctl -p

Расширенный ответ из Redis FAQ.

Схема фонового сохранения Redis основана на семантике копирования при записи системного вызова fork в современных операционных системах: Redis разветвляется (создает дочерний процесс), который является точной копией родителя. Дочерний процесс сбрасывает БД на диск и, наконец, завершает работу. Теоретически дочерний процесс должен использовать столько же памяти, сколько и родитель, являющийся копией, но на самом деле благодаря семантике копирования при записи, реализованной в большинстве современных операционных систем, родительский и дочерний процессы будут совместно использовать общие страницы памяти. Страница будет дублироваться только при ее изменении в дочерней или родительской. Поскольку теоретически все страницы могут изменяться во время сохранения дочерним процессом, Linux не может заранее сказать, сколько памяти займет дочерний процесс, поэтому, если для параметра overcommit_memory установлено значение 0, fork не удастся, если не будет столько свободной оперативной памяти. как требуется, чтобы действительно дублировать все родительские страницы памяти. Если у вас есть набор данных Redis размером 3 ГБ и всего 2 ГБ свободной памяти, произойдет сбой.

Установка overcommit_memory в 1 говорит Linux расслабитьсяLOL и выполнить форк более оптимистичным:-) способом распределения.

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

PQ VPS сервера в 28+ странах.