logo
Ещё

Redis

Сейчас невозможно представить себе компанию, не пользующуюся базами данных. В этих хранилищах могут быть сосредоточены сведения о клиентах, имеющемся ассортименте или любая другая полезная информация. Поэтому так важно ответственно подойти к выбору сопутствующих систем для работы. Например, Redis отличается высокой производительностью и отличной гибкостью – чем не вариант?


Что такое Redis?

В привычном понимании Система Управления Базами Данных – специальное программное обеспечение, которое хранит полученную извне информацию в огромной двумерной таблице. Чтобы получить данные из неё, нужно подключиться к серверу и произвести соответствующий запрос. В чём особенности? Безопасность, масштабность и наличие управления SQL-командами.

Но Redis – это обновлённая версия привычного. Данные хранятся уже не в общей таблице, а в парах «ключ-значение». То есть, чтобы получить ту же самую информацию, помимо доступа к серверу требуется ввод хеша.

Можно сказать, что разработчики реализовали «словарный» метод удалённого хранения.

Отличия от Memcached

Redis не является первой в своём роде системой для кеширования информации в базах данных. Ранее в Интернете можно было найти Memcached – систему, позволяющую оптимизировать хранение сведений в веб-приложениях.

Программное обеспечение Memcached увидело свет в 2003 году – на рассвете информационных технологий. И если первое время разработчик уделял внимание добавлению новых функций, то начиная с 2006 года код изменялся только с целью улучшения производительности и оптимизации уже имеющихся процессов.

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

На производительности это особо не сказалось – измерения показывают схожие результаты. Всё из-за того, что используются практически идентичные алгоритмы хранения и преобразования информации на ОЗУ. Однако это позволяет всем ныне существующим веб-инструментам иметь поддержку как Redis, так и Memcached.

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

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


Memcached пользуется популярностью в более простых проектах, которые не подразумевают использования динамически изменяющихся размеров памяти. То есть, программное обеспечение не умеет «подстраиваться» под входящие данные (которые, бывает, подаются целой серией, которую нужно разобрать), в отличие от Redis, который и без того производит хранение данных в «сериализованной» форме.

Отличается и алгоритм вытеснения устаревших данных. Memcached обращалась к системе Least Recent Used, которая в состоянии определить лишь схожие по размерам данные и производить их замену. Обновление разработчиками Redis привело к тому, что появилось целых 6 возможных механизмов для вытеснения данных.

Большая часть современных программистов будет настаивать на использовании Redis в веб-проектах, требующих работы с большими базами данных. Но начинающие специалисты могут попробовать свои силы в управлении Memcached.

Для чего используется Redis?

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

  1. Кэширование данных (понятно, что это будет вполне реализуемо из-за наличия преобразования данных в пару «ключ-значение»);
  2. Создание блокирующих алгоритмов – ограничение доступа к файлам;
  3. Создание рассылок на базе имеющихся данных – то есть, организация выборки и выполнение целевого действия;
  4. Организация работы с очередями – создание списка задач для целого ряда элементов;
  5. Создание алгоритма, ограничивающего получение данных с одного API – одна из прикладных задач, которая может быть полезна для оптимизации работы базы данных.
И это не конец списка. Используя весь инструментарий Redis, можно добиться полностью автономной системы работы с клиентами. Либо решить большое количество задач в уже имеющихся веб-приложениях.

Начало работы с Redis

Так как Redis является одной из noSQL-систем, управлять им придётся с помощью docker-команд. То есть, произвести следующие действия:

  1. Запустить контейнер;

    docker run -d -p 6379:6379 --name test-redis redis

  2. Открыть новую сессию, а также запустить интерфейс;

    docker exec -it test-redis sh
    
    redis-cli

  3. Перейти к управлению Redis с помощью встроенных команд;

    docker exec -it test-redis redis-cli

Теперь можно заниматься непосредственным управлением Redis с помощью команд.

