Содержание
Введение
Что такое Redis
История создания
Отличия от реляционных баз данных
Области применения Redis
Зачем Redis нужен при тестировании
Принцип работы
Типы данных
Синтаксис команд
СУБД и инструменты для работы с Redis
Выводы
Введение
Если посмотреть современные вакансии для инженеров по тестированию (особенно в области бэкенда, highload или микросервисной архитектуры), Redis встречается в требованиях достаточно регулярно. И это не случайно.
Redis стал стандартным инструментом в инфраструктуре многих проектов. Разработчики его используют — значит, тестировщику тоже полезно понимать, что это такое, как с ним работать и где могут скрываться потенциальные проблемы.
Данная статья — не руководство для администраторов баз данных. Это обзор для QA-инженера, который хочет разобраться в Redis: зачем он нужен, какие возможности даёт в тестировании и как начать применять его на своём проекте.
Материал будет полезен как для подготовки к собеседованиям (чтобы уверенно отвечать на вопросы о Redis), так и для повседневной работы — внедрения дополнительных проверок и ускорения отладки.
Что такое Redis
Redis (REmote DIctionary Server) — это хранилище данных типа «ключ-значение», работающее преимущественно в оперативной памяти. Несмотря на простоту интерфейса, Redis поддерживает различные структуры данных и предоставляет набор атомарных операций над ними.
Ключевая характеристика Redis — высокая скорость операций (единицы микросекунд), достигаемая за счёт отсутствия дисковых операций в основном цикле обработки запросов.
Для понимания масштаба — типичное время выполнения операции в Redis составляет 0.001–0.01 мс (1–10 микросекунд). Для сравнения:
Чтение из оперативной памяти на современном сервере: ~0.1 мс.
Чтение с SSD-диска (случайное): 0.1–0.5 мс — казалось бы, тоже быстро, но при тысячах операций разница становится принципиальной.
Чтение с HDD (случайное): 5–10 мс.
Типичный SQL-запрос к реляционной БД (с индексом, без тяжёлых JOIN): 5–50 мс.
HTTP-запрос к внешнему API: 50–500 мс.
Таким образом, Redis работает примерно в 10 000 раз быстрее типичного SQL-запроса. Если обычный SELECT в PostgreSQL выполняется за 10–50 мс, то Redis отвечает за 0.001–0.01 мс. Конечно, сравнение условное (SQL-запросы бывают разными, а Redis не умеет делать JOIN), но порядок цифр именно такой.
Именно поэтому Redis выбирают для кеширования, счётчиков, лидербордов и других сценариев, где критична низкая задержка.
История создания
Redis был создан в 2009 году Сальваторе Санфилиппо (Salvatore Sanfilippo) для решения проблемы масштабирования его стартапа LLOOGG. Изначальная архитектура на MySQL не справлялась с нагрузкой, что побудило автора разработать собственное in-memory хранилище.

Проект был открыт в том же году и быстро привлёк внимание сообщества. К 2010 году Redis уже использовался в крупных интернет-компаниях, таких как Twitter и GitHub. В 2015 году была основана коммерческая организация Redis Labs (ныне Redis Inc.), которая занимается развитием и поддержкой продукта.
Отличия от реляционных баз данных
Для понимания места Redis в тестировании полезно сравнить его с классическими реляционными СУБД.

Характеристика |
Реляционные СУБД (PostgreSQL, MySQL) |
Redis |
|---|---|---|
Основное хранилище |
Диск (с кешированием в RAM) |
Оперативная память |
Схема данных |
Фиксированная (таблицы, типы колонок) |
Динамическая (тип определяется значением) |
Язык запросов |
SQL (декларативный) |
Команды (императивные: GET, SET, LPUSH) |
Поддержка связей |
Да (JOIN, внешние ключи) |
Нет (связи реализуются на уровне приложения) |
Транзакционность |
ACID, сложные транзакции |
Ограниченная (команды MULTI/EXEC, нет откатов) |
Долговечность |
Гарантированная (журнал WAL) |
Опциональная (RDB-снапшоты, AOF-журнал) |
Из этого сравнения следует, что Redis не заменяет реляционные базы, а решает другой класс задач.
Области применения Redis
Redis используется в следующих типовых сценариях:
Кеширование — хранение результатов тяжёлых запросов, вычислений или внешних вызовов.
Управление сессиями — централизованное хранение состояния пользователя в распределённой системе.
Очереди сообщений — реализация паттернов producer-consumer (списки, потоки).
Лидерборды и рейтинги — сортированные множества позволяют эффективно работать с упорядоченными данными.
Распределённые блокировки — атомарные операции с временем жизни ключа.
Ограничение частоты запросов (rate limiting) — счётчики с автоматическим сбросом.
Реальная аналитика — битовые карты и HyperLogLog для статистики.
Зачем Redis нужен при тестировании
Прямой доступ к Redis предоставляет QA следующие возможности:
Верификация состояния системы — возможность проверить, что приложение записало ожидаемые данные в кеш или очередь, без необходимости ожидать их обработки или отображения через API.
Ускорение проверок — получение значения по ключу занимает миллисекунды, что быстрее выполнения SQL-запроса или ожидания ответа API.
Создание тестовых условий — возможность напрямую установить определённое состояние (например, заблокировать пользователя, обнулить лимиты, добавить запись в очередь) перед выполнением тестового сценария.
Неинвазивность — Redis не блокирует ресурсы при чтении и не требует остановки тестируемого приложения.
Отладка — анализ текущего содержимого Redis помогает понять, почему система ведёт себя неожиданно.
Принцип работы
Клиент подключается к серверу Redis через TCP-порт (стандартно 6379) и отправляет команду в текстовом протоколе RESP (REdis Serialization Protocol). Сервер обрабатывает запрос в основном потоке (классическая версия Redis является однопоточной) и возвращает ответ.
Redis выполняет команды в основном в одном потоке, поэтому они обрабатываются последовательно. За счёт этого модель проще и предсказуемее, но есть и обратная сторона: если запустить тяжёлую операцию — например, KEYS * на большом наборе данных — она может временно «подвесить» выполнение остальных запросов.
Персистентность (сохранение на диск) обеспечивается двумя механизмами:
RDB (Redis Database File) — снэпшоты памяти в определённые моменты времени.
AOF (Append Only File) — журнал всех записывающих команд, позволяющий восстановить состояние с точностью до операции.
Типы данных
Поддержка различных структур данных — одно из главных отличий Redis от простых key-value хранилищ.

