Redis и Spring Data с самого начала. Часть 1 | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional PostgreSQL Подготовка к сертификации Oracle Java Programmer (OCAJP) C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Symfony Framework Unity Game Developer. Basic JavaScript Developer. Professional Android Developer. Basic JavaScript Developer. Basic Java Developer. Professional Highload Architect Reverse-Engineering. Professional Java Developer. Basic PHP Developer. Professional Алгоритмы и структуры данных Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Экспресс-курс «Введение в непрерывную поставку на базе Docker» Базы данных Reverse-Engineering. Professional Administrator Linux. Professional Network engineer Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool" Network engineer. Basic
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Redis и Spring Data с самого начала. Часть 1

Spring_Deep_7.5_site-5020-bfdf85.png

Работаете со Spring, но ни разу не касались Redis? Давайте рассмотрим, что такое NoSQL базы данных, в частности Key-Value NoSQL БД, и что представляет собой одна из самых популярных NoSQL БД — Redis.

NoSQL DB (нереляционные БД)

Термин NoSQL (обозначение нереляционных БД) стал примерно таким же многозначным, как и «облако». NoSQL базами данных сейчас называют то, что раньше даже базами данных и не являлось. Например, кэши! Как ни странно, некоторые NoSQL БД имеют SQL-интерфейс. Поэтому саму аббревиатуру NoSQL сейчас расшифровывают как «Not Only SQL».

NoSQL базы данных могут показаться совсем «нечеловеческими»: в некоторых данные могут пропадать, ACID-транзакции могут отсутствуют как класс, долговременного хранения (durability в ACID) может в принципе не быть. Поэтому решая вопрос о применении той или иной NoSQL БД в проекте, необходимо абсолютно точно понимать, что вы делаете и какую задачу решаете.

NoSQL базы данных можно условно (условно!) разделить на четыре типа:

Key-Value базы данных хранят данные в виде ключ-значение, самый просто пример in-memory non-clustered non persistent DB – это HashMap. В, действительности, они не так просто устроены, но некоторое представление HashMap может дать

Семейства столбцов или «столбчатые» БД Их стоит один раз увидеть, чтобы понять, чем они отличаются от реляционных (табличных). В действительности они похожи на школьный журнал – с различными предметами, разделами, но не с идеальной посещаемостью и зафиксированными классами, а с пропусками и новыми учениками, иначе это был бы отличный пример реляционных данных.

Документ-ориентированные БД хранит документы, допустим для простоты – JSON-ы. Самый простой пример – описание товаров в каком-нибудь интернет-магазине. Описания двух разных телефонов могут разниться очень сильно (у одного телефона описание камеры – может быть полем, а у другого – массив). А теперь сравним описания утюга и телефона. А теперь представим, если мы хотим найти все устройства c зарядкой на 110 V, или найти информацию о всех производителях SSD-дисков. Вот такие задачи можно решить с помощью документ-ориентированные БД.

Графовые БД Предназначены для хранения графов. Хранить граф в реляционной БД – это тот ещё квест (с разными вариантами решения) и отличная задача на собеседование

Иногда выделяют ещё Time Series БД для хранения временных рядов, например, значений котировок акций, серию измерений.

Это деление, повторюсь, достаточно условное. Key-Value БД Redis можно, в частности, отнести и к документ-ориентированным. А ещё если взять две похожих Key-Value БД, например, Redis или Memcached, то принципы, на которых они построены, и их возможности могут кардинально отличаться. Например, Memcached является чисто in-memory БД, а вот Redis умеет записывать данные на диск.

Key-Value БД ещё делятся на RAM и не RAM – в любой момент времени можно быстро получить любой элемент или нет. Некоторые Key-Value БД позволяют хранить только массивы байт, какие-то поддерживают различные структуры данных, а какие-то построены на достаточно хитрых CRDT. Таким образом, существует большое множество Key-Value баз данных.

Redis

Это Redistributable Dictionary Server — одна из известных Key-Value БД и одна из самых производительных in-memory баз данных. Есть возможность работать не только в режиме in-memory, но и записывать данные на диск, причём достаточно гибко. Поддерживает различные структуры данных – строки, хэш-таблицы, списки и множества этих же объектов, упорядоченные множества и т.д.

Познакомимся с Redis поближе

Для начала развернём Redis в Docker-контейнере: docker run --name our-redis -p 6379:6379 redis

Подключимся к Redis c помощью консольного клиента, тоже завёрнутого в Docker-контейнер: docker run -it --network container:our-redis redis redis-cli -h 127.0.0.1

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

Итак, если вы увидели приглашение, то можно попробовать положить строчку по ключу:

127.0.0.1:6379> SET key value
OK

Синтаксис команд Redis достаточно прост: <имя команды> <аргументы>. Список всех команд можно посмотреть по ссылке, рекомендую держать эту вкладку открытой при изучении Redis.

Мы можем получить список всех ключей в БД:

127.0.0.1:6379> KEYS *
1) "key"

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

127.0.0.1:6379> type key
string

А потом получим значение по этому ключу:

127.0.0.1:6379> get key
"value"

Также можно посмотреть, как хранится эта строчка в Redis. Для этого используется команда Dump:

127.0.0.1:6379> dump key
"\x00\x05value\t\x00Q\x04\x90\xf4\x95,\xf8\xdf"

Оставлю вам удовольствие разобраться в этом формате самостоятельно.

Множества (Set) в Redis

Попробуем создать ключ и положить в него множество (Set) значений. Это можно сделать одной командой:

127.0.0.1:6379> sadd ourset value1 value2
(integer) 2

Проверим, что по этому ключу действительно лежит множество:

127.0.0.1:6379> type ourset
set

Посмотрим значения, лежащие в этом множестве:

127.0.0.1:6379> smembers ourset
1) "value2"
2) "value1"

И опять же можем посмотреть, как Redis хранит множество:

127.0.0.1:6379> dump ourset
"\x02\x02\x06value2\x06value1\t\x00\xf5C\x86\b\xe05\xef\xa4"

И, попробуем удалить одно из значений:

127.0.0.1:6379> srem ourset value1
(integer) 1
127.0.0.1:6379> smembers ourset
1) "value2"

Множества могут быть очень большими в Redis. Многие операции с множествами, например, объединение SUNION, – реализованы отдельными командами. А ещё можно очистить то, что мы добавили:

127.0.0.1:6379> del key ourset
(integer) 2
127.0.0.1:6379> type ourset
none

Хэш-таблицы (hash) в Redis

Более сложная структура данных – хэш-таблица (hash). Давайте попробуем создать что-то вроде JSON-документа на основе хэш таблиц. Представим, что у нас есть некий «адрес», представим его в табличном виде:

Поле Значение
City Omsk
Street Lenina
number 2

Запишем этот объект в хэш по полям и сразу увидим, что собой представляет хэш. Воспользуемся сначала командой добавления поля в хэш:

127.0.0.1:6379> hset address city Omsk
(integer) 1

Посмотрим, какого типа у нас получилось значение по ключу address:

127.0.0.1:6379> type address
hash

Вот мы и получили хэш-таблицу состоящую из пар field-value. Посмотреть список всех полей можно так:

127.0.0.1:6379> hkeys address
1) "city"

А все значения можно посмотреть с помощью команды:

127.0.0.1:6379> hvals address
1) "Omsk"

Добавим другие поля с помощью множественного «задания» полей:

127.0.0.1:6379> hmset address street Lenina number 2
OK

Посмотрим, что получилось с помощью другой команды:

127.0.0.1:6379> hgetall address
1) "city"
2) "Omsk"
3) "street"
4) "Lenina"
5) "number"
6) "2"

Да, здесь имя поля и его значение следуют друг за другом. Вот таким образом можно хранить более привычные объекты в Redis. Примерно таким образом и будут храниться объекты репозиториев Spring Data Redis.

Вот мы и познакомились с консольным интерфейсом. В следующей части изучим, как подключаться к Redis с помощью Spring Data.

Есть вопрос? Напишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться