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

Первые шаги с 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, Первые шаги к микросервисам.