Глава 2. Типы данных

Содержание

Глава 2. Типы данных
Введение
Применение строкового типа данных
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно
Применение типа данных списков
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно
Применение типа данных хэшей
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно
Применение типа данных множества
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Применение типа данных сортированного множества
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно
Применение типа данных HyperLogLog
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно
Применение типа данных Geo
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно
Ключи управления
Подготовка...
Как это сделать...
Как это работает...
Также ознакомьтесь...
Дополнительно

В этой главе мы рассмотрим следующие рецепты:

  • Применение строкового типа данных

  • Применение типа данных списков

  • Применение типа данных хэшей

  • Применение типа данных множества

  • Применение типа данных сортированного множества

  • Применение типа данных HyperLogLog

  • Применение типа данных Geo

  • Управление ключами

Введение

Когда дело доходит до проектирования приложения и разработки с помощью Redis, тип данных является центральным понятием. В отличии от RDBMS (relational database management system, системы управления реляционной базой данных), нет никаких таблиц или схем, о которых вам следует беспокоиться в Redis. Когда дело доходит до того, как организовать ваши данные в Redis, единственная вещь, которую вам следует рассмотреть в первую очередь, это какой из поддерживаемых естественным образом типов данных в Redis подходит вашему варианту применения наилучшим образом. Более того, у вас нет возможности манипулировать вашими данными в Redis при помощи SQL, как в реляционной базе данных. Вместо этого вы вызываете команду напрямую для своих целевых данных при помощи соответствующего API в сопровождении необходимых данных. Таким образом, другой момент, о котором вам следует задумываться, это могут ли соответствовать вашим бизнес- требованиям эти операции с определёнными данными в Redis.

В данной главе мы рассмотрим все типы данных и важные операции, которые относятся к Redis. Чтобы наилучшим образом проиллюстрировать имеющиеся типы данных и операции с ними, Будет показан проект демонстрационного приложения, подобного Yelp (для данного демонстрационного примера в этой книге мы будем называть его Relp). Relp является неким приложением для пользовательских обзоров и рекомендаций топовых ресторанов, торговых центров и прочих служб. С помощью Relp вы можете просматривать различные рестораны в некотором городе, находить первый в топе десяток гимназий в пределах определённого расстояния, выставлять рейтинги и обзорные комментарии для локальных служб и тому подобное. Все те данные, которые мы намереваемся хранить в Redis и скоторыми собираемся работать, будут целиком применяться в Redis.

Применение строкового типа данных

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

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

Для понимания того как применять строковый тип данных, выполните следующую последовательность:

  1. Откройте Терминал и подключитесь к Redis при помощи redis-cli.

  2. Для привязки строкового значения к некоторому ключу воспользуйтесь командой SET. В Кelp мы можем применять имеющееся у ресторана название в качестве ключа, а его адрес как устанавливаемое значение; например, если мы желаем установить значение адреса для ресторана "Extreme Pizza":

    
    127.0.0.1:6379> SET "Extreme Pizza" "300 Broadway, New York, NY"
    OK
     	   
  3. Выборку имеющегося строкового значения можно сделать просто воспользовавшись командой GET:

    
    127.0.0.1:6379> GET "Extreme Pizza"
    "300 Broadway, New York, NY"
     	   
  4. Исполнение GET с несуществующим ключом вернёт (nil):

    
    127.0.0.1:6379> GET "Yummy Pizza"
    (nil)
     	   
  5. Соответствующая команда STRLEN возвращает значение длины данной строки; к примеру, если мы пожелаем узнать длину строки "Extreme Pizza":

    
    127.0.0.1:6379> STRLEN "Extreme Pizza"
    (integer) 26
     	   
  6. Исполнение STRLEN с несуществующей строкой вернёт 0:

    
    127.0.0.1:6379> STRLEN "Yummy Pizza"
    (integer) 0
     	   

Redis также предоставляет пару команд для прямой манипуляцией строками без применения GET для выборки необходимого значения и SET для обратного его назначения:

  • Для добавления в конец некоторого ключа значения определённой строки воспользуйтесь командой APPEND:

    
    127.0.0.1:6379> APPEND "Extreme Pizza" " 10011"
    (integer) 32
    127.0.0.1:6379> GET "Extreme Pizza"
    "300 Broadway, New York, NY 10011"
     	   
  • Для перезаписи части значения определённой строки применяйте SETRANGE; скажем, если бы мы пожелали обновить значение адреса "Extreme Pizza":

    
    127.0.0.1:6379> SETRANGE "Extreme Pizza" 14 "Washington, DC 20009"
    (integer) 34
    127.0.0.1:6379> GET "Extreme Pizza"
    "300 Broadway, Washington, DC 20009"
     	   

Как это работает...

Возможно, GET и SET наиболее часто используемые команды в Redis. Формат команды SET очень простой:


SET <key> <value>
 	   

Если команда SET исполнена успешно, Redis возвращает OK. Команда APPEND добавляет некую строку в конец имеющейся строки и возвращает значение длины новой строки. Если указанный ключ не существует, Redis вначале создаст для этого ключа пустую строку и затем исполнит APPEND. Команда SETRANGE переписывает часть имеющейся строки, начиная со значения определяемого смещения и вплоть до окончания всей этой строки. Смещение строки в Redis начинается с 0. SETRANGE возвращает получаемое значение длины новой строки после осуществления определяемой в ней замены.

Также ознакомьтесь...

Если уже имеется некое связанное с заданным ключом значение, команда SET перепишет это значение. Порой мы не желаем чтобы установленное значение было перезаписано вслепую, раз уж этот ключ существует; одна из вещей, которую мы можем сделать для этого, это воспользоваться командой EXIST для проверки наличия данного ключа перед исполнением своего SET. Тем не менее, Redis предоставляет некую команду SETNX (сокращение от SET если данный ключ Not Exist), которая может быть применена для установки соответствующего значения ключа только в том случае, если он не определён, причём в атомарной операции. SETNX возвращает значение 1 если данный ключ был успешно установлен и 0 когда ключ уже имеется и поэтому старое значение не перезаписывается:


127.0.0.1:6379> SETNX "Lobster Palace" "437 Main St, Chicago, IL"
(integer) 1
127.0.0.1:6379> SETNX "Extreme Pizza" "100 Broadway, New York, NY"
(integer) 0
 	   

Параметр NX в команде SET делает то же самое что и SETNX. В то же время обратного параметра XX в команде SET, который заставлял бы команду SET устанавливать значение данного ключа только если оно уже имеется, не существует.

Мы можем выполнять установку и выборку множества ключей за раз применяя MSET и MGET. Основное преимущество операции MSET состоит в том, что эта операция целиком атомарная, что означает, что все значения ключей устанавливаются за один проход от клиента к серверу. Таким образом мы можем избегать излишних накладных расходов в сети применяя команду MSET вместо исполнения множества команд SET. Приведём формат команд MSET и MGET:


MSET key value [key value...]
MGET key value [key value...]

127.0.0.1:6379> MSET "Sakura Sushi" "123 Ellis St, Chicago, IL" "Green Curry
Thai" "456 American Way, Seattle, WA"
OK

127.0.0.1:6379> MGET "Sakura Sushi" "Green Curry Thai" "nonexistent"
1) "123 Ellis St, Chicago, IL"
2) "456 American Way, Seattle, WA"
3) (nil)
 	   

Будет полезно отметить каким образом строки кодируются внутри объектов Redis. Redis применяет три различных кодировки для сохранения объектов и будет принимать решение по определению кодирования автоматически в зависимости от значения строки:

  • int: Для строк, представляющих 64- битовые целые со знаком

  • embstr: Для строк, чья длина меньше или равна 44 байтам (в Redis 3.x здесь применялось значение 39 байт); данный тип кодирования более эффективен в отношении использования памяти и производительности

  • raw: Для строк, чья длина превышает 44 байта

Для знакомства с внутренним представлением кодировки значения объекта Redis, связанного с данным ключом, мы можем воспользоваться имеющейся командой OBJECT:


127.0.0.1:6379> SET myKey 12345
OK
127.0.0.1:6379> OBJECT ENCODING myKey
"int"
127.0.0.1:6379> SET myKey "a string"
OK
127.0.0.1:6379> OBJECT ENCODING myKey
"embstr"
127.0.0.1:6379> SET myKey "a long string whose length is more than 39 bytes"
OK
127.0.0.1:6379> OBJECT ENCODING myKey
"raw"
 	   

Дополнительно

  • Команда OBJECT может ещё много чего делать помимо инспекции кодировки, так как она также позволяет нам инспектировать в объектах Redis refcount и idletime, (https://redis.io/commands/object).

  • Из- за ограничения в размере, у нас нет возможности продемонстрировать все команды для типа строковых данных в данном рецепте. Для знакомства со всеми строковыми командами отсылаем вас к https://redis.io/commands#string.

  • Относительно управления ключами, в том числе перечисление, переименование и удаление ключей, обратитесь к разделу Ключи управления в данной главе.

Применение типа данных списков

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

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

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

  1. Откройте Терминал и подключитесь к Redis с помощью redis-cli.

  2. Сейчас мы собираемся применять некий список для хранения любимых ресторанов. Для вставки двух названий ресторанов в левый конец некоторого перечня воспользуйтесь LPUSH:

    
    127.0.0.1:6379> LPUSH favorite_restaurants "PF Chang's" "Olive Garden"
    (integer) 2
     	   
  3. Дл получения всех названий ресторанов из данного перечня примените LRANGE:

    
    127.0.0.1:6379> LRANGE favorite_restaurants 0 -1
    1) "Olive Garden"
    2) "PF Chang's"
     	   
  4. Для всавки некоторого названия ресторана в правый конец списка воспользуйтесь RPUSH:

    
    127.0.0.1:6379> RPUSH favorite_restaurants "Outback Steakhouse" "Red Lobster"
    (integer) 4
    127.0.0.1:6379> LRANGE favorite_restaurants 0 -1
    1) "Olive Garden"
    2) "PF Chang's"
    3) "Outback Steakhouse"
    4) "Red Lobster"
     	   
  5. Для вставки нового названия ресторана после "PF Chang's" примените LINSERT:

    
    127.0.0.1:6379> LINSERT favorite_restaurants AFTER "PF Chang's" "Indian
    Tandoor"
    (integer) 5
    127.0.0.1:6379> LRANGE favorite_restaurants 0 -1
    1) "Olive Garden"
    2) "PF Chang's"
    3) "Indian Tandoor"
    4) "Outback Steakhouse"
    5) "Red Lobster"
     	   
  6. Для выборки определённого названия ресторана по позиции индекса 3 в данном перечне воспользуйтесь LINDEX:

    
    127.0.0.1:6379> LINDEX favorite_restaurants 3
    "Outback Steakhouse"
     	   

Как это работает...

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

  • LPUSH: Вставляет новые элементы в начало, с левого конца данного перечня

  • RPUSH: Добавляет элементы в конец, с правой стороны определённого перечня

  • LINSERT: Вставляет элементы до или после опорного элемента в заданном списке

LPUSH, RPUSH и LINSERT возвращают значение длины обрабатываемого списка после вставки. Нет необходимости инициализировать некий пустой перечень для какого- то ключа перед помещением элементов. Если мы помещаем элементы в заданный перечень для несуществующего ключа, Redis создаст вначале некий пустой список и свяжет его с данным значением ключа. Аналогично, нам нет нужды удалять ключи, у которых связанные с ними списки пустые, так как Redis выполняет очистку сам за нас.

[Совет]Совет

Если вы желаете помещать элементы в некий перечень только если данный список уже имеется, вы можете применять команды LPUSHX и EPUSHX .

