Редис Эпизод-6

Структуры данных Redis

Пояснения к структурам данных и их использование в Redis

Всем привет! Сегодня мы собираемся обсудить структуры данных, доступные в хранилище данных Redis в памяти. Прежде чем углубиться в тему, мы сначала подробно обсудим некоторые суб-концепции. Это улучшит течение статьи.

Redis

Redis - это хранилище структур данных в памяти с открытым исходным кодом (Лицензия BSD), написанное на языке C и в основном поддерживающее Linux и связанные с ним операционные системы. Redis можно использовать как базу данных NoSQL и хранилище кэш-памяти. Это хранилище данных типа "ключ-значение", в отличие от реляционных баз данных, где данные хранятся в табличном формате. Операция в памяти позволяет Redis быть невероятно быстрым и производительным. Это основная причина, по которой многие разработчики интересуются Redis. Redis обеспечивает постоянство, даже если оно находится в памяти, с высокой масштабируемостью и простотой. Redis работает очень быстро с огромным набором данных, например, с графиком Twitter. Это реализовано в Redis. Помимо этого Stack overflow и Github также используют Redis в своей реализации в качестве хранилища кэш-памяти. Вы можете найти мою статью о Redis Introduction здесь.

Структуры данных

Нам может быть трудно, когда наши вещи не организованы должным образом на рабочих местах, в спальне и даже за рабочим столом. Любые рабочие места должны быть хорошо организованы, чтобы к ним можно было получить доступ, положить туда новые вещи или что-то убрать оттуда быстро и не мешая другим. Такая концепция в программировании называется структурами данных.

Структура данных - это специализированный формат для организации, обработки, извлечения и хранения данных. Существует множество примеров структур данных, таких как список, набор, хеш-таблица, дерево, стек, очередь, связанный список и т. Д. Все структуры данных предназначены для упорядочивания данных в соответствии с конкретными целями. Одна структура данных может быть очень полезной для одного варианта использования и бесполезной для другого варианта использования.

Структуры данных Redis

Несмотря на то, что Redis является хранилищем пар ключ-значение, он напрямую поддерживает несколько структур данных. Это списки, наборы, хэши, отсортированные наборы, растровые изображения и HyperLogLogs. Давайте посмотрим один за другим с более подробной информацией ниже.

Списки

Список - одна из общих структур данных во многих языках программирования. Список означает просто последовательность упорядоченных элементов с очень распространенной точки зрения. Списки могут быть реализованы с использованием различных структур данных, таких как массив или связанный список и т. Д. Функции списка могут отличаться в зависимости от типа реализации. Свойства списка, реализованного через массив, сильно отличаются от свойств списка, реализованного через связанный список.

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

Некоторые важные команды для списков

  1. LPUSH иRPUSH - это команды для перемещения элемента вправо и влево соответственно в список.
  2. Выталкивание элементов - это операция одновременного извлечения элемента из списка и его удаления из списка. Мы можем выталкивать элементы слева и справа, используя LPOP и RPOP, аналогично тому, как мы можем вставлять элементы с обеих сторон списка.

3. LRANGE извлекает диапазоны элементов из списка в Redis.

4. Команда LTRIM похожа на LRANGE, но вместо отображения указанного диапазона элементов она устанавливает этот диапазон как новое значение списка. Все элементы вне указанного диапазона удаляются.

Наборы

Наборы Redis - это неупорядоченные коллекции уникальных строк. Уникальные наборы средств не допускают повторения данных в ключе. Также возможно выполнить ряд операций с наборами, например, добавить значение для набора, проверить, существует ли уже данный элемент, создать пересечение, объединение или различие между несколькими наборами и т. Д. Установить добавить, удалить и проверить наличие элементов будет происходить с постоянным временем независимо от количества элементов, содержащихся внутри набора.

Некоторые важные команды для наборов

  1. Команда SADD добавляет новые элементы в набор.
  2. Команда SDIFF используется для вычитания нескольких наборов
  3. Чтобы пересечь несколько множеств, мы используем SINTER.
  4. Чтобы определить, является ли данное значение членом набора, мы можем использовать команду SISMEMBER.

Также есть множество других команд для наборов. Вы можете найти их здесь.

HashMap

HashMap идентичен HashTable, но не синхронизирован. Он также позволяет помещать нулевые ключи, но должен быть только один объект нулевого ключа и может быть любое количество нулевых значений. HashMap позволяет нам хранить пару ключей и значений, где ключи должны быть уникальными. Значения могут быть объектами любого типа для определенного ключа. Если вы попытаетесь вставить повторяющийся ключ, он заменит элемент соответствующего ключа.

Redis Hash

Redis Hashes - это карты между строковыми полями и строковыми значениями. Это абсолютный тип данных для представления объектов. Вы можете узнать, как хранить объекты в Redis здесь. Ключи уникальны. Двоичные ключи и значения можно хранить в Redis с помощью клиентов языка программирования. Например, Jedis.BinaryJedis, который доступен здесь.

Некоторые важные команды для хеширования Redis

  1. HSET используется для установки строкового значения хэш-поля.
  2. HGET используется для получения значения хэш-поля, хранящегося в указанном ключе.
  3. HGETALL предоставит все поля и значения, хранящиеся в хэше по определенному ключу.
  4. HEXISTS позволит нам проверить наличие ключевого поля.

Для Redis Hash доступны другие команды. Вы можете найти их здесь.

Сортированные наборы

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

  • Если A и B - два элемента с разными оценками, то A ›B, если A.score составляет› B.score.
  • Если A и B имеют одинаковую оценку, то A ›B, если строка A лексикографически больше, чем строка B. Строки A и B не могут быть равными, поскольку в отсортированных наборах есть только уникальные элементы.

Начнем с несложного примера. Добавление нескольких выбранных имен игроков в крикет в качестве отсортированных элементов набора с забегами, которые они набрали в финальном матче, в качестве счета.

> zadd wcwinners 0 "Virender Sehwag"
(integer) 1
> zadd wcwinners 18 "Sachin Tendulkar"
(integer) 1
> zadd wcwinners 97 "Gautam Gambhir"
(integer) 1
> zadd wcwinners 35 "Virat Kholi"
(integer) 1
> zadd wcwinners 91 "MS Dhoni"
(integer) 1
> zadd wcwinners 21 "Yuvraj Singh"
(integer) 1
  • zadd скорее sadd в обычных наборах, используется для добавления элементов в отсортированные наборы.
  • Сортированные наборы выполняются через двухпортовую структуру данных, содержащую как список пропусков, так и хеш-таблицу, поэтому каждый раз, когда мы добавляем элемент, Redis выполняет действие с O (log (N)). Это хорошо, но когда мы просим отсортированные элементы, Redis вообще не должен выполнять никакой работы, она уже отсортирована.
  • Когда мы вызываем thezrange от 0 до -1, все элементы в списке будут отсортированы. Мы можем вызвать zrevrange, чтобы получить элементы из отсортированного списка в обратном порядке.
> zrange wcwinners 0 -1
1) "Gautam Gambhir"
2) "MS Dhoni"
3) "Virat Kholi"
4) "Yuvraj Singh"
5) "Sachin Tendulkar"
6) "Virender Sehwag"
  • Мы можем получить отсортированные элементы в диапазоне с помощью команды zrangebyscore.
  • Мы также можем получить ранг определенного элемента в упорядоченном порядке с помощью команды zrank.
> zrank wcwinners "MS Dhoni"
(integer) 2

Есть и другие команды, которые применимы к отсортированным наборам, доступным здесь.

Растровые изображения

Растровые изображения не являются фактическим типом данных. В Redis нет специальной структуры данных для растровых изображений. Скорее, операции битового уровня выполняются в строках первичной структуры данных Redis.

Побитовые операции в основном делятся на две группы

  1. однобитная операция: например, установка бита, получение его значения
  2. операции над группами бит: подсчет количества установленных битов в заданном диапазоне бит

Одним из наиболее важных преимуществ растровых изображений является то, что они обычно дают наибольшую экономию места при хранении информации.

* Например, в системе, где разные пользователи описываются инкрементными идентификаторами пользователей, можно запомнить однобитную информацию (например, знать, хочет ли сотрудник получить бесплатный обед) о 4 миллиардах пользователей, используя всего 512 МБ объем памяти.

Биты устанавливаются и извлекаются с помощью команд setbit и getbit в BitMaps.

> setbit lunch 11 1
(integer) 1
> getbit lunch 11
(integer) 1

Команда setbit принимает в качестве своего первого аргумента номер бита, а в качестве второго аргумента значение для установки бита в 1 или 0. getbit просто возвращает значение бита по указанному индексу. Биты вне диапазона всегда считаются равными нулю.

  • bitpos - получает первый бит, имеющий указанное значение 0 или 1.
  • bitop - выполняет побитовые логические операции между разными строками.
  • bitcount - выполняет подсчет населения, сообщая количество битов, установленных на 1

Вы можете найти дополнительные команды для BitMaps здесь.

HyperLogLogs

HyperLogLog - это вероятностная структура данных, используемая для подсчета уникальных значений. Мы можем сопоставить это в математике с вычислением мощности множества. Обычно для подсчета отдельных элементов требуется объем памяти, пропорциональный количеству элементов, которые необходимо подсчитать.

Магия этого алгоритма заключается в том, что нам не требуется использовать объем памяти, пропорциональный количеству подсчитанных элементов, и вместо этого мы можем использовать фиксированный объем памяти. В худшем случае он использует 12 Кбайт. HLL в Redis закодированы как строка Redis, поэтому вы можете вызвать get для сериализации HLL и настроить его десериализацию обратно на сервер. Команды pfadd, pfcount и pfmerge используются в HyperLogLogs. Эти команды начинаются с префикса pf в памяти Филиппа Флажолета, изобретателя алгоритма HyperLogLog.

Пример использования вышеперечисленных команд приведен ниже.

> pfadd teachers raj kamal vimal
(integer) 1
> pfcount teachers
(integer) 3
> pfadd students kholi dhoni
(integer) 1
> pfmerge members teachers students
OK
> pfcount members
(integer) 5

Думаю, вы поняли тему, которую мы сегодня обсуждали. Если у вас есть какие-либо вопросы или пояснения, не стесняйтесь обращаться ко мне через раздел для ответов. Спасибо, что потратили свое драгоценное время на чтение этой статьи.

Ваше здоровье….

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel

Ссылка