Настраивать его работу, обращаться к имеющимся элементам и вводить новые.

Языковая поддержка

Так как само программное обеспечение было написано на Си-подобном языке, Redis воспринимает только похожий синтаксис. Однако можно пользоваться и Python, и Perl (который больше актуален для Memcached), главное – знать основные команды.

Важно понимать, что работа может быть организована как со строками, так и с множествами и хэш-таблицами (теми самыми элементами «ключ-значение»). То есть, если нет освоения работы с этими типами данных в своём обычно используемом языке, в Redis освоить это будет сложно.

Основные команды Redis

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

  • Hset – позволяет сохранить значение по определённому ключу;

HSET auto1 name "VOLVO"

HSET auto1 age "1999"

На примере этого кода создаётся ячейка auto1 со значениями марка – VOLVO, год производства – 1999.

  • Hget – позволяет получить значение по одному ключу;

HGET auto1 name

В итоге пользователь получит выдачу «VOLVO». 

  • Hgetall – позволяет получить значение ячейки во всем ключам;

HGETALL auto1

В итоге будет получено: «1) “VOLVO”; 2) “1999”» - вся информация, которая была введена в систему.

  • Hkeys – позволяет получить все ключи по нужному элементу.

HKEYS auto1

В итоге будет получено: «1) “name”; 2) “age”» - все ключи, которые относятся к данному элементу в базе данных.

Конечно, это не полный список используемых команд, но вполне достаточный для прикладного использования в простой базе данных.

Благодаря тому, что память может динамически изменяться, достигается «неограниченность» количества элементов и ключей.

Транзакции в Redis

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

Чтобы активировать транзакцию, нужно написать команду MULTI. Сразу после этого начинается ввод повторяющихся команд. Как только каждая из них встанет «в очередь», команда ответит сообщением «QUEUED». Для запуска операции нужно ввести «EXEC». Например:

MULTI -> “OK”

INCR count1 -> “QUEUED” – увеличиваем значение на единицу

DECR count2 -> “QUEUED” – уменьшаем значение на единицу

EXEC

В итоге получится следующий вывод: «1) “1”; 2) “-1”» - особая система счисления, начинающаяся с нуля, если не указано обратное.

Кстати, обращаться к переменным можно и без обозначения, пусть и не рекомендуется.

Механизм подписок

Конечно, основная особенность Redis состоит в том, что он может производить рассылку по указанным контактам в автоматическом режиме. То есть, позволяет создать форму для подписки и обеспечивает весь процесс отправки внутри своего алгоритма.

Конечно, гарантировать того, что письмо дойдёт до всех клиентов, нельзя. Но то, что оно будет отправлено – это точно.

Подписка пользователя на рассылку производится с помощью следующей команды (с использованием графических библиотек можно «спрятать» это за кнопку):

SUBSCRIBE bestchannel

При этом другой клиент базы данных может опубликовать своё сообщение в системе рассылок – канале сообщества:

PUBLISH bestchannel "Hi! This is a best channel in Redis!”

Бывает достаточно удобно пользоваться такой системой рассылок для экстренного оповещения всех пользователей в базе данных. Кстати, сразу после набора второй команды будет выведено натуральное число – это количество человек, которым было доставлено письмо.

А что же дальше?

Использовать Redis можно для собственных баз данных – создавать их, решать прикладные задачи. Например, оптимизировать хранение информации или устанавливать блокировку для нежелательных посетителей.

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

Стоит отдельно остановиться на Python – он позволяет использовать наибольшее количество возможностей библиотеки:

Подключение производится стандартным способом:

import redis

После этого выполняется подключение к серверу:

client = redis.Redis(host='127.0.0.1') – значение хоста, как правило, неизменное

Далее открывается доступ ко всем привычным командам, рассмотренным ранее. Можно попробовать «перевести» пример с автомобилем:

client.set('name', 'VOLVO')

print client.get('name')

client.set('age', '1999')

print client.get('age')

