Содержание

Введение
Что такое 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 хранилище.

Salvatore Sanfilippo
Salvatore Sanfilippo

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

Отличия от реляционных баз данных

Для понимания места Redis в тестировании полезно сравнить его с классическими реляционными СУБД.

Сравнение Redis с SQL
Сравнение Redis с SQL

Характеристика

Реляционные СУБД (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 следующие возможности:

  1. Верификация состояния системы — возможность проверить, что приложение записало ожидаемые данные в кеш или очередь, без необходимости ожидать их обработки или отображения через API.

  2. Ускорение проверок — получение значения по ключу занимает миллисекунды, что быстрее выполнения SQL-запроса или ожидания ответа API.

  3. Создание тестовых условий — возможность напрямую установить определённое состояние (например, заблокировать пользователя, обнулить лимиты, добавить запись в очередь) перед выполнением тестового сценария.

  4. Неинвазивность — Redis не блокирует ресурсы при чтении и не требует остановки тестируемого приложения.

  5. Отладка — анализ текущего содержимого Redis помогает понять, почему система ведёт себя неожиданно.

Принцип работы

Клиент подключается к серверу Redis через TCP-порт (стандартно 6379) и отправляет команду в текстовом протоколе RESP (REdis Serialization Protocol). Сервер обрабатывает запрос в основном потоке (классическая версия Redis является однопоточной) и возвращает ответ.

Redis выполняет команды в основном в одном потоке, поэтому они обрабатываются последовательно. За счёт этого модель проще и предсказуемее, но есть и обратная сторона: если запустить тяжёлую операцию — например, KEYS * на большом наборе данных — она может временно «подвесить» выполнение остальных запросов.

Персистентность (сохранение на диск) обеспечивается двумя механизмами:

  • RDB (Redis Database File) — снэпшоты памяти в определённые моменты времени.

  • AOF (Append Only File) — журнал всех записывающих команд, позволяющий восстановить состояние с точностью до операции.

Типы данных

Поддержка различных структур данных — одно из главных отличий Redis от простых key-value хранилищ.

Типы данных Redis
Типы данных Redis

Тип

Структура

Типовые команды

Пример использования

String

Бинарно-безопасная строка

SET, GET, INCR, MSET

Хранение JSON, счётчиков, токенов

List

Связный список строк

LPUSH, RPUSH, LPOP, LRANGE

Очереди, история действий

Hash

Хэш-таблица полей со значениями

HSET, HGET, HGETALL, HINCRBY

Хранение объектов (профили, настройки)

Set

Неупорядоченное множество уникальных строк

SADD, SREM, SISMEMBER, SMEMBERS

Теги, уникальные идентификаторы

Sorted Set

Упорядоченное по оценке множество

ZADD, ZRANGE, ZREVRANGE, ZRANK

Рейтинги, очереди с приоритетом

Bitmap

Побитовые операции над строками

SETBIT, GETBIT, BITCOUNT

Флаги активности, аналитика

HyperLogLog

Вероятностная структура для подсчёта уникальных элементов

PFADD, PFCOUNT, PFMERGE

Приблизительный подсчёт уникальных пользователей

Stream

Аппендикс-ориентированный лог событий

XADD, XREAD, XGROUP

Event sourcing, очереди сообщений

Синтаксис команд

Redis предоставляет набор команд, сгруппированных по типу данных. Ниже приведено подробное описание каждой команды с указанием её назначения, а затем — примеры использования.

Команды Redis
Команды Redis

Команды для работы со строками (String)

Команда

Назначение

SET key value

Установить значение ключа

GET key

Получить значение по ключу

MSET key1 value1 key2 value2

Установить несколько ключей за одну операцию

MGET key1 key2

Получить несколько ключей за одну операцию

SETNX key value

Установить значение, только если ключ не существует (Set if Not eXists)

INCR key

Увеличить числовое значение на 1

DECR key

Уменьшить числовое значение на 1

INCRBY key delta

Увеличить числовое значение на заданное число

DECRBY key delta

Уменьшить числовое значение на заданное число

APPEND key value

Добавить значение в конец существующей строки

STRLEN key

Получить длину строки

GETRANGE key start end

Получить подстроку по диапазону

SETEX key seconds value

Установить значение с временем жизни (Set with EXpiration)

Команды для работы со списками (List)

Команда

Назначение

LPUSH key value

Добавить элемент в начало списка (Left Push)

RPUSH key value

Добавить элемент в конец списка (Right Push)

LPOP key

Удалить и вернуть первый элемент списка

RPOP key

Удалить и вернуть последний элемент списка

LRANGE key start stop

Получить элементы из диапазона (0 -1 = все элементы)

LLEN key

Получить длину списка

LINDEX key index

Получить элемент по индексу

LREM key count value

Удалить count вхождений значения из списка

LTRIM key start stop

Обрезать список, оставив только элементы из диапазона

RPOPLPUSH source destination

Извлечь последний элемент из одного списка и добавить в начало другого

Команды для работы с хэшами (Hash)

Команда

Назначение

HSET key field value

Установить значение поля в хэше

HGET key field

Получить значение поля из хэша

HMSET key field1 value1 field2 value2

Установить несколько полей (устарела, используйте HSET)

HMGET key field1 field2

Получить несколько полей

HGETALL key

Получить все поля и значения хэша

HDEL key field

Удалить поле из хэша

HEXISTS key field

Проверить существование поля

HINCRBY key field delta

Увеличить числовое значение поля

HKEYS key

Получить все имена полей

HVALS key

Получить все значения полей

HLEN key

Получить количество полей

Команды для работы с множествами (Set)

Команда

Назначение

SADD key member

Добавить элемент в множество

SREM key member

Удалить элемент из множества

SMEMBERS key

Получить все элементы множества

SISMEMBER key member

Проверить, есть ли элемент в множестве

SCARD key

Получить количество элементов в множестве

SPOP key

Удалить и вернуть случайный элемент

SRANDMEMBER key count

Получить случайные элементы без удаления

SUNION key1 key2

Объединение двух множеств

SINTER key1 key2

Пересечение двух множеств

SDIFF key1 key2

Разность двух множеств

Команды для работы с сортированными множествами (Sorted Set)

Команда

Назначение

ZADD key score member

Добавить элемент с весом (score)

ZREM key member

Удалить элемент

ZRANGE key start stop

Получить элементы по возрастанию веса (с индексами)

ZREVRANGE key start stop

Получить элементы по убыванию веса

ZRANGEBYSCORE key min max

Получить элементы по диапазону весов

ZRANK key member

Получить позицию элемента (по возрастанию)

ZREVRANK key member

Получить позицию элемента (по убыванию)

ZSCORE key member

Получить вес элемента

ZINCRBY key delta member

Увеличить вес элемента

ZCARD key

Получить количество элементов

ZCOUNT key min max

Подсчитать элементы с весом в диапазоне

ZREMRANGEBYRANK key start stop

Удалить элементы по позиции

ZREMRANGEBYSCORE key min max

Удалить элементы по весу

Команды для управления ключами и сервером

Команда

Назначение

DEL key

Удалить ключ

EXISTS key

Проверить существование ключа

EXPIRE key seconds

Установить время жизни ключа (в секундах)

PEXPIRE key milliseconds

Установить время жизни ключа (в миллисекундах)

TTL key

Получить оставшееся время жизни (секунды)

PTTL key

Получить оставшееся время жизни (миллисекунды)

PERSIST key

Снять ограничение по времени жизни

RENAME key newkey

Переименовать ключ

TYPE key

Определить тип данных ключа

KEYS pattern

Найти ключи по шаблону (опасно на проде!)

SCAN cursor

Итеративный обход ключей (безопасно)

FLUSHDB

Удалить все ключи в текущей базе данных

FLUSHALL

Удалить все ключи во всех базах данных

DBSIZE

Получить количество ключей в текущей базе

SELECT index

Переключиться на другую базу данных (от 0 до 15)

PING

Проверить соединение с сервером

INFO

Получить статистику и информацию о сервере

MONITOR

Потоковый вывод всех выполняемых команд

Примеры основных операций

Работа со строками


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
Разные инструменты для работы с 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

Бесплатное кроссплатформенное приложение. Поддерживает подключение к кластерам, работу со снимками памяти, просмотр ключей с фильтрацией.

GitHub-репозиторий

Redis Commander

Веб-интерфейс на Node.js. Удобен для быстрого развёртывания в Docker-окружении. Позволяет просматривать и редактировать данные через браузер.

NPM-пакет
GitHub-репозиторий

Для целей тестирования наиболее полезными являются redis-cli --monitor (для наблюдения за взаимодействием приложения с Redis) и Redis Insight (для анализа структуры данных).

Выводы

Redis — это не замена реляционным базам данных, а специализированный инструмент для задач, где важна скорость: кеширование, управление сессиями, очереди, рейтинги и счётчики.

Для инженера по тестированию владение Redis даёт практические преимущества:

  • проверка состояния системы напрямую, в обход API;

  • ускорение отладки через мониторинг команд в реальном времени;

  • возможность создавать граничные условия с помощью TTL.

Эти знания и навыки будут точно полезны для QA. Redis часто встречается в требованиях к вакансиям, а понимание его устройства и команд позволяет тестировщику глубже анализировать систему, находить больше потенциальных проблем и эффективнее взаимодействовать с разработкой.

Спасибо за внимание
Спасибо за внимание

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

Комментарии (0)