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

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

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

Время чтения: 15 мин База данных
redismemcachedcacheустановкаubuntudebianlinuxпроизводительность

Содержание

Установка 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.