Перейти к основному содержимому

Первые шаги с Redis

Разработчику Аналитику Тестировщику
Архитектору Инженеру


Установка системы Redis​

Практикум после теории Redis: ставим redis-server, пробуем типы и CRUD в redis-cli. Команды и ограничения — в справочнике.

Нужны сервер (redis-server) и клиент (redis-cli, протокол RESP). Эмулятор ниже упрощён — для полноты используйте Docker или локальный redis-server.

Установка программ обычно выглядит так (на Windows — установщик Redis от разработчика):

Play ITЗагрузка интерактивного демо…

Play ITЗагрузка интерактивного демо…


Требования к системе​

  • Операционная система: Windows, Linux (Debian/Ubuntu/CentOS) или macOS.
  • Права администратора на машине.
  • Доступ к интернету для загрузки установочных пакетов.
  • Минимум 512 МБ оперативной памяти (рекомендуется 1 ГБ).

Алгоритм установки​

Вариант А — Установка на Linux (на примере Ubuntu/Debian)​

На Ubuntu/Debian:

sudo apt update
sudo apt install redis-server

Проверка службы:

sudo systemctl status redis

Клиент:

redis-cli

Вариант Б — Установка на Windows​

  1. Перейдите на официальный сайт проекта Redis или используйте менеджер пакетов Chocolatey.
  2. Скачайте дистрибутив для Windows (например, версию от Microsoft или официальную сборку).
  3. Запустите исполняемый файл Redis-x64-*.exe.
  4. Следуйте инструкциям мастера установки:
    • Выберите тип установки "Complete".
    • Укажите порт подключения (стандартное значение — 6379).
    • Настройте параметры запуска службы. Рекомендуется выбрать "Run as a service".
  5. Завершите установку и откройте консоль для проверки работы.

Вариант В — Использование Docker (универсальный способ)​

Создание контейнера с базой данных позволяет изолировать среду разработки:

docker run --name my-redis \
-d \
-p 6379:6379 \
redis:latest

Подключение к контейнеру:

docker exec -it my-redis redis-cli

Логические базы данных (SELECT)​

В PostgreSQL "база" — отдельный каталог. В Redis всё в одной памяти процесса; номера DB (0–15 по умолчанию) — независимые пространства имён ключей.

ВопросОтвет
Одинаковое имя ключа в DB0 и DB1?Два разных ключа
Нужен ли SELECT в production?Часто все сервисы в DB 0; важнее префиксы user:, cache:

Командный способ​

SELECT 1
# OK

SET demo:hello "in database 1"
SELECT 0
GET demo:hello
# (nil)

Графический способ (RedisInsight)​

  1. Подключитесь к 127.0.0.1:6379.
  2. Выберите DB 0, DB 1 и т.д.
  3. Ключи из DB1 не видны в DB0 — разные namespace, а не фильтр по имени.

Создание структур данных и вставка элементов​

В отличие от таблиц, в Redis нет жесткой схемы. Данные хранятся в виде ключей и значений. Тип данных определяется при создании ключа. Основные типы — строка (String), список (List), множество (Set), сортированное множество (Sorted Set), хэш (Hash).


Синтаксис вставки строки​

Команда SET создает или обновляет строковое значение.

SET company_name "Universe IT"
GET company_name

Результат: "Universe IT"


Синтаксис вставки хэша​

Хэш удобен для хранения объектов, таких как профиль сотрудника, где каждый атрибут — это отдельное поле.

HSET employee:1001 first_name "Ivan"
HSET employee:1001 last_name "Ivanov"
HSET employee:1001 email "ivanov@example.com"
HSET employee:1001 salary 75000
HSET employee:1001 hire_date "2024-01-15"

Чтение всех полей хэша:

HGETALL employee:1001

Синтаксис вставки списка​

Список используется для очередей задач или ленты новостей. Элементы добавляются в начало или конец.

LPUSH tasks:queue "Review PR #123"
LPUSH tasks:queue "Fix bug in module X"
LPUSH tasks:queue "Deploy to production"

Чтение списка:

LRANGE tasks:queue 0 -1

Анализ компонентов определения​

  • Ключ: Уникальный идентификатор элемента. Может быть любым текстом, часто используется префикс (например, employee:) для группировки.
  • Значение: Содержимое элемента. Может быть строкой, числом, объектом или массивом.
  • Тип данных: Определяет доступные операции. Нельзя использовать методы списка для строки.
  • Тайм-аут (TTL): Каждому ключу можно задать время жизни, после которого он удалится автоматически.

Ограничения, "индексы" и целостность​

Redis не проверяет внешние ключи и CHECK — это зона приложения или Lua при записи. Доступ по известному ключу очень быстрый.

ЗадачаПодход
Уникальность имени ключаОдин ключ на namespace; повторный SET перезаписывает
Уникальность emailКлюч-индекс index:email:… + SET NX
Поиск по шаблону имёнSCAN (не KEYS в проде)
EXISTS employee:1001
TYPE employee:1001

Скорость — из выбора типа: Hash O(1) по полю, ZSET O(log N) для топ-N. Масштаб — Redis Cluster.


Выполнение CRUD операций​