Для удаления некоторого элемента из какого- то списка мы можем применять LPOP или RPOP, которые удаляют самый первый элемент с левого или с правого конца данного перечня и возвращает его значение. Исполнение LPOP или RPOP для non_existent ключа возвратит (nil):


127.0.0.1:6379> LPOP favorite_restaurants
"Olive Garden"
127.0.0.1:6379> RPOP favorite_restaurants
"Red Lobster"
127.0.0.1:6379> LPOP non_existent
(nil)
		

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

[Совет]Совет

Какие соглашения применяются для индексации перечня в Redis? Допустим, что у нас в списке имеется N элементов; индекусы списка могут быть определены как 0 ~ N-1 слева направо и как -1 ~ -N справа налево. Следовательно, 0 ~ -1 предоставляет полный перечень. Имеющееся соглашение для индексации перечня Redis очень похоже на применяемую в списках Python, однако список Python более похож на некий массив в прочих языках программирования.

Для удаления множества элементов в некотором списке может применяться команда LTRIM при сохранении только того диапазона данного перечня, который определяется индексами начального и конечного элементов:

 
127.0.0.1:6379> LRANGE favorite_restaurants 0 -1
1) "PF Chang's"
2) "Indian Tandoor"
3) "Outback Steakhouse"
127.0.0.1:6379> LTRIM favorite_restaurants 1 -1
OK
127.0.0.1:6379> LRANGE favorite_restaurants 0 -1
1) "Indian Tandoor"
2) "Outback Steakhouse"
		

Для установки определённого значения некоторого элемента в данном перечне с заданным индексом можно воспользоваться командой LSET:

 
127.0.0.1:6379> LSET favorite_restaurants 1 "Longhorn Steakhouse"
OK
127.0.0.1:6379> LRANGE favorite_restaurants 0 -1
1) "Indian Tandoor"
2) "Longhorn Steakhouse"
		

Также ознакомьтесь...

Существуют версии команд LPOP и RPOP с блокировкой: BLPOP и BRPOP. Обе эти команды выдадут некий элемент с левой или с правой стороны данного списка, так же как и команды без блокировки, однако, их клиент будет блокирован в случае пустого перечня. Для максимального значения времени ожидания в этих командах блокируемой выдачи необходимо устанавливать максимальное значение таймаута в секундах. Нулевое значение таймаута означает бесконечное ожидание. Это свойство полезно при сценариях диспетчеризации заданий, при которых множество исполнителей (Клиентов Redis, workers) ожидают конкретного планирования для назначения нового задания. Такие исполнители могут применять BLPOP и BRPOP в некоторм списке Redis. Всякий раз, когда имеется некое новое задание, имеющийся диспетчер пропихивает это задание в данный список, а один из исполнителей подхватывает его.

Давайте откроем ещё два Терминала, которые представляют собой двух Клиентов Redis: worker-1 и worker-2 и позволим им выполнить соединение с тем же самым Сервером Redis при помощи redis-cli. Позволим первоначальному Клиенту Redis выступать в роли диспетчера.

Из обоих клиентов исполнителей запустите BRPOP на одном и том же перечне job_queue для ожидания новых заданий:


worker-1> BRPOP job_queue 0
worker-2> BRPOP job_queue 0
		

Из своего диспетчера вытолкните некий новый элемент в данный список:


dispatcher> LPUSH job_queue job1
(integer) 1
		

Так как worker-1 исполняет BRPOP до worker-2, worker-1 является не блокированным в начале и получает job1:


worker-1> BRPOP job_queue 0
1) "job_queue"
2) "job1"
(170.81s)
		

Так как worker-2 всё ещё блокирован, давайте вытолкнем ещё два элемента в свой список из нашего диспетчера:


dispatcher> LPUSH job_queue job2 job3
		

worker-2 не блокирован и получает job2, в то время как job3 остаётся в списке, ожидая того, что его кто- нибудь прихватит:


worker-2> BRPOP job_queue 0
1) "job_queue"
2) "job2"
(358.12s)

dispatcher> LRANGE job_queue 0 -1
1) "job3"
		

Redis для хранения объектов применяет внутреннее кодирование quicklist. Для настройки применения хранения в памяти перечня объектов применяются два параметра настройки:

  • list-max-ziplist-size: Значение максимального размера некоторого узла внутреннего списка в каком- то элементе списка. В большинстве случаев просто оставляется установленное по умолчанию значение.

  • list-compress-depth: Политика сжатия данного списка. Если вы собираетесь применять головной и хвостовой элементы некоторого перечня Redis, вы можете применять эту настройку для получения некоторого лучшего соотношения сжатия списка.

Дополнительно

  • В данном рецепте мы не рассмотрели все команды работы со списком Redis. За полной справкой по этим командам отсылаем вас к https://redis.io/commands#list.

Применение типа данных хэшей

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

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

