HTML Diff
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&gt; HSET person1 name "Aleksey" (integer) 1 127.0.0.1:6379&gt; HSET person1 age 25 (integer) 1<p>В примере выше мы создали объект person1 с двумя полями (name и age) и соответствующими значениями.</p>
30 127.0.0.1:6379&gt; HSET person1 name "Aleksey" (integer) 1 127.0.0.1:6379&gt; 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&gt; HGET person1 name "Aleksey"<p>Выше мы получили значение поля name у ключа person1.</p>
32 127.0.0.1:6379&gt; HGET person1 name "Aleksey"<p>Выше мы получили значение поля name у ключа person1.</p>
33 <p>HGETALL - получение всех пар "ключ-значение":</p>
33 <p>HGETALL - получение всех пар "ключ-значение":</p>
34 127.0.0.1:6379&gt; HGETALL person1 1) "name" 2) "Aleksey" 3) "age" 4) "25"<p>Получили значения всех полей по ключу person1.</p>
34 127.0.0.1:6379&gt; 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&gt; HKEYS person1 1) "name" 2) "age" 127.0.0.1:6379&gt; HVALS person1 1) "Aleksey" 2) "25"<p>Как работать с оставшимися структурами данных - смотрите в <a>официальном руководстве</a>.</p>
36 127.0.0.1:6379&gt; HKEYS person1 1) "name" 2) "age" 127.0.0.1:6379&gt; HVALS person1 1) "Aleksey" 2) "25"<p>Как работать с оставшимися структурами данных - смотрите в <a>официальном руководстве</a>.</p>
37 <p>Важно понимать, что транзакции в Redis не сохраняют целостность данных (сбой одной операции при выполнении блока транзакции не мешает исполнить другие).</p>
37 <p>Важно понимать, что транзакции в Redis не сохраняют целостность данных (сбой одной операции при выполнении блока транзакции не мешает исполнить другие).</p>
38 127.0.0.1:6379&gt; MULTI OK 127.0.0.1:6379&gt; INCR counter1 QUEUED 127.0.0.1:6379&gt; INCR counter1 QUEUED 127.0.0.1:6379&gt; DECR counter2 QUEUED 127.0.0.1:6379&gt; EXEC 1) (integer) 1 2) (integer) 2 3) (integer) -1<p>После запуска команды multi интерфейс redis-cli ответил на каждую последующую состоянием QUEUED ("в очереди"). Когда мы запустили команду exec, то получили выходные данные каждой команды из очереди.</p>
38 127.0.0.1:6379&gt; MULTI OK 127.0.0.1:6379&gt; INCR counter1 QUEUED 127.0.0.1:6379&gt; INCR counter1 QUEUED 127.0.0.1:6379&gt; DECR counter2 QUEUED 127.0.0.1:6379&gt; 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&gt; SUBSCRIBE channel1 Reading messages... (press Ctrl-C to quit)<p>Другой клиент публикует сообщения вот так:</p>
45 127.0.0.1:6379&gt; SUBSCRIBE channel1 Reading messages... (press Ctrl-C to quit)<p>Другой клиент публикует сообщения вот так:</p>
46 127.0.0.1:6379&gt; PUBLISH channel1 "Hello! My name is Maksim!" (integer) 1<p>Целочисленное значение (в нашем случае 1), которое получено в результате публикации, это число подписчиков, получивших сообщение.</p>
46 127.0.0.1:6379&gt; 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>