Сейчас невозможно представить себе компанию, не пользующуюся базами данных. В этих хранилищах могут быть сосредоточены сведения о клиентах, имеющемся ассортименте или любая другая полезная информация. Поэтому так важно ответственно подойти к выбору сопутствующих систем для работы. Например, Redis отличается высокой производительностью и отличной гибкостью – чем не вариант?
В привычном понимании Система Управления Базами Данных – специальное программное обеспечение, которое хранит полученную извне информацию в огромной двумерной таблице. Чтобы получить данные из неё, нужно подключиться к серверу и произвести соответствующий запрос. В чём особенности? Безопасность, масштабность и наличие управления SQL-командами.
Но Redis – это обновлённая версия привычного. Данные хранятся уже не в общей таблице, а в парах «ключ-значение». То есть, чтобы получить ту же самую информацию, помимо доступа к серверу требуется ввод хеша.
Можно сказать, что разработчики реализовали «словарный» метод удалённого хранения.
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, можно добиться полностью автономной системы работы с клиентами. Либо решить большое количество задач в уже имеющихся веб-приложениях.
Так как Redis является одной из noSQL-систем, управлять им придётся с помощью docker-команд. То есть, произвести следующие действия:
docker run -d -p 6379:6379 --name test-redis redis
docker exec -it test-redis sh
redis-cli
docker exec -it test-redis redis-cli
Теперь можно заниматься непосредственным управлением Redis с помощью команд.
Настраивать его работу, обращаться к имеющимся элементам и вводить новые.
Так как само программное обеспечение было написано на Си-подобном языке, Redis воспринимает только похожий синтаксис. Однако можно пользоваться и Python, и Perl (который больше актуален для Memcached), главное – знать основные команды.
Важно понимать, что работа может быть организована как со строками, так и с множествами и хэш-таблицами (теми самыми элементами «ключ-значение»). То есть, если нет освоения работы с этими типами данных в своём обычно используемом языке, в Redis освоить это будет сложно.
Команд, которые можно использовать в Redis, очень большое количество. Но в основном, программисты пользуются следующими:
HSET auto1 name "VOLVO"
HSET auto1 age "1999"
На примере этого кода создаётся ячейка auto1 со значениями марка – VOLVO, год производства – 1999.
HGET auto1 name
В итоге пользователь получит выдачу «VOLVO».
HGETALL auto1
В итоге будет получено: «1) “VOLVO”; 2) “1999”» - вся информация, которая была введена в систему.
HKEYS auto1
В итоге будет получено: «1) “name”; 2) “age”» - все ключи, которые относятся к данному элементу в базе данных.
Конечно, это не полный список используемых команд, но вполне достаточный для прикладного использования в простой базе данных.
Благодаря тому, что память может динамически изменяться, достигается «неограниченность» количества элементов и ключей.
Под «транзакциями» понимается целый набор команд, которые могут выполняться в автоматическом режиме словно цикл. Однако важно понимать, что, если одно из звеньев выйдет из-под контроля, это нарушит работу всего алгоритма.
Чтобы активировать транзакцию, нужно написать команду 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 может стать незаменимым помощником.
Литературы по Redis не очень много – всё из-за того, что это специальное программное обеспечение, больше направленное на решение конкретных вопросов. Однако много форумов и есть целая литература по командам и использованию в распространённых языках программирования:
Прочитав эту статью, вы смогли: