Redis и Spring Data с самого начала. Часть 1
Работаете со 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-контейнере:
Подключимся к Redis c помощью консольного клиента, тоже завёрнутого в Docker-контейнер:
Основные команды в 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.
Есть вопрос? Напишите в комментариях!