0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>9 апр 2021</li>
2
<ul><li>9 апр 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Узнаём, для чего эта СУБД нужна и как ею пользоваться.</p>
4
</ul><p>Узнаём, для чего эта СУБД нужна и как ею пользоваться.</p>
5
<p>pierre borthiry / unsplash</p>
5
<p>pierre borthiry / unsplash</p>
6
<p>Разрабатывает приложения на Java, воспитывает двух котов: Котлин и Монго.</p>
6
<p>Разрабатывает приложения на Java, воспитывает двух котов: Котлин и Монго.</p>
7
<p><a>Redis</a>(<strong>RE</strong>mote<strong>DI</strong>ctionary<strong>S</strong>erver, "удалённый серверный словарь") - это нереляционная резидентная СУБД, хранящая данные в виде пар "ключ-значение".</p>
7
<p><a>Redis</a>(<strong>RE</strong>mote<strong>DI</strong>ctionary<strong>S</strong>erver, "удалённый серверный словарь") - это нереляционная резидентная СУБД, хранящая данные в виде пар "ключ-значение".</p>
8
<p>От реляционных баз Redis отличается:</p>
8
<p>От реляционных баз Redis отличается:</p>
9
<ul><li><strong>более высокой производительностью</strong>(благодаря хранению данных в оперативной памяти сервера, значительно увеличивается число выполняемых операций);</li>
9
<ul><li><strong>более высокой производительностью</strong>(благодаря хранению данных в оперативной памяти сервера, значительно увеличивается число выполняемых операций);</li>
10
<li><strong>отсутствием языка SQL</strong>(<a>Lua</a>-скрипты как альтернатива);</li>
10
<li><strong>отсутствием языка SQL</strong>(<a>Lua</a>-скрипты как альтернатива);</li>
11
<li><strong>гибкостью</strong>(данные находятся не в жёстких структурах (таблицах), а в более удобных (строки, списки, хеши, множества, сортированные множества), что облегчает работу программисту;</li>
11
<li><strong>гибкостью</strong>(данные находятся не в жёстких структурах (таблицах), а в более удобных (строки, списки, хеши, множества, сортированные множества), что облегчает работу программисту;</li>
12
<li><strong>лучшей масштабируемостью</strong>.</li>
12
<li><strong>лучшей масштабируемостью</strong>.</li>
13
</ul><p>Однако Redis редко используется как основное хранилище в крупных системах, так как не удовлетворяет требованиям ACID, то есть не обеспечивает 100%-ной целостности данных.</p>
13
</ul><p>Однако Redis редко используется как основное хранилище в крупных системах, так как не удовлетворяет требованиям ACID, то есть не обеспечивает 100%-ной целостности данных.</p>
14
<p>Redis обычно применяют:</p>
14
<p>Redis обычно применяют:</p>
15
<ul><li>для хранения пользовательских сессий (HTML-фрагменты веб-страниц или товары корзины интернет-магазина);</li>
15
<ul><li>для хранения пользовательских сессий (HTML-фрагменты веб-страниц или товары корзины интернет-магазина);</li>
16
<li>для хранения промежуточных данных (поток сообщений на стене, голосовалки, таблицы результатов);</li>
16
<li>для хранения промежуточных данных (поток сообщений на стене, голосовалки, таблицы результатов);</li>
17
<li>как брокер сообщений (стратегия "издатель-подписчик" позволяет создавать новостные ленты, групповые чаты);</li>
17
<li>как брокер сообщений (стратегия "издатель-подписчик" позволяет создавать новостные ленты, групповые чаты);</li>
18
<li>как СУБД для небольших приложений, блогов;</li>
18
<li>как СУБД для небольших приложений, блогов;</li>
19
<li>для кэширования данных из основного хранилища, что значительно снижает нагрузку на реляционную базу данных;</li>
19
<li>для кэширования данных из основного хранилища, что значительно снижает нагрузку на реляционную базу данных;</li>
20
<li>для хранения "быстрых" данных - когда важны скорость и критичны задержки передачи (аналитика и анализ данных, финансовые и торговые сервисы).</li>
20
<li>для хранения "быстрых" данных - когда важны скорость и критичны задержки передачи (аналитика и анализ данных, финансовые и торговые сервисы).</li>
21
</ul><p>Самый лёгкий способ - запустить Redis в docker-контейнере (если не знаете, что это, - добро пожаловать<a>сюда</a>).</p>
21
</ul><p>Самый лёгкий способ - запустить Redis в docker-контейнере (если не знаете, что это, - добро пожаловать<a>сюда</a>).</p>
22
<p>Запускаем контейнер командой:</p>
22
<p>Запускаем контейнер командой:</p>
23
docker run -d -p 6379:6379 --name my-redis redis<p>Убедимся, что контейнер запущен:</p>
23
docker run -d -p 6379:6379 --name my-redis redis<p>Убедимся, что контейнер запущен:</p>
24
<p>Затем открываем новую сессию и интерфейс командной строки (CLI):</p>
24
<p>Затем открываем новую сессию и интерфейс командной строки (CLI):</p>
25
docker exec -it my-redis sh redis-cli<p>Можно и сразу перейти в консоль Redis:</p>
25
docker exec -it my-redis sh redis-cli<p>Можно и сразу перейти в консоль Redis:</p>
26
docker exec -it my-redis redis-cli<p>Вот мы и готовы работать с Redis.</p>
26
docker exec -it my-redis redis-cli<p>Вот мы и готовы работать с Redis.</p>
27
<p>Redis поддерживает операции со строками, списками, множествами, хеш-таблицами, упорядоченными множествами и так далее.</p>
27
<p>Redis поддерживает операции со строками, списками, множествами, хеш-таблицами, упорядоченными множествами и так далее.</p>
28
<p>Рассмотрим основные операции на примере хеш-таблиц.</p>
28
<p>Рассмотрим основные операции на примере хеш-таблиц.</p>
29
<p>HSET - сохраняет значение по ключу:</p>
29
<p>HSET - сохраняет значение по ключу:</p>
30
127.0.0.1:6379> HSET person1 name "Aleksey" (integer) 1 127.0.0.1:6379> HSET person1 age 25 (integer) 1<p>В примере выше мы создали объект person1 с двумя полями (name и age) и соответствующими значениями.</p>
30
127.0.0.1:6379> HSET person1 name "Aleksey" (integer) 1 127.0.0.1:6379> HSET person1 age 25 (integer) 1<p>В примере выше мы создали объект person1 с двумя полями (name и age) и соответствующими значениями.</p>
31
<p>HGET - получение значения по ключу (для определённого поля):</p>
31
<p>HGET - получение значения по ключу (для определённого поля):</p>
32
127.0.0.1:6379> HGET person1 name "Aleksey"<p>Выше мы получили значение поля name у ключа person1.</p>
32
127.0.0.1:6379> HGET person1 name "Aleksey"<p>Выше мы получили значение поля name у ключа person1.</p>
33
<p>HGETALL - получение всех пар "ключ-значение":</p>
33
<p>HGETALL - получение всех пар "ключ-значение":</p>
34
127.0.0.1:6379> HGETALL person1 1) "name" 2) "Aleksey" 3) "age" 4) "25"<p>Получили значения всех полей по ключу person1.</p>
34
127.0.0.1:6379> HGETALL person1 1) "name" 2) "Aleksey" 3) "age" 4) "25"<p>Получили значения всех полей по ключу person1.</p>
35
<p>HKEYS и HVALS - получение всех ключей и соответствующих им значений:</p>
35
<p>HKEYS и HVALS - получение всех ключей и соответствующих им значений:</p>
36
127.0.0.1:6379> HKEYS person1 1) "name" 2) "age" 127.0.0.1:6379> HVALS person1 1) "Aleksey" 2) "25"<p>Как работать с оставшимися структурами данных - смотрите в <a>официальном руководстве</a>.</p>
36
127.0.0.1:6379> HKEYS person1 1) "name" 2) "age" 127.0.0.1:6379> HVALS person1 1) "Aleksey" 2) "25"<p>Как работать с оставшимися структурами данных - смотрите в <a>официальном руководстве</a>.</p>
37
<p>Важно понимать, что транзакции в Redis не сохраняют целостность данных (сбой одной операции при выполнении блока транзакции не мешает исполнить другие).</p>
37
<p>Важно понимать, что транзакции в Redis не сохраняют целостность данных (сбой одной операции при выполнении блока транзакции не мешает исполнить другие).</p>
38
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> INCR counter1 QUEUED 127.0.0.1:6379> INCR counter1 QUEUED 127.0.0.1:6379> DECR counter2 QUEUED 127.0.0.1:6379> EXEC 1) (integer) 1 2) (integer) 2 3) (integer) -1<p>После запуска команды multi интерфейс redis-cli ответил на каждую последующую состоянием QUEUED ("в очереди"). Когда мы запустили команду exec, то получили выходные данные каждой команды из очереди.</p>
38
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> INCR counter1 QUEUED 127.0.0.1:6379> INCR counter1 QUEUED 127.0.0.1:6379> DECR counter2 QUEUED 127.0.0.1:6379> EXEC 1) (integer) 1 2) (integer) 2 3) (integer) -1<p>После запуска команды multi интерфейс redis-cli ответил на каждую последующую состоянием QUEUED ("в очереди"). Когда мы запустили команду exec, то получили выходные данные каждой команды из очереди.</p>
39
<p>Отменить транзакцию можно командой discard. Она предотвратит запуск всех команд, ранее поставленных в очередь, - и Redis снова будет выполнять команды в обычном режиме. Чтобы сообщить серверу, что вы открываете новую транзакцию, нужно снова запустить multi.</p>
39
<p>Отменить транзакцию можно командой discard. Она предотвратит запуск всех команд, ранее поставленных в очередь, - и Redis снова будет выполнять команды в обычном режиме. Чтобы сообщить серверу, что вы открываете новую транзакцию, нужно снова запустить multi.</p>
40
<p><strong>Важно понимать</strong>, что когда команда уже встала в очередь (то есть синтаксически верна), то, даже если она и вызовет ошибку при выполнении, остальные команды выполнятся всё равно. А вот если не встала (невалидна, вызвала ошибку при постановке в очередь), то Redis блок транзакции отклонит, даже не дождавшись exec. И если вы попытаетесь после этого выполнить exec, вам скажут, что транзакция была отклонена из-за предыдущих ошибок.</p>
40
<p><strong>Важно понимать</strong>, что когда команда уже встала в очередь (то есть синтаксически верна), то, даже если она и вызовет ошибку при выполнении, остальные команды выполнятся всё равно. А вот если не встала (невалидна, вызвала ошибку при постановке в очередь), то Redis блок транзакции отклонит, даже не дождавшись exec. И если вы попытаетесь после этого выполнить exec, вам скажут, что транзакция была отклонена из-за предыдущих ошибок.</p>
41
<p>Как Redis обрабатывает ошибки внутри транзакций,<a>читайте тут</a>.</p>
41
<p>Как Redis обрабатывает ошибки внутри транзакций,<a>читайте тут</a>.</p>
42
<p>Он позволяет одному клиенту создать канал событий и публиковать туда сообщения, а другому - подписываться и читать эти сообщения (так можно создать простой чат).</p>
42
<p>Он позволяет одному клиенту создать канал событий и публиковать туда сообщения, а другому - подписываться и читать эти сообщения (так можно создать простой чат).</p>
43
<p>Механизм подписок не гарантирует, что сообщение будет доставлено. Мы отправляем сообщение в канал, а кто его примет (и примет ли) - обещать не можем, стоит помнить об этом и не использовать подписки там, где важно обратное.</p>
43
<p>Механизм подписок не гарантирует, что сообщение будет доставлено. Мы отправляем сообщение в канал, а кто его примет (и примет ли) - обещать не можем, стоит помнить об этом и не использовать подписки там, где важно обратное.</p>
44
<p>Итак, клиент подписывается на канал командой:</p>
44
<p>Итак, клиент подписывается на канал командой:</p>
45
127.0.0.1:6379> SUBSCRIBE channel1 Reading messages... (press Ctrl-C to quit)<p>Другой клиент публикует сообщения вот так:</p>
45
127.0.0.1:6379> SUBSCRIBE channel1 Reading messages... (press Ctrl-C to quit)<p>Другой клиент публикует сообщения вот так:</p>
46
127.0.0.1:6379> PUBLISH channel1 "Hello! My name is Maksim!" (integer) 1<p>Целочисленное значение (в нашем случае 1), которое получено в результате публикации, это число подписчиков, получивших сообщение.</p>
46
127.0.0.1:6379> PUBLISH channel1 "Hello! My name is Maksim!" (integer) 1<p>Целочисленное значение (в нашем случае 1), которое получено в результате публикации, это число подписчиков, получивших сообщение.</p>
47
<p>В результате в консоли первого клиента появится введённое сообщение:</p>
47
<p>В результате в консоли первого клиента появится введённое сообщение:</p>
48
<p>Мы познакомились с основными возможностями и функциями Redis. А теперь<a>научим её </a>ускорять взаимодействие с нашей реляционной БД.</p>
48
<p>Мы познакомились с основными возможностями и функциями Redis. А теперь<a>научим её </a>ускорять взаимодействие с нашей реляционной БД.</p>
49
<p>Узнать о Redis больше всегда<a>поможет</a>официальная документация.</p>
49
<p>Узнать о Redis больше всегда<a>поможет</a>официальная документация.</p>
50
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
50
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>