Для понимания того, как использовать тип данных хэша, выполните следующую последовательность шагов:

  1. Откройте Терминал и подключитесь к Redis при помощи redis-cli.

  2. Теперь давайте установим соответствующие информационные свойства для определённого ресторана "Kyoto Ramen" при помощи команды HMSET:

    
    127.0.0.1:6379> HMSET "Kyoto Ramen" "address" "801 Mission St, San Jose, CA" "phone" "555-123-6543" "rating" "5.0"
    OK
     	   
  3. Для выборки значений из хэша воспользуйтесь командой HMGET:

    
    127.0.0.1:6379> HMGET "Kyoto Ramen" "address" "phone" "rating"
    1) "801 Mission St, San Jose, CA"
    2) "555-123-6543"
    3) "5.0"
     	   
  4. Для выборки определённого значения некоторого отдельного ключа примените HGET:

    
    127.0.0.1:6379> HGET "Kyoto Ramen" "rating"
    "5.0"
     	   
  5. Для проверки того, что соответствующие поля и значения присутствуют в каком- то хэше применяйте HEXISTS:

    
    127.0.0.1:6379> HEXISTS "Kyoto Ramen" "phone"
    (integer) 1
    127.0.0.1:6379> HEXISTS "Kyoto Ramen" "hours"
    (integer) 0
     	   
  6. Для получения всех полей и значений в каком- то хэше может применяться команда HGETALL:

    
    127.0.0.1:6379> HGETALL "Kyoto Ramen"
    1) "address"
    2) "801 Mission St, San Jose, CA"
    3) "phone"
    4) "555-123-6543"
    5) "rating"
    6) "5.0"
     	   
    [Совет]Совет

    Рекомендуется применять HGETALL для больших хэшей; основные причины этого мы поясним позднее.

  7. Аналогично, имеется команда HSET, которая устанавливает необходимое значение для какого- то отдельного поля. Эту команду можно применять для изменения имеющегося значения некоторого существующего поля или добалвения новых полей:

    
    127.0.0.1:6379> HSET "Kyoto Ramen" "rating" "4.9"
    (integer) 0
    127.0.0.1:6379> HSET "Kyoto Ramen" "status" "open"
    (integer) 1
    
    127.0.0.1:6379> HMGET "Kyoto Ramen" "rating" "status"
    1) "4.9"
    2) "open"
     	   
  8. Для удаления полей из некотрого хэша воспользуйтесь соответствующей командой HDEL:

    
    127.0.0.1:6379> HDEL "Kyoto Ramen" "address" "phone"
    (integer) 2
    127.0.0.1:6379> HGETALL "Kyoto Ramen"
    1) "rating"
    2) "4.9"
     	   

Как это работает...

Аналогично тому, как мы это уже упоминали в Применение типа данных списков, нам нет необходимости инициализировать некий пустой хэш перед добавлением полей. При помощи HSET и HMSET Redis будет делать это автоматически. Аналогично, Redis будет выполнять работу по очистке когда некий хэш становится пустым.

По умолчанию HSET и HMSET будут переписывать любые имеющиеся поля. Для предотвращения такого определяемого по умолчанию поведения перезаписи HSET можно применять команду HSET, которая устанавливает значение определяемого поля только если такое поле не существует:


127.0.0.1:6379> HSETNX "Kyoto Ramen" "phone" "555-555-0001"
(integer) 0
127.0.0.1:6379> HGET "Kyoto Ramen" "phone"
"555-123-6543"
 	   

Для всякого не существующего ключа или поля HSET и HMSET будут возвращать (nil):


127.0.0.1:6379> HMGET "Kyoto Ramen" "rating" "hours"
1) "4.9"
2) (nil)

127.0.0.1:6379> HGET "Little Sheep Mongolian" "address"
(nil)
 	   

Также ознакомьтесь...

Максимальное число полей, которое может быть помещено в хэш составляет 232-1. Если в некотором хэше имеется большее число полей, исполнение команды HGETALL. При таких обстоятельствах мы можем применять HSCAN для выборки приращениями вснх необходимых полей и значний.

HSCAN является одной из определяемых в Redis команд SCAN (SCAN, HSCAN, SSCAN, ZSCAN), которые инкрементально выполняют итерации по всем элементам и, следовательно, не блокируют имеющийся сервер. Такая команда является основанным на курсоре итераторе, поэтому вам требуется определять какой- то курсор при каждом вызове такой команды, причём начальным значением курсора является 0. После того, как данная команда завершена, Redis возвратит некий перечень элементов совместно с каким-то новым курсором, который можно применять для следующей итерации.

HSCAN может вызываться в следующих форматах:

  • HSCAN курсора ключа [MATCH pattern] [COUNT number].

  • Соответствующего параметра MATCH может применяться для установления соответствия полей, которые применяют шаблоны глобального стиля.

  • Опции COUNT, которая выступает всего лишь некоторой подсказкой того, сколько элементов должно выдаваться при каждой итерации. Redis не даёт гарантии того, что получаемое при возврате число элементов в точности соответствует значению COUNT. Установленным по умолчанию значением COUNT является 10.

Представим себе, что у нас имеется очень большой хэш в котором имеются миллионы, а может быть и ещё больше, полей. Давайте применим HSCAN для итераций по тем полям, которые содержат конкретное ключевое слово garden:


127.0.0.1:6379> HSCAN restaurant_ratings 0 MATCH *garden*
1) "309"
2) 1) "panda garden"
   2) "3.9"
   3) "chang's garden"
   4) "4.5"
   5) "rice garden"
   6) "4.8"
 	   

Для выполнения нового сканирования мы можем воспользоваться полученным от нашего сервера значением курсора 309 для начала нового сканирования:


127.0.0.1:6379> HSCAN restaurant_ratings 309 MATCH *garden*
1) "0"
2) 1) "szechuwan garden"
   2) "4.9"
   3) "garden wok restaurant"
   4) "4.7"
   5) "win garden"
   6) "4.0"
   7) "east garden restaurant"
   8) "4.6"
 	   

Отметим, что возвращаемое сервером новое значение курсора 0 означает, что выполнено полное сканирование.

Для внутреннего хранения объектов хэша Redis использует два вида кодировки:

  • ziplist: Для хэшей, чья длина не превышает list-max-ziplist-entries (по умолчанию: 512), а имеющийся размер каждого элемента в данном списке не превышает значение list-max-ziplist-value (по умолчанию: 64) в своих настройках. ziplist используется для сохранении пространства при небольших хэшах.

  • hashtable: Это определяемое по умолчанию кодирование в случае, когда не может применяться ziplist для данной конфигурации.

Дополнительно

Применение типа данных множества