Тип |
Структура |
Типовые команды |
Пример использования |
|---|---|---|---|
String |
Бинарно-безопасная строка |
|
Хранение JSON, счётчиков, токенов |
List |
Связный список строк |
|
Очереди, история действий |
Hash |
Хэш-таблица полей со значениями |
|
Хранение объектов (профили, настройки) |
Set |
Неупорядоченное множество уникальных строк |
|
Теги, уникальные идентификаторы |
Sorted Set |
Упорядоченное по оценке множество |
|
Рейтинги, очереди с приоритетом |
Bitmap |
Побитовые операции над строками |
|
Флаги активности, аналитика |
HyperLogLog |
Вероятностная структура для подсчёта уникальных элементов |
|
Приблизительный подсчёт уникальных пользователей |
Stream |
Аппендикс-ориентированный лог событий |
|
Event sourcing, очереди сообщений |
Синтаксис команд
Redis предоставляет набор команд, сгруппированных по типу данных. Ниже приведено подробное описание каждой команды с указанием её назначения, а затем — примеры использования.

Команды для работы со строками (String)
Команда |
Назначение |
|---|---|
|
Установить значение ключа |
|
Получить значение по ключу |
|
Установить несколько ключей за одну операцию |
|
Получить несколько ключей за одну операцию |
|
Установить значение, только если ключ не существует (Set if Not eXists) |
|
Увеличить числовое значение на 1 |
|
Уменьшить числовое значение на 1 |
|
Увеличить числовое значение на заданное число |
|
Уменьшить числовое значение на заданное число |
|
Добавить значение в конец существующей строки |
|
Получить длину строки |
|
Получить подстроку по диапазону |
|
Установить значение с временем жизни (Set with EXpiration) |
Команды для работы со списками (List)
Команда |
Назначение |
|---|---|
|
Добавить элемент в начало списка (Left Push) |
|
Добавить элемент в конец списка (Right Push) |
|
Удалить и вернуть первый элемент списка |
|
Удалить и вернуть последний элемент списка |
|
Получить элементы из диапазона (0 -1 = все элементы) |
|
Получить длину списка |
|
Получить элемент по индексу |
|
Удалить count вхождений значения из списка |
|
Обрезать список, оставив только элементы из диапазона |
|
Извлечь последний элемент из одного списка и добавить в начало другого |
Команды для работы с хэшами (Hash)
Команда |
Назначение |
|---|---|
|
Установить значение поля в хэше |
|
Получить значение поля из хэша |
|
Установить несколько полей (устарела, используйте HSET) |
|
Получить несколько полей |
|
Получить все поля и значения хэша |
|
Удалить поле из хэша |
|
Проверить существование поля |
|
Увеличить числовое значение поля |
|
Получить все имена полей |
|
Получить все значения полей |
|
Получить количество полей |
Команды для работы с множествами (Set)
Команда |
Назначение |
|---|---|
|
Добавить элемент в множество |
|
Удалить элемент из множества |
|
Получить все элементы множества |
|
Проверить, есть ли элемент в множестве |
|
Получить количество элементов в множестве |
|
Удалить и вернуть случайный элемент |
|
Получить случайные элементы без удаления |
|
Объединение двух множеств |
|
Пересечение двух множеств |
|
Разность двух множеств |
Команды для работы с сортированными множествами (Sorted Set)
Команда |
Назначение |
|---|---|
|
Добавить элемент с весом (score) |
|
Удалить элемент |
|
Получить элементы по возрастанию веса (с индексами) |
|
Получить элементы по убыванию веса |
|
Получить элементы по диапазону весов |
|
Получить позицию элемента (по возрастанию) |
|
Получить позицию элемента (по убыванию) |
|
Получить вес элемента |
|
Увеличить вес элемента |
|
Получить количество элементов |
|
Подсчитать элементы с весом в диапазоне |
|
Удалить элементы по позиции |
|
Удалить элементы по весу |
Команды для управления ключами и сервером
Команда |
Назначение |
|---|---|
|
Удалить ключ |
|
Проверить существование ключа |
|
Установить время жизни ключа (в секундах) |
|
Установить время жизни ключа (в миллисекундах) |
|
Получить оставшееся время жизни (секунды) |
|
Получить оставшееся время жизни (миллисекунды) |
|
Снять ограничение по времени жизни |
|
Переименовать ключ |
|
Определить тип данных ключа |
|
Найти ключи по шаблону (опасно на проде!) |
|
Итеративный обход ключей (безопасно) |
|
Удалить все ключи в текущей базе данных |
|
Удалить все ключи во всех базах данных |
|
Получить количество ключей в текущей базе |
|
Переключиться на другую базу данных (от 0 до 15) |
|
Проверить соединение с сервером |
|
Получить статистику и информацию о сервере |
|
Потоковый вывод всех выполняемых команд |
Примеры основных операций
Работа со строками
SET username "alice" # сохранить имя пользователя GET username # получить имя пользователя SET page_views 10 # сохранить количество просмотров INCR page_views # увеличить количество просмотров на 1 (станет 11) INCRBY page_views 5 # увеличить количество просмотров на 5 (станет 16)
Работа со списками
RPUSH tasks "buy milk" # добавить задачу в конец списка RPUSH tasks "walk dog" # добавить ещё одну задачу LPOP tasks # получить и удалить первую задачу ("buy milk") LRANGE tasks 0 -1 # показать все оставшиеся задачи
Работа с хэшами
HSET profile name "Alice" age 30 # сохранить имя и возраст пользователя HGET profile name # получить имя пользователя HGETALL profile # получить все поля профиля HINCRBY profile age 1 # увеличить возраст на 1 (станет 31)
Работа с множествами
SADD fruits "apple" "banana" "orange" # добавить фрукты в множество SISMEMBER fruits "apple" # проверить, есть ли "apple" в множестве SMEMBERS fruits # показать все элементы множества
Работа с сортированными множествами
ZADD scores 100 "Alice" # добавить Alice с количеством очков 100 ZADD scores 150 "Bob" # добавить Bob с количеством очков 150 ZREVRANGE scores 0 1 WITHSCORES # показать игроков по убыванию очков
Управление временем жизни
SET code "1234" # сохранить код подтверждения EXPIRE code 60 # удалить ключ через 60 секунд TTL code # показать, сколько секунд осталось до удаления PERSIST code # убрать автоматическое удаление DEL code # удалить ключ вручную
Важное замечание по безопасности
Команда KEYS * не рекомендуется для использования в производственной среде, так как она блокирует сервер при большом количестве ключей. Для итеративной выборки следует использовать SCAN:
SCAN 0 MATCH user:* COUNT 100
СУБД и инструменты для работы с Redis
Несмотря на отсутствие SQL, существуют графические и консольные инструменты для администрирования и отладки Redis.

