Возможно, вы слышали о Redis.
Он описывается как «хранилище структуры данных в памяти, используемое в качестве базы данных, кеша и посредника сообщений». По сути, вы можете думать о Redis как о базе данных. В отличие от более модных баз данных, Redis славится своей простотой. Он не годится для реляционных данных или сложных структур данных, но он невероятно эффективен и атомарен. К счастью, им легко пользоваться.
Может быть сложно определить, с чего начать с Redis. Если вы зайдете на сайт, вам будет предложено загрузить tar-файл. В нем ничего не говорится о менеджерах пакетов (например, brew или apt), и неясно, с чего начать. Я написал это руководство для младших разработчиков. Я расскажу о том, как направить ваше обучение, и дам краткий обзор:
- Скачивание Redis
- Пробуем в командной строке
- Использование его в вашем бэкэнд-коде
- Почему это полезно
Скачивание 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-кэширования (редко используемого).
Вот несколько распространенных вариантов использования, если вам нужны идеи.