Тип данных множества является собранием уникальных и неупорядоченных объектов. Они часто применяются в приложениях для проверки участия, удаления дублирований, а также операций установки соответствия (объединения, пересечения и вычитания). Значениями объектов Redis могут быть наборы строк. В данном рецепте мы будем сохранять в наборе Redis теги ресторанов и демонстрировать основные команды для манипуляции неким множеством.

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

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

  1. Откройте Терминал и соединитесь с Redis при помощи redis-cli.

  2. Добавьте тег для ресторана "Original Buffalo Wings", воспользовавшись следующей командой SADD:

    
    127.0.0.1:6379> SADD "Original Buffalo Wings" "affordable" "spicy"
    "busy" "great taste"(integer) 4
     	   
  3. Для проверки того, является ли некий элемент участником определённого множества, примените SISMEMBER:

    
    127.0.0.1:6379> SISMEMBER "Original Buffalo Wings" "busy"(integer)
    1127.0.0.1:6379> SISMEMBER "Original Buffalo Wings" "costly"(integer) 0
     	   
  4. Чтобы применить SREM для удаления элементов из некоторого множества, давайте удалим "busy" и "spicy" из установленных тегов определённого ресторана:

    
    127.0.0.1:6379> SREM "Original Buffalo Wings" "busy" "spicy"(integer)
    2127.0.0.1:6379> SISMEMBER "Original Buffalo Wings" "busy"(integer)
    0127.0.0.1:6379> SISMEMBER "Original Buffalo Wings" "spicy"(integer) 0
     	   
  5. Воспользуйтесь командой SCARD для получение общего числа участников определённого множества:

    
    127.0.0.1:6379> SCARD "Original Buffalo Wings"
    (integer) 2
     	   

Как это работает...

Аналогично спискам и хэшам, Redis создаёт для нас некое пустое множество при исполнении SREM, в случае, когда указанный ключ не существует. Redis также автоматически очищает пустые наборы для ключей.

Также ознакомьтесь...

Максимальное значение элементов, которое может быть помещено в некий набор Redis составляет 232-1.

Имеется команда с названием SMEMBERS, которая может применяться для перечисления всех элементов в некотором множестве, однако, аналогично тому, как мы уже упоминали в отношении HGETALL в разделе Применение типа данных хэшей, применение SMEMBERS в больших наборах может блокировать ваш сервер и, следовательно, не рекомендуется лоя применения. Для больших множеств вместо этого следует применять SSCAN. Исользование SSCANво многом аналогично применению команды HSCAN, которую мы представили в разделе Применение типа данных хэшей.

Redis предоставляет некую группу команд для объединения (SUNION, SUNIONSTORE), пересечения (SINTER, SINTERSTORE) и операции вычитания (SDIFF, SDIFFSTORE). Данные команды в отсутствии постфикса STORE просто возвращают получаемое в результате соответствующих операций множество, в то время как применение команды STORE сохраняет получаемый результат в некотором ключе назначения.

Вот некий пример использования SINTER и SINTERSTORE. Давайте добавим теги к другому ресторану, "Big Bear Wings", и получим общие теги для "Original Buffalo Wings" и "Big Bear Wings":


127.0.0.1:6379> SMEMBERS "Original Buffalo Wings"
1) "affordable"
2) "great taste"
127.0.0.1:6379> SADD "Big Bear Wings" "affordable" "spacious" "great music"
(integer) 3
127.0.0.1:6379> SINTER "Original Buffalo Wings" "Big Bear Wings"
1) "affordable"

127.0.0.1:6379> SINTERSTORE "common_tags" "Original Buffalo Wings" "Big Bear Wings"
(integer) 1
127.0.0.1:6379> SMEMBERS "common_tags"
1) "affordable"
 	   

Внутри себя Redis использует два метода кодировки для хранения множества объектов:

  • intset: Применяется в настройке для наборов, в которых все элементы являются целыми, а общее число элементов в данном множестве менее чем set-max-intset-entries (значение по умолчанию 512). intset применяется для сохранения пространства для небольших хэшей.

  • hashtable: Устанавливаемая по умолчанию кодировка, когда для настройки не может применяться intset.

Применение типа данных сортированного множества

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

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

Для понимания того как применять тип данных сортированного множества выполните следующую последовательность шагов:

  1. Откройте Терминал и подключитесь к Redis при помощи redis-cli.

  2. Для осуществления ранжирования для всех локальных ресторанов в Relp, воспользуйтесь следующим:

    1. Самый первый шаг, который мы предпримем, состоит в помещении рейтинга голосования и самого названия каждого ресторана в некое сортированное множество. Здесь мы применим команду ZADD.

      
      127.0.0.1:6379> ZADD ranking:restaurants 100 "Olive Garden" 23 "PF Chang's" 34 "Outback Steakhouse" 45 "Red Lobster" 88 "Longhorn Steakhouse"
      (integer) 5
       	   
    2. А затем вы можете выполнять выборку этого ранжирования при помощи команды ZREVRANGE:

      
      127.0.0.1:6379> ZREVRANGE ranking:restaurants 0 -1 WITHSCORES
       1) "Olive Garden"
       2) "100"
       3) "Longhorn Steakhouse"
       4) "88"
       5) "Red Lobster"
       6) "45"
       7) "Outback Steakhouse"
       8) "34"
       9) "PF Chang's"
      10) "23"
       	   
    3. Если один из пользователь Relp поднимает рейтинг некоторого ресторана в Relp, вы можете применить команду ZINCRBY для повышения соответствующего уровня данного ресторана в данном ранжировании:

      
      127.0.0.1:6379> ZINCRBY ranking:restaurants 1 "Red Lobster"
      "46"
       	   
    4. Если некий пользователь пожелает просмотреть установленные ранги и установленное число голосов для некоторого определённого ресторана, имеющиеся команды ZREVRANK и ZSCORE вернут соответствующий результат:

      
      127.0.0.1:6379> ZREVRANK ranking:restaurants "Olive Garden"
      (integer) 0
      
      127.0.0.1:6379> ZSCORE ranking:restaurants "Olive Garden"
      "100"
       	   
    5. В случае, когда имеется ещё один более надёжный рейтинг ресторанов из иного источника и требуется комбинация этих двух ранжирований, может применяться команда ZUNIONSTORE:

      
      127.0.0.1:6379> ZADD ranking2:restaurants 50 "Olive Garden" 33 "PF Chang's" 55 "Outback Steakhouse" 190 "Kung Pao House"
      (integer) 4
      
      127.0.0.1:6379> ZUNIONSTORE totalranking 2 ranking:restaurants ranking2:restaurants WEIGHTS 1 2
      (integer) 6
      
      127.0.0.1:6379> ZREVRANGE totalranking 0 -1 WITHSCORES
       1) "Kung Pao House"
       2) "380"
       3) "Olive Garden"
       4) "200"
       5) "Outback Steakhouse"
       6) "144"
       7) "PF Chang's"
       8) "89"
       9) "Longhorn Steakhouse"
      10) "88"
      11) "Red Lobster"
      12) "46"
      127.0.0.1:6379>
       	   

