Что пишут в блогах

Подписаться

Что пишут в блогах (EN)

Разделы портала

Онлайн-тренинги

.
Что такое Redis, и как мы применяем его в автоматизации
26.03.2025 00:00

Автор: Сарит Вакрат (Sarit Vakrat)
Оригинал статьи
Перевод: Ольга Алифанова

Что такое Redis?

Это сервер NoSQL-БД. Он быстрый, с открытым исходным кодом, он хранит данные в памяти для использования в качестве БД, у него есть кэш, брокер сообщений и очередь.

Redis расшифровывается, как Remote Dictionary Server. Проект зародился, когда Сальваторе Санфилиппо, исходно разрабатывавший Redis, пытался улучшить масштабируемость своего итальянского стартапа. Сейчас Redis отвечает менее чем за миллисекунду, что позволяет получать миллионы запросов в секунду для приложений реального времени – игр, рекламы, финансов, здравоохранения и интернета вещей. Redis – популярный вариант для кэширования, управления сессиями, игр, рейтинговых таблиц, аналитики в режиме реального времени, геопространственных технологий, попутных поездок, чатов, стриминга и pub/sub (https://aws.amazon.com/redis/).

Как работает Redis?

Все данные Redis хранятся в памяти, в отличие от баз данных, хранящих данные на диске или SSD. Устранив нужду в доступе к дискам, хранилища в памяти вроде Redis не нуждаются во времени на поиск и могут найти данные за микросекунды. У Redis гибкие структуры данных, высокая доступность, он поддерживает геопространственные задачи, скрипты Lua, транзакции, кластеры, обеспечивает сохранность дисков – все это упрощает создание масштабируемых интернет-приложений реального времени.

Какие типы данных поддерживает Redis?


  • Строки: текстовые или бинарные данные до 512 Мб
  • Списки: коллекции строк в порядке добавления.
  • Наборы: неупорядоченные коллекции строк с возможностью пересекаться, объединяться и дифференцироваться от других типов наборов.
  • Упорядоченные наборы: наборы, упорядоченные по значению.
  • Хэши: структура данных, хранящая список полей и значений.
  • Битовые карты: тип данных, позволяющий операции на уровне битов.
  • HyperLogLogs: вероятностная структура данных для оценки уникальных элементов в наборе.

Как и почему мы используем Redis в автоматизации?

Для хранения данных, получения их от пользователей и передачи им в нашем проекте применяется и MySQL, и Redis.

Наш фреймворк автоматизации столкнулся с новыми технологиями и новым подходом. К примеру, в некоторых случаях требуется проверить, что возвращенные MySQL данные сравнительно (хотя бы на 90%) близки к данными, возвращенными пользователям от Redis.

Как использовать и установить Redis?

  • Примеры приведены для nodeJS
npm install redis
npm i @types/redis

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

let redis = require("redis"),     
client = redis.createClient();  client.set("foo_rand000000000000", "some fantastic value", function (err, reply) {
// Это или выдаст ошибку (параметр сброса установлен как истина),
// или тихо упадет, и этот обратный вызов вообще не произойдет (сброс установлен как ложь)
console.log(err);
}); client.end(true); // Дальнейшие команды не будут обработаны
client.get("foo_rand000000000000", function (err, reply) {                          console.log(err); // => Соединение уже закрыто.' });

Другой простой пример, проверяющий и задающий данные:

public checkAndSetIsUsedInMemory( 
applicationContext: ApplicationContext,
key: string
){
const isFound = this.nonceMemoryStorage.get(key);
this.nonceMemoryStorage.set(key,true);
return isFound;
}
  • Полный список команд Redis
  • Официальная документация
  • Очень полезный пример использования Redis с nodeJS
  • Бесплатный курс udemy по базовому использованию Redis
  • Для автоматизации мы в основном используем команды get, set и exists.

Самые полезные для автоматизации команды

  • client.get(key) — позволяет получить хранящийся в Redis ключ
  • client.exists(key) — проверяет, существует ли ключ
  • redis.print() — выводит в console.log() все данные redis
  • Полезная функция обратного вызова для отображения возвращенных значений при тестировании:
    • Пример:

client.on(“connect”, function ()

{ client.set(“foo_rand000000000000”, “some fantastic value”, redis.print); client.get(“foo_rand000000000000”, redis.print);});

Дебаг

  • Необязателен – чаще всего первой строки достаточно

Для получения отладочного вывода запустите свое приложение node_redis с NODE_DEBUG=redis.

В результате вы получите хорошие стектрейсы асинхронных операций, а не бесполезные. Если вам нужны только хорошие стектрейсы, а не весь отладочный вывод, запустите приложение в режиме разработки (NODE_ENV=development).

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

Сравнение:

Бесполезный стектрейс:

ReplyError: ERR wrong number of arguments for 'set' command at parseError (/home/ruben/repos/redis/node_modules/redis-parser/lib/parser.js:158:12)
at parseType (/home/ruben/repos/redis/node_modules/redis-parser/lib/parser.js:219:14)

Хороший стектрейс:

`ReplyError: ERR wrong number of arguments for 'set' command at new Command (/home/ruben/repos/redis/lib/command.js:9:902) 
at RedisClient.set (/home/ruben/repos/redis/lib/commands.js:9:3238) at Context.<anonymous> (/home/ruben/repos/redis/test/good_stacks.spec.js:20:20)
at callFnAsync (/home/ruben/repos/redis/node_modules/mocha/lib/runnable.js:349:8) at Test.Runnable.run (/home/ruben/repos/redis/node_modules/mocha/lib/runnable.js:301:7)
at Runner.runTest (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:422:10) at /home/ruben/repos/redis/node_modules/mocha/lib/runner.js:528:12
at next (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:342:14) at /home/ruben/repos/redis/node_modules/mocha/lib/runner.js:352:7 at next (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:284:14)
at Immediate._onImmediate (/home/ruben/repos/redis/node_modules/mocha/lib/runner.js:320:5) at processImmediate [as _immediateCallback] (timers.js:383:17)`

Обсудить в форуме