Установка Redis и Memcached: Руководство по кэш-слою
Установка Redis и Memcached на Ubuntu/Debian, основные команды, настройки персистентности, конфигурация TTL, сравнение Redis и Memcached, интеграция с приложениями.
Установка Redis и Memcached: Руководство по кэш-слою
Кэш-слой — это критически важный компонент инфраструктуры, который значительно повышает производительность веб-приложений. Сохраняя запросы к базе данных, ответы API и результаты вычислений в памяти, он обеспечивает ответы за миллисекунды на повторяющиеся запросы. В этом руководстве рассматривается установка, настройка и интеграция Redis и Memcached — двух наиболее широко используемых систем кэширования.
Redis против Memcached
Обе системы предлагают высокопроизводительное хранение данных в памяти, но ориентированы на разные сценарии использования:
Функция
Redis
Memcached
Структуры данных
String, Hash, List, Set, ZSet
Только String
Персистентность
RDB + AOF
Нет
Репликация
Master-Replica + Cluster
Нет
Pub/Sub
Да
Нет
Lua-скриптинг
Да
Нет
Многопоточность
Частичная (I/O)
Полная
Эффективность памяти
Средняя
Высокая
Redis рекомендуется для новых проектов. Благодаря богатым структурам данных, персистентности и поддержке репликации он охватывает гораздо больше сценариев использования. Memcached предпочтителен только при необходимости простого строкового кэширования и максимальной многопоточной производительности.
Установка Redis (Ubuntu/Debian)
Установка из репозитория пакетов
hljs bash
# Обновить список пакетов
apt update
# Установить Redis
apt install -y redis-server
# Проверить статус службы
systemctl status redis-server
# Включить автозапуск
systemctl enable redis-server
Установка из официального репозитория Redis (последняя версия)
hljs bash
# Установить необходимые инструменты
apt install -y curl gpg
# Добавить GPG-ключ Redis
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
# Добавить репозиторийecho'deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb '$(lsb_release -cs)' main' | tee /etc/apt/sources.list.d/redis.list
# Обновить и установить
apt update
apt install -y redis
# Адрес прослушивания (только localhost)
bind 127.0.0.1
# Порт (по умолчанию 6379)
port 6379
# Защита паролем
requirepass НадёжныйПарольRedis123!
# Максимальное использование памяти
maxmemory 512mb
# Политика вытеснения при заполнении памяти
maxmemory-policy allkeys-lru
# Запуск как демон
daemonize yes
# Файл журнала
logfile /var/log/redis/redis-server.log
# Количество баз данных
databases 16
# Подключиться к Redis CLI
redis-cli
# Подключиться с паролем
redis-cli -a НадёжныйПарольRedis123!
# Подключиться к удалённому серверу
redis-cli -h 192.168.1.100 -p 6379 -a пароль
hljs redis
# Тест подключения
PING
# Ответ: PONG
# Установить строковое значение
SET пользователь:1:имя 'Иван Иванов'
# Прочитать значение
GET пользователь:1:имя
# Установить значение с TTL (в секундах)
SETEX сессия:abc123 3600 'данные_пользователя'
# Проверить оставшееся время
TTL сессия:abc123
# Удалить значение
DEL пользователь:1:имя
# Проверить существование ключа
EXISTS пользователь:1:имя
# Список всех ключей (осторожно в продакшене)
KEYS *
# Поиск по шаблону
KEYS пользователь:*
Команды Hash
hljs redis
# Установить hash
HSET пользователь:1 имя 'Иван' email 'ivan@example.com' возраст 30
# Прочитать поле hash
HGET пользователь:1 имя
# Прочитать все поля hash
HGETALL пользователь:1
# Удалить поле hash
HDEL пользователь:1 возраст
# Проверить существование поля hash
HEXISTS пользователь:1 email
Команды List
hljs redis
# Добавить элемент в список (слева)
LPUSH задачи 'задача1' 'задача2'
# Добавить элемент в список (справа)
RPUSH задачи 'задача3'
# Получить элемент из списка (слева)
LPOP задачи
# Длина списка
LLEN задачи
# Диапазон списка
LRANGE задачи 0 -1
Команды Set и Sorted Set
hljs redis
# Добавить элемент в set
SADD теги 'redis' 'cache' 'nosql'
# Список членов set
SMEMBERS теги
# Добавить в sorted set с очками
ZADD таблица_лидеров 1500 'игрок1' 2300 'игрок2' 800 'игрок3'
# Список по порядку (по возрастанию)
ZRANGE таблица_лидеров 0 -1 WITHSCORES
# Список по порядку (по убыванию)
ZREVRANGE таблица_лидеров 0 2 WITHSCORES
Настройки персистентности Redis
RDB (Redis Database) Снимок
RDB записывает снимок всего набора данных на диск через определённые интервалы:
hljs ini
# /etc/redis/redis.conf# Сохранить при 1 изменении за 900 секунд
save 900 1
# Сохранить при 10 изменениях за 300 секунд
save 300 10
# Сохранить при 10000 изменениях за 60 секунд
save 60 10000
# Имя файла RDB
dbfilename dump.rdb
# Директория RDB
dir /var/lib/redis
AOF (Append Only File)
AOF добавляет каждую операцию записи в файл журнала, обеспечивая более надёжную персистентность:
hljs ini
# Включить AOF
appendonlyfile yes
# Имя файла AOF
appendfilename 'appendonly.aof'
# Политика синхронизации# always: При каждой записи (самая безопасная, самая медленная)# everysec: Каждую секунду (рекомендуется)# no: Оставить ОС (самая быстрая, наименее безопасная)
appendsync everysec
# Порог перезаписи AOF
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
В продакшене рекомендуется использовать как RDB, так и AOF. RDB обеспечивает быстрый перезапуск, а AOF минимизирует потерю данных.
Установка Memcached
Установка на Ubuntu/Debian
hljs bash
# Обновить список пакетов
apt update
# Установить Memcached
apt install -y memcached libmemcached-tools
# Проверить статус службы
systemctl status memcached
# Включить автозапуск
systemctl enable memcached
Установка на CentOS/AlmaLinux
hljs bash
# Установить Memcached
dnf install -y memcached
# Запустить и включить службу
systemctl start memcached
systemctl enable memcached
# Лимит памяти (МБ)
-m 256
# Адрес прослушивания
-l 127.0.0.1
# Порт
-p 11211
# Максимальное количество соединений
-c 1024
# Количество потоков (по количеству ядер CPU)
-t 4
# Максимальный размер объекта (байты)
-I 1m
# Подключиться через telnet
telnet 127.0.0.1 11211
# Установить значение (ключ, флаг, TTL секунды, размер байты)
set сессия:xyz 0 3600 12
данные_пользователя
# Получить значение
get сессия:xyz
# Удалить значение
delete сессия:xyz
# Просмотр статистики
stats
# Очистить все данные
flush_all
Интеграция с приложениями
PHP с Redis
hljs bash
# Установить расширение PHP Redis
apt install -y php-redis
systemctl restart php8.x-fpm
hljs php
<?php$redis = newRedis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('НадёжныйПарольRedis123!');
// Записать в кэш$redis->setex('пользователь:1', 3600, json_encode(['имя' => 'Иван', 'email' => 'ivan@example.com']));
// Прочитать из кэша
$данные = $redis->get('пользователь:1');
if ($данные) {
$пользователь = json_decode($данные, true);
} else {
// Получить из базы данных и кэшировать
$пользователь = получить_из_бд(1);
$redis->setex('пользователь:1', 3600, json_encode($пользователь));
}
import redis
import json
r = redis.Redis(
host='127.0.0.1',
port=6379,
password='НадёжныйПарольRedis123!',
decode_responses=True
)
# Записать в кэш
r.setex('статья:5', 7200, json.dumps({'заголовок': 'Руководство по Redis', 'содержание': '...'}))
# Прочитать из кэша
данные = r.get('статья:5')
if данные:
статья = json.loads(данные)
Управление службами
hljs bash
# Управление службой Redis
systemctl start redis-server
systemctl stop redis-server
systemctl restart redis-server
systemctl status redis-server
# Просмотр журналов Redis
journalctl -u redis-server -f
tail -f /var/log/redis/redis-server.log
# Получить информацию Redis через CLI
redis-cli INFO server
redis-cli INFO memory
redis-cli INFO stats
# Управление службой Memcached
systemctl start memcached
systemctl stop memcached
systemctl restart memcached
systemctl status memcached
Заключение
Redis и Memcached — мощные решения для кэширования, которые значительно повышают производительность приложений. Богатые структуры данных и функции персистентности Redis делают его идеальным для большинства сценариев, тогда как Memcached может быть предпочтителен для простых высокопроизводительных задач строкового кэширования. Обе системы без проблем работают на серверах REXE.
Часто задаваемые вопросы
Что выбрать между Redis и Memcached?
Redis рекомендуется для новых проектов. Он предлагает богатые структуры данных помимо строк — Hash, List, Set, Sorted Set; обеспечивает персистентность с RDB и AOF; поддерживает Pub/Sub-обмен сообщениями и Lua-скриптинг. Memcached предпочтителен только для простого строкового кэширования и максимальной многопоточной производительности. Для большинства веб-приложений Redis является лучшим выбором.
Как выбрать maxmemory-policy в Redis?
Наиболее распространённые политики: allkeys-lru (удалять наименее недавно использованные среди всех ключей — рекомендуется для общего кэша), volatile-lru (LRU среди ключей с TTL — для смешанного использования), allkeys-lfu (удалять наименее часто используемые — для повторяющихся паттернов доступа), noeviction (возвращать ошибку при заполнении памяти — для критических данных). Для общего кэширования allkeys-lru является наиболее безопасным выбором.
Что использовать для персистентности Redis: RDB или AOF?
Использование обоих вместе является лучшим подходом. RDB создаёт периодические снимки и обеспечивает быстрый перезапуск, но данные с момента последнего снимка могут быть потеряны. AOF записывает каждую операцию записи и минимизирует потерю данных, но использует больше дискового I/O. В продакшене включите оба: RDB с директивами save и AOF с appendonlyfile yes.
Как включить внешний доступ к Redis?
В redis.conf измените bind 127.0.0.1 на bind 0.0.0.0 и установите надёжный пароль с помощью requirepass. Затем откройте порт 6379 в брандмауэре: ufw allow 6379/tcp. В целях безопасности вместо прямого открытия Redis в интернет рекомендуется использовать SSH-туннелирование или VPN. По возможности ограничьте доступ конкретными IP-адресами.
Можно ли постоянно хранить данные в Memcached?
Нет, Memcached является чисто in-memory системой без поддержки персистентности. Все данные теряются при перезапуске сервера. Поэтому Memcached следует использовать только для временных кэш-данных, которые можно восстановить. Для постоянного хранения данных или управления сессиями используйте Redis.
Как отслеживать использование памяти Redis?
Используйте redis-cli INFO memory для просмотра подробной статистики памяти. Обратите внимание на used_memory (используемая память), maxmemory (максимальный лимит) и mem_fragmentation_ratio (коэффициент фрагментации). Если коэффициент фрагментации превышает 1,5, можно оптимизировать память командой MEMORY PURGE. Также можно отслеживать статистику в реальном времени с помощью redis-cli --stat.
Пошаговая установка MySQL и MariaDB на Linux, mysql_secure_installation, создание баз данных и пользователей, основные SQL-команды, настройка удалённого доступа и оптимизация производительности.
Установка PostgreSQL на Ubuntu/Debian и RHEL/CentOS, создание пользователей и баз данных, основные SQL-команды, настройка удалённого подключения и резервное копирование. Пошаговое руководство.