Как это работает...

В команде ZADD при помощи опции NX мы можем только добавлять новые элементы для данного множества если они уже имеют в своёс составе некие элементы:


127.0.0.1:6379> ZADD ranking:restaurants NX 50 "Olive Garden"
(integer) 0

127.0.0.1:6379> ZREVRANGE ranking:restaurants 0 -1 WITHSCORES
 1) "Kung Pao House"
 2) "213"
 3) "Olive Garden"
 4) "100"
 5) "Longhorn Steakhouse"
 6) "88"
 7) "Red Lobster"
 8) "46"
 9) "Outback Steakhouse"
10) "34"
11) "PF Chang's"
12) "23"
		

Аналогично, другая имеющаяся опция, XX, позволяет вам обновлять определённое множество без добавления в него новых элементов. Заметьте, пожалуйста, что данные опции могут применяться только с версии Redis 3.0.2 и выше.

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

Для выполнения объединения из двух сортированных множеств и сохранения значения в некий ключ назначения применяется команда ZUNIONSTORE. Могут применяться различные веса. Краткий синтаксис команды ZUNIONSTORE может быть перечислен следующим образом:


ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
		

Начальный и конечный индексы в команде ZREVRANGE следуют соглашениям индекса Redis, которые мы уже упоминали в своём рецепте Применение типа данных хэшей. Таким образом, 0 означает самый первый элемент, а 1 является последующим элементом, -1 означает самый последний элемент, а -2 второй с конца и так далее. Следовательно, топ перечня трёх ресторанов может быть выделен при помощи следующей команды:


127.0.0.1:6379> ZREVRANGE totalranking 0 2 WITHSCORES
1) "Kung Pao House"
2) "380"
3) "Olive Garden"
4) "200"
5) "Outback Steakhouse"
6) "144
		

Также ознакомьтесь...

Когда дело доходит до имеющегося комплекса Redis API, всегда следует уделять внимание значениям времени и сложности. В сортированном множестве вариантом применения являются API ZINTERSTORE и ZUNIONSTORE.

К вашему сведению, Redis также применяет внутри себя два метода кодирования для хранения объектов сортированных множеств, как и в типе данных перечня, который мы упоминали в рецепте Применение типа данных хэшей:

  • ziplist: Применяется в настройке для некоторого сортированного множества, чья длина меньше чем zset-max-ziplist-entries (значение по умолчанию 128), а имеющийся размер каждого элемента в данном множестве менее zset-max-ziplist-value (значение по умолчанию 64). ziplist применяется для сохранения пространства в случае списков малой длины.

  • skiplist: Является устанавливаемым по умолчанию кодированием, когда не может применяться кодирование ziplist в определяемой конфигурации.

Дополнительно

  • Из- за ограничений в размере данной книги мы не охватили все команды сортированного множества Redis. Относительно полного перечня команд воспользуйтесь ссылкой https://redis.io/commands#sorted_se.

Применение типа данных HyperLogLog

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

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

Для того чтобы разобраться с тем как применять тип данных HyperLogLog, воспользуйтесь следующей последовательностью шагов:

  1. Откройте Терминал и подключитесь к Redis при помощи redis-cli.

  2. Для подсчёта различных посетителей ресторана с названием Olive Garden в Relp мы можем выполнять подсчёт за раз при помощи PFADD с применением идентификатора одного пользователя:

    
    127.0.0.1:6379> PFADD "Counting:Olive Garden" "0000123"
    (integer) 1
    
    127.0.0.1:6379> PFADD "Counting:Olive Garden" "0023992"
    (integer) 1
     	   
  3. Далее, чтобы выполнить выборку того сколько различных пользователей посетило данный ресторан, примените такую команду PFCOUNT:

    
    127.0.0.1:6379> PFCOUNT "Counting:Olive Garden"
    (integer) 2
     	   

Другой более сложный пример, когда вы желаете показать значение числа уникальных посетителей для Olive Garden в неделю через Relp как некий индикатор еженедельной популярности; вы можете сохранять по одному HLL в день и сливать их в семь дней при помощи команды PFMERGE для генерации требуемого результата:


127.0.0.1:6379> PFADD "Counting:Olive Garden:20170903" "0023992" "0023991" "0045992"
(integer) 1
127.0.0.1:6379> PFADD "Counting:Olive Garden:20170904" "0023992" "0023991" "0045992"
(integer) 1
127.0.0.1:6379> PFADD "Counting:Olive Garden:20170905" "0024492" "0023211" "0045292"
(integer) 1
127.0.0.1:6379> PFADD "Counting:Olive Garden:20170906" "0023999" "0063991" "0045922"
(integer) 1
127.0.0.1:6379> PFADD "Counting:Olive Garden:20170907" "0023292" "0023991" "0045921"
(integer) 1
127.0.0.1:6379> PFADD "Counting:Olive Garden:20170908" "0043282" "0023984" "0045092"
(integer) 1
127.0.0.1:6379> PFADD "Counting:Olive Garden:20170909" "0023992" "0023991" "0045992"
(integer) 1