Первое время может быть сложно привыкнуть к использованию дополнительной приставки “client”, но это полностью позволяет разграничить алгоритм основной программы (возможно, веб-страницы и её функционала) и базы данных на Redis.

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

Ранее был рассмотрен пример простой программы – ввод-вывод данных в базу данных. Но что касается более сложных алгоритмов. Например, блокировки данных от проникновения? Звучит как настоящий вызов.

public function lock(string $key, string $hash, int $ttl = 10): bool

{

return (bool)$this->getRedis()->rawCommand('SET', $key, $hash, 'NX', 'EX', $ttl);

}

Данная функция спокойно может справиться с нежелательным подключением дополнительных потоков к одному элементу. Стоит подробнее остановиться на её фрагментах:

$key – ключ, по которому обращается блокировка;

$hash – этакая «подпись», что элемент находится под защитой блокировкой. То же самое, что повесить линию ограждения вокруг двери;

$ttl – время, которое выделяется на блокировку. Каждое указанное количество секунд производится проверка потока – активна ли она, и нужна ли защита.

В итоге пользователь может получить значение “0” – нет блокировки или “1” – если она есть. За это отвечает параметр ‘NX’ – проверяет, употреблялось ли значение ранее в тексте этой функции, стоит ли блокировка до сих пор.

Если запустить этот алгоритм, он будет постоянно обновлять защиту на всех (или выбранных) элементах, не допуская повторов или бесконечного использования вычислительных средств.

Преимущества и недостатки использования Redis

Пока что не было придумано новых СУБД, которые могли бы посостязаться с Redis по производительности и работоспособности. Всё из-за использования крайне сложного алгоритма словарного хранения. В ряде случаев это может быть даже полезнее, чем использование привычных систем.

Почему стоит обратиться?

  1. Постоянное хранение данных – наличие динамической системы, которую можно перенести на внешний накопитель;
  2. Просто в освоении – достаточно запомнить ряд команд, а также научиться вводить в свой код;
  3. Масштабируемость – создаются новые системы, но большая их часть имеет совместимость с Redis;
  4. Открытый исходный код – можно самостоятельно изучить алгоритм работы и почерпнуть для себя нечто новое.

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

  1. Всего лишь один поток для работы – более крупные организации не смогут показывать нужную производительность;
  2. Недостаточно серьёзная защита данных – Redis не сумел пройти проверку ACID;
  3. В транзакциях возможна потеря данных – в случае взлома или внесения изменений в программный код, это серьёзный результат.
Поэтому нужно рассматривать масштабы используемой базы данных и опираться лишь на собственные пожелания к СУБД. В ряде случаев Redis может стать незаменимым помощником.

Что почитать по теме?

Литературы по Redis не очень много – всё из-за того, что это специальное программное обеспечение, больше направленное на решение конкретных вопросов. Однако много форумов и есть целая литература по командам и использованию в распространённых языках программирования:

  • https://redis.io/ - официальный сайт Redis, где можно найти всю документацию и команды с открытым кодом.
  • https://habr.com/ru/company/manychat/blog/507136/ - полезная для ознакомления статья, позволяющая познакомиться с основными возможностями Redis.
  • https://www.youtube.com/watch?v=AimUYjKs3pQ – практический курс, после прохождения которого не должно остаться ни одного вопроса о работоспособности Redis.

Итоги

Прочитав эту статью, вы смогли:

  • Узнать о системе управления базами данных Redis – полезное дополнение для своих программ;
  • Научились пользоваться основными командами Redis – первые шаги к полноценным проектам;
  • Рассмотрели подробно кусочек кода из настоящего проекта на Redis – убедились в том, что эта система активно используется разработчиками;
  • Узнали, где можно найти дополнительную информацию о Redis – как стать успешным программистом с использованием этой библиотеки;
  • Поняли, что можно также обратиться к Memcached для выполнения ряда действий – и в чём его главное отличие от Redis.
Часто ищут