CRUD (Create, Read, Update, Delete) в Redis реализуется через специфичные команды для каждого типа данных.


Создание записей (Create)​

Вставка строки:

SET user:status "online" EX 3600 NX

Параметры: EX 3600 устанавливает время жизни в секундах (1 час), NX означает создание только если ключ не существует.

Вставка хэша:

HSET user:1001 name "Maria" age 28 city "Ufa"

Вставка списка:

RPUSH notifications "New message from Ivan" "Система update"

Чтение данных (Read)​

Выборка строки:

GET user:status

Выборка конкретного поля хэша:

HGET user:1001 city

Выборка нескольких полей хэша:

HMGET user:1001 name age

Чтение всего списка:

LRANGE notifications 0 -1

Поиск ключей по шаблону (не по содержимому):

# Только на маленькой учебной БД —
KEYS user:*

# В production —
SCAN 0 MATCH user:* COUNT 100

См. anti-patterns.


Обновление данных (Update)​

Изменение значения строки:

SET user:status "offline"

Обновление поля хэша:

HSET user:1001 salary 80000

Добавление элемента в список:

RPUSH notifications "Alert: Server load high"

Инкрементация числа (счетчик):

INCR counter:page_views
INCRBY counter:downloads 50

Удаление данных (Delete)​

Удаление конкретного ключа:

DEL user:1001

Массовое удаление по шаблону — через SCAN + UNLINK (bash):

redis-cli --scan --pattern 'user:*' | xargs -r -L 100 redis-cli UNLINK

В redis-cli одной командой так не сделать. Не используйте KEYS + массовый DEL на production.

Очистка всей базы данных (осторожно!):

FLUSHDB

Создание представлений (Views)​

В Redis нет концепции представлений (VIEW) в том виде, в котором они есть в SQL или MongoDB. Однако функциональность представлений реализуются через:

  1. Вычисляемые ключи: Ключи, содержащие результат агрегации.
  2. Lua-скрипты: Скрипты, выполняющие сложные запросы и возвращающие результат.
  3. Команды MGET и HMGET: Групповая выборка данных для формирования виртуальной таблицы на стороне клиента.

Пример реализации "представления" через вычисляемый ключ​

Представление списка активных сотрудников:

SADD active_employees "user:1001" "user:1002" "user:1003"
SMEMBERS active_employees

Если структура данных меняется, достаточно обновить набор, и "представление" будет актуальным.


Использование Lua-скрипта для сложной логики​

Скрипт может выполнить серию команд атомарно и вернуть результат, имитируя сложную выборку.

-- Скрипт для получения имени и зарплаты сотрудника
local name = redis.call('HGET', KEYS[1], 'name')
local salary = redis.call('HGET', KEYS[1], 'salary')
return {name, salary}

Вызов скрипта:

EVAL "local name = redis.call('HGET', KEYS[1], 'name'); local salary = redis.call('HGET', KEYS[1], 'salary'); return {name, salary}" 1 user:1001

Создание функций и процедур с агрегатными функциями и Join​

В Redis нет встроенных триггеров или хранимых процедур в классическом понимании. Логика реализуется через:

  1. Lua-скрипты (выполняются на сервере).
  2. Pub/Sub (система публикаций/подписок).
  3. Streams (очереди сообщений).

"Агрегация" через Lua​

Подготовка:

SADD dept:1:members 1001 1002
HSET dept:1:emp:1001 salary 75000
HSET dept:1:emp:1002 salary 82000
local ids = redis.call('SMEMBERS', KEYS[1])
local prefix = ARGV[1]
local total, count = 0, 0
for _, id in ipairs(ids) do
local s = redis.call('HGET', prefix .. id, 'salary')
if s then total = total + tonumber(s); count = count + 1 end
end
if count == 0 then return 0 end
return total / count
EVAL "<скрипт>" 1 dept:1:members dept:1:emp:

Цикл for i = 1, 2 в старых примерах — учебная заглушка; в проде — SMEMBERS или ключи в KEYS[] скрипта.


Процедура с использованием Pub/Sub (аналог триггера)​

Реализация автоматического уведомления при изменении данных.

  1. Подписка на канал:
SUBSCRIBE new_employee_alerts
  1. Отправка сообщения (при вставке нового сотрудника):
PUBLISH new_employee_alerts "Новый сотрудник: Maria Petrova, Зарплата: 82000"

Это позволяет разделить логику записи данных и реакцию на них.


Триггерная логика (Validation Rules)​

Проверка условий перед записью реализуется в приложении или через Lua-скрипт, который блокирует операцию при нарушении правил.

Пример проверки: зарплата не может быть отрицательной.

-- Lua скрипт проверки
local key = KEYS[1]
local salary = tonumber(ARGV[1])

if salary < 0 then
return "ERROR: Salary cannot be negative"
end

redis.call('HSET', key, 'salary', salary)
return "OK"

Вызов:

EVAL "..." 1 user:1001 -5000
-- Результат: ERROR: Salary cannot be negative

В подборках​

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первые шаги с MongoDB, Первые шаги с Cassandra, Первые шаги с SQL, Первые шаги с Memcached, Первая программа на Expo, Первые шаги к микросервисам.