127.0.0.1:6379> PFMERGE "Counting:Olive Garden:20170903week" "Counting:Olive Garden:20170903" "Counting:Olive Garden:20170904" "Counting:Olive Garden:20170905" "Counting:Olive Garden:20170906" "Counting:Olive Garden:20170907" "Counting:Olive Garden:20170908" "Counting:Olive Garden:20170909"
OK
127.0.0.1:6379> PFCOUNT "Counting:Olive Garden:20170903week"
(integer) 14
 	   

Как это работает...

Все команды в Redis HLL начинаются с символов PF, в честь Philippe Flajolet, который был изобретателем структуры данных HLL. В данной книге мы не будем погружаться в подробности алгоритмов HLL. Основным преимуществом HLL в Redis является то, что он вычисляет различные количества применяя некий фиксированный объём памяти (менее чем 12кБ на ключ для кардинальных чисел 264) и постоянную сложность по времени (O(1) на ключ). Тем не менее, имеется некий компромисс относительно алгоритмов HLL, состоящий в том, что возвращаемое значение кардинального числа {мощности} не является точным со стандартной ошибкой, не превышающей 1%.

Также ознакомьтесь...

HLL на практике хранится в виде строк и он является простым для удержания и восстановления пар ключ- значение.

К вашему сведению: HLL в Redis применяет два внутренних представления хранения объектов HLL:

  • Sparse (рассредоточенные): при настройке для объектов HLL, чья длина не превышает hll-sparse-max-bytes (значение по умолчанию 3000). Представление Sparse более эффективно в отношении пространства, в то время как требует большей стоимости ЦПУ от Redis.

  • Dense (плотные): значение кодирования по умолчанию в конфигурациях, где не может применяться Sparse.

Дополнительно

Применение типа данных Geo

Всё большую популярность приобретают службы на основе местоположения по мере того, как смартфоны становятся всё более распространёнными. Для поддержки хранения и запросов географических координат в таких связанных с местоположением сценариях, начиная с выпуска 3.2 в Redis официально был предложен API Geo. В данном рецепте мы исследуем тип данных Geo в Redis.

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Как это сделать...

Чтобы разобраться с тем как применять тип данных Geo выполните следующую последовательность действий:

  1. Откройте Терминал и подключитесь к Redis при помощи redis-cli.

  2. Для целей нашего демонстрационного приложения Relp мы можем добавить пять ресторанов Калифорнии в некий набор Geo с названием restaurants:CA при помощи GEOADD:

    
    127.0.0.1:6379> GEOADD restaurants:CA -121.896321 37.916750 "Olive Garden" -117.910937 33.804047 "P.F. Chang's" -118.508020 34.453276 "Outback Steakhouse" -119.152439 34.264558 "Red Lobster" -122.276909 39.458300 "Longhorn Charcoal Pit"
    (integer) 5
     	   
  3. Теперь, вызвав GEOPOS мы получаем координаты для заданного участника набора Geo:

    
    127.0.0.1:6379> GEOPOS restaurants:CA "Red Lobster"
    1) 1) "-119.1524389386177063"
       2) "34.26455707283378871"
     	   
  4. Допустим, вы пребываете в парке штата Гора дьявола, значения долготы/ широты которого составляют -121.923170/37.878506 и вы желаете знать какие рестораны находятся в радиусе 5 километров от вашего текущего местоположения:

    
    127.0.0.1:6379> GEORADIUS restaurants:CA -121.923170 37.878506 5 km
    1) "Olive Garden"
     	   
  5. Иногда вам нужно определить расстояние между двумя ресторанами; для этого вы вызываете API с названием GEODIST:

    
    127.0.0.1:6379> GEODIST restaurants:CA "P.F. Chang's" "Outback Steakhouse" km
    "90.7557"
     	   
  6. По своей сути команда GEORADIUSBYMEMBER очень похожа на GEORADIUS; имеется небольшое отличие в том, что подлежащим измерению местоположения является сам участник собственно множества Geo. Например, при помощи GEORADIUSBYMEMBER мы можем выполнить поиск ресторанов в множестве Geo, чьё расстояние не превышает 100 км от "Outback Steakhouse", который также является участником данного набора Geo:

    
    127.0.0.1:6379> GEORADIUSBYMEMBER restaurants:CA "Outback Steakhouse" 100 km
    1) "Red Lobster"
    2) "Outback Steakhouse"
    3) "P.F. Chang's"
     	   

Как это работает...

При определении координат с помощью GEOADD они внутренне преобразуются в некий 52- битный GEOHASH, который является некоторой общеупотребимой системой кодирования в Geo. Вам следует принимать во внимание, что существует небольшое отличие между тем как хранит данные Geo и теми координатами, которые возвращаются GEOPOS, поэтому вы не должны ожидать, что эти два значения будут в точности одними и теми же.

В соответствующих командах GEORADIUS и GEORADIUSBYMEMBER вы можете применять параметр WITHDIST для получения значения расстояния. Следующий параметр ASC/DESC заставляет возвращаемые результаты выдаваться в порядке возрастания/ убывания. Кроме того, при помощи имеющегося параметра STORE/STOREDIST вы можете также сохранять результаты посредством GEORADIUS и GEORADIUSBYMEMBER в другом наборе Geo в Redis.

Также ознакомьтесь...

Рассматриваемый нами набо Geo на самом деле хранится как сортированное множество (в Redis zset) и все имеющиеся для сортированного множества команды применимы и для самого типа данных Geo. К примеру, чтобы удалить некий индекс из какого- то набора Geo может быть выполнено при помощи ZREM, а выборки всех имеющихся участников в наборе Geo можно осуществить через ZRANGE.

К вашему сведению, имеющаяся реализация GEOHASH основана на 52- битном целочисленном представлении, (что даёт точность менее одного метра). Когда вам требуется некая стандартная строка GEOHASH, вы можете вызвать GEOHASH для получения некоторого строкового значения с длиной 11.

