Первые шаги с 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
- Перейдите на официальный сайт проекта Redis или используйте менеджер пакетов Chocolatey.
- Скачайте дистрибутив для Windows (например, версию от Microsoft или официальную сборку).
- Запустите исполняемый файл
Redis-x64-*.exe. - Следуйте инструкциям мастера установки:
- Выберите тип установки "Complete".
- Укажите порт подключения (стандартное значение — 6379).
- Настройте параметры запуска службы. Рекомендуется выбрать "Run as a service".
- Завершите установку и откройте консоль для проверки работы.
Вариант В — Использование 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)
- Подключитесь к
127.0.0.1:6379. - Выберите DB 0, DB 1 и т.д.
- Ключи из 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. Однако функциональность представлений реализуются через:
- Вычисляемые ключи: Ключи, содержащие результат агрегации.
- Lua-скрипты: Скрипты, выполняющие сложные запросы и возвращающие результат.
- Команды
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 нет встроенных триггеров или хранимых процедур в классическом понимании. Логика реализуется через:
- Lua-скрипты (выполняются на сервере).
- Pub/Sub (система публикаций/подписок).
- 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 (аналог триггера)
Реализация автоматического уведомления при изменении данных.
- Подписка на канал:
SUBSCRIBE new_employee_alerts
- Отправка сообщения (при вставке нового сотрудника):
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, Первые шаги к микросервисам.