redis-cli
Консольный клиент, поставляемый вместе с сервером. Основные режимы:
redis-cli --stat— статистика в реальном времени.redis-cli --monitor— потоковое отображение всех команд, выполняемых на сервере (полезно для отладки).redis-cli --latency— измерение задержек.redis-cli --scan— безопасная альтернативаKEYS.
Redis Insight
Официальный графический инструмент от Redis Inc. Доступен для Windows, macOS, Linux. Функциональность:
визуальный просмотр и редактирование ключей разных типов;
профилирование команд и анализ медленных логов (slowlog);
мониторинг метрик производительности;
встроенный терминал для выполнения команд.
Официальный сайт
GitHub-репозиторий
Another Redis Desktop Manager
Бесплатное кроссплатформенное приложение. Поддерживает подключение к кластерам, работу со снимками памяти, просмотр ключей с фильтрацией.
Redis Commander
Веб-интерфейс на Node.js. Удобен для быстрого развёртывания в Docker-окружении. Позволяет просматривать и редактировать данные через браузер.
Для целей тестирования наиболее полезными являются redis-cli --monitor (для наблюдения за взаимодействием приложения с Redis) и Redis Insight (для анализа структуры данных).
Выводы
Redis — это не замена реляционным базам данных, а специализированный инструмент для задач, где важна скорость: кеширование, управление сессиями, очереди, рейтинги и счётчики.
Для инженера по тестированию владение Redis даёт практические преимущества:
проверка состояния системы напрямую, в обход API;
ускорение отладки через мониторинг команд в реальном времени;
возможность создавать граничные условия с помощью TTL.
Эти знания и навыки будут точно полезны для QA. Redis часто встречается в требованиях к вакансиям, а понимание его устройства и команд позволяет тестировщику глубже анализировать систему, находить больше потенциальных проблем и эффективнее взаимодействовать с разработкой.

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