Возможно, вы слышали о Redis.

Он описывается как «хранилище структуры данных в памяти, используемое в качестве базы данных, кеша и посредника сообщений». По сути, вы можете думать о Redis как о базе данных. В отличие от более модных баз данных, Redis славится своей простотой. Он не годится для реляционных данных или сложных структур данных, но он невероятно эффективен и атомарен. К счастью, им легко пользоваться.

Может быть сложно определить, с чего начать с Redis. Если вы зайдете на сайт, вам будет предложено загрузить tar-файл. В нем ничего не говорится о менеджерах пакетов (например, brew или apt), и неясно, с чего начать. Я написал это руководство для младших разработчиков. Я расскажу о том, как направить ваше обучение, и дам краткий обзор:

  1. Скачивание Redis
  2. Пробуем в командной строке
  3. Использование его в вашем бэкэнд-коде
  4. Почему это полезно

Скачивание Redis

Вы можете пропустить архив на сайте и загрузить его с помощью менеджера пакетов:

Mac: brew install redis. Чтобы он запускался при каждой загрузке компьютера, позвоните brew services start redis.

Ubuntu: sudo apt-get install redis-server. Чтобы он запускался при каждой загрузке компьютера, позвоните sudo systemctl enable redis-server.service.

Окна: да смилостивится над вашей душой. Попробуйте это, или вы также можете попробовать это с WSL (Подсистема Windows для Linux).

После этого redis-server уже должен быть запущен (хотя вы можете запустить его вручную с помощью redis-server). Вы можете проверить это, набрав redis-cli ping, в результате чего на выходе должно быть PONG. Redis работает на порту 6379.

Пробуем в командной строке

Мы запустим Redis в командной строке, чтобы вы немного познакомились с инструментом. Откройте командную строку с помощью redis-cli.

Создайте значение с SET <key> <value>:

127.0.0.1:6379> SET name Elliott
OK

По мере того, как вы печатаете, он будет показывать вам вводимые вами данные. Вы можете получить значение с помощью GET <key>:

127.0.0.1:6379> GET name
"Elliott"
127.0.0.1:6379> GET dne
(nil)

Вы можете проверить наличие с помощью EXISTS <key>:

127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS dne
(integer) 0

Вы можете распечатать все ключи с помощью KEYS *.

Наконец, вы можете удалить ключ с помощью DEL <key>:

127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> DEL dne
(integer) 0

Вы можете выйти с quit.

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

  • Вы можете установить время истечения срока действия ключей
  • Вы можете использовать команду Keys с шаблонами для фильтрации
  • Вы можете увеличивать / уменьшать числа

Использование на бэкэнде

Если вы раньше не использовали базу данных (или использовали только sqlite), вам может потребоваться ознакомиться с идеей запуска базы данных и программы отдельно. Подобно PostgreSQL или MongoDB, Redis запускается отдельно. Перед установкой библиотеки для вашего языка программирования убедитесь, что redis-server запущен.

Затем вы хотите загрузить соответствующую библиотеку для взаимодействия с ней. Я не нашел список клиентов очень понятным, так что вы можете просто погуглить <language> redis.

Например, клиент NodeJS называется Redis в диспетчере пакетов npm, а репозиторий называется node-redis. В списке клиентов Redis есть несколько предложений для NodeJS.

В качестве примера я буду использовать клиентов NodeJS и Ruby, но большинство из них хорошо документированы.

Для NodeJS вы сначала устанавливаете соединение между вашим приложением и Redis:

const redis = require('redis');
const redisClient = redis.createClient();

Функции аналогичны тем, что вы использовали в интерфейсе командной строки, за исключением того, что они асинхронны:

client.set("key", "value", console.log);
client.get("key", console.log);

Вы должны передать функцию обратного вызова для обработки асинхронного ответа. В качестве альтернативы с NodeJS вы можете использовать утилиту promisify, чтобы превратить их в обещания:

const redis = require('redis');
const { promisify } = require("util");

const redisClient = redis.createClient()
const redisGet = promisify(redisClient.get).bind(redisClient);
const redisSetEx = promisify(redisClient.setex).bind(redisClient);

redisGet.then(console.log).catch(console.error);

Для Ruby вызовы Redis не являются асинхронными, что лучше соответствует стилю Ruby:

require "redis"
redis = Redis.new

redis.set("mykey", "hello world")
# => "OK"

redis.get("mykey")
# => "hello world"

В производственной среде вам часто может потребоваться, чтобы Redis работал на другом сервере. Это усложнит ваши клиентские подключения. Например, при простой настройке Docker вы могли docker-compose настроить контейнер только для Redis:

services:
  backend: 
    ...
  
  redis:
    image: 'redis:6'
    ports:
    - '6379'

В этом случае ваше клиентское соединение в NodeJS может выглядеть так:

const redisClient = redis.createClient('redis://redis');

Преимущества Redis

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

Главное преимущество Redis - эффективность. Поскольку его типы данных настолько просты, он может эффективно хранить большой объем информации и быстро ее обрабатывать. Если вы хотите хранить в памяти наиболее часто используемые элементы, Redis служит отличным кешем. Он также имеет встроенную поддержку LRU-кэширования (редко используемого).

Вот несколько распространенных вариантов использования, если вам нужны идеи.