С точки зрения производительности, GEORADIUS имеет временную сложность алгоритма O(N+log(M)), где N является общим числом элементов ограниченного блока заданной круговой области, ограничиваемой центром и радиусом в соответствии с документацией Redis. Поэтому, если вы нуждаетесь в максимальной производительности, вам следует иметь ввиду, что значение параметра радиуса в одном запросе следует устанавливать настолько малым, насколько это возможно для охвата как можно меньшего числа пунктов.

Дополнительно

Ключи управления

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

Подготовка...

Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте Загрузка и установка Redis в Главе 1, Приступая к Redis и подключиться к этому Серверу Redis при помощи redis-cli.

Чтобы ясно ознакомить вас с работой с ключами, мы для начала наполним Redis некими поддельными данными с использованием fake2db, применив следующие шаги:

  1. Установите fake2db и необходимый драйвер Redis Python:

    
    $ sudo pip install redis fake2db
    Flush all the data of the Redis server:
    $ bin/redis-cli flushall
     	   
  2. Наполните свой Сервер Redis некими тестовыми записями:

    
    $ fake2db --rows 10000 --db redis
    2017-09-17 16:44:39,393 gnuhpc Rows argument : 10000
    2017-09-17 16:44:46,808 gnuhpc simple_registration Commits are successful after write job!
    2017-09-17 16:45:10,151 gnuhpc detailed_registration Commits are successful after write job!
    2017-09-17 16:45:47,224 gnuhpc companies Commits are successful after write job!
    2017-09-17 16:45:47,919 gnuhpc user_agent Commits are successful after write job!
    2017-09-17 16:46:15,696 gnuhpc customer Commits are successful after write job!
     	   

Как это сделать...

Для того чтобы разобраться с управлением ключами выполните следующую последовательность шагов:

  1. Откройте Терминал и подключитесь к Redis при помощи redis-cli.

  2. Для определения того сколько ключей находится в Redis, мы выполним такую операцию:

    
    127.0.0.1:6379> DBSIZE
    (integer) 50000
     	   
  3. Если вы страстно желаете знать значения ключей в своём Сервере Redis, можно применять два вида API. Первым из них является KEYS:

    
    127.0.0.1:6379> KEYS *
        1) "detailed_registration:8001"
        2) "company:3859"
        3) "user_agent:4820"
        4) "detailed_registration:9330"
    ...
    50000) "company:2947"
    (9.30s)
     	   
  4. Другим является SCAN:

    
    127.0.0.1:6379> scan 0
    1) "20480"
    2) 1) "detailed_registration:8001"
       2) "company:3859"
       3) "company:3141"
       4) "detailed_registration:9657"
       5) "user_agent:2325"
       6) "company:1545"
       7) "company:2521"
       8) "detailed_registration:1253"
       9) "user_agent:1499"
      10) "user_agent:3827"
    127.0.0.1:6379> scan 20480
    1) "26624"
    2) 1) "detailed_registration:5263"
       2) "user_agent:2605"
       3) "detailed_registration:1316"
       4) "user_agent:1683"
       5) "customer:894"
       6) "simple_registration:6411"
       7) "company:3638"
       8) "detailed_registration:1665"
       9) "customer:9344"
      10) "company:7028"
      ....
     	   
  5. При некоторых обстоятельствах вам помет потребоваться удалять ключи из Redis при помощи соответствиующей команды DEL или UNLINK:

    
    127.0.0.1:6379> DEL "detailed_registration:1665" "simple_registration:6411" "user_agent:1683"
    (integer) 3
    127.0.0.1:6379> UNLINK "company:1664"
    (integer) 1
     	   
  6. Для сообщения о том,что некий ключ существует примените следующим образом команду EXISTS:

    
    127.0.0.1:6379> EXISTS "simple_registration:7681"
    (integer) 1
    127.0.0.1:6379> EXISTS "simple_registration:99999"
    (integer) 0
     	   
  7. Применение команды TYPE позволит вам определить тип данных некоторого ключа:

    
    127.0.0.1:6379> TYPE "company:3859"
    hash
     	   
  8. Для переименования ключа вы можете вызвать RENAME:

    
    127.0.0.1:6379> RENAME "customer:6591" "customer:6591:renamed"
    OK
     	   

Как это работает...

Управление ключами в Redis достаточно простое. Тем не менее, некоторые API могут стать настоящими убийцами производительности.

Для начала, вы можете столкнуться с тем, что если у вас в Redis имеется достаточно большое число ключей, вызов KEYS вызовет блокировку вашего Сервера Redis не то время, пока не будут возвращены все ключи (в нашем примере это заняло 6.8). Если вы уяснили такое основное концептуальное понимание в рецепте Общее представление о модели событий Redis Главы 1, Приступая к Redis, вы знаете, что в процессы исполнения в Redis одной команды, все прочие уже принятые команды ожидают своего исполнения. Таким образом, вызов команды KEYS является рискованным действием в отношении производительности при промышленном применении. Для решения данной проблемы мы рекомендуем применять, как уже упоминалось в предыдущих рецептах, соответствующие команды SCAN, такие как HSCAN или SSCAN, которые могут применяться для итераций значений ключей в вашем Сервере Redis без блокирования данного сервера.

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

Помимо всего прочего, на первый взгляд RENAME выглядит безобидно. Тем не менее, RENAME удалит имеющийся целевой ключ, если он уже имеется. Как уже упомянуто выше, DEL может вызывать большую задержку. Таким образом, лучшим практическим приёмом является отсоединение (unlink) целевого ключа в случае, когда он имеется, с последующим переименованием.

Также ознакомьтесь...

Для упорядочения и параллельной обработки (serialization и deserialization) могут применяться команды DUMP/ RESTORE. Вы можете применять эти две команды для создания частичных резервных копий Redis.

Дополнительно