Перейти к основному содержимому
Вернуться в категорию

Установка Redis и Memcached: Руководство по кэш-слою

Установка Redis и Memcached на Ubuntu/Debian, основные команды, настройки персистентности, конфигурация TTL, сравнение Redis и Memcached, интеграция с приложениями.

Время чтения: 15 мин База данных
redismemcachedcacheустановкаubuntudebianlinuxпроизводительность
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление

Установка Redis и Memcached: Руководство по кэш-слою

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

Redis против Memcached

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

ФункцияRedisMemcached
Структуры данных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

Проверка версии Redis

hljs bash
redis-server --version
# Вывод: Redis server v=7.x.x ...

redis-cli --version
# Вывод: redis-cli 7.x.x

Установка Redis (CentOS/AlmaLinux/Rocky Linux)

hljs bash
# Включить репозиторий EPEL
dnf install -y epel-release

# Установить Redis
dnf install -y redis

# Запустить и включить службу
systemctl start redis
systemctl enable redis

# Проверить статус
systemctl status redis

Настройка Redis

Основной файл конфигурации

hljs bash
# Редактировать файл конфигурации
nano /etc/redis/redis.conf
hljs ini
# Адрес прослушивания (только 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

Применение конфигурации

hljs bash
systemctl restart redis-server

# Проверить конфигурацию
redis-cli -a НадёжныйПарольRedis123! ping
# Вывод: PONG

Основные команды Redis

Подключение и базовые операции

hljs bash
# Подключиться к 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

Настройка Memcached

hljs bash
# Редактировать файл конфигурации
nano /etc/memcached.conf
hljs ini
# Лимит памяти (МБ)
-m 256

# Адрес прослушивания
-l 127.0.0.1

# Порт
-p 11211

# Максимальное количество соединений
-c 1024

# Количество потоков (по количеству ядер CPU)
-t 4

# Максимальный размер объекта (байты)
-I 1m
hljs bash
# Перезапустить службу
systemctl restart memcached

# Проверить подключение
echo 'stats' | nc 127.0.0.1 11211

Основные команды Memcached

hljs bash
# Подключиться через 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 = new Redis();
$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($пользователь));
}

Node.js с Redis

hljs bash
# Установить пакет ioredis
npm install ioredis
hljs javascript
const Redis = require('ioredis');

const redis = new Redis({
  host: '127.0.0.1',
  port: 6379,
  password: 'НадёжныйПарольRedis123!'
});

// Записать в кэш
await redis.setex('товар:42', 1800, JSON.stringify({ название: 'Ноутбук', цена: 999 }));

// Прочитать из кэша
const данные = await redis.get('товар:42');
if (данные) {
  const товар = JSON.parse(данные);
  console.log(товар);
}

// Очистить кэш
await redis.del('товар:42');

Python с Redis

hljs bash
# Установить пакет redis-py
pip install redis
hljs python
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.

Связанные статьи

Установка и базовое управление PostgreSQL

Установка PostgreSQL на Ubuntu/Debian и RHEL/CentOS, создание пользователей и баз данных, основные SQL-команды, настройка удалённого подключения и резервное копирование. Пошаговое руководство.

15 мин
postgresqlбаза данныхустановка
Сетевой трафикВходящий GbpsИсходящий Gbps