Глава 2. Типы данных
Содержание
В этой главе мы рассмотрим следующие рецепты:
-
Применение строкового типа данных
-
Применение типа данных списков
-
Применение типа данных хэшей
-
Применение типа данных множества
-
Применение типа данных сортированного множества
-
Применение типа данных 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
.
Для понимания того как применять строковый тип данных, выполните следующую последовательность:
-
Откройте Терминал и подключитесь к Redis при помощи
redis-cli
. -
Для привязки строкового значения к некоторому ключу воспользуйтесь командой
SET
. В Кelp мы можем применять имеющееся у ресторана название в качестве ключа, а его адрес как устанавливаемое значение; например, если мы желаем установить значение адреса для ресторана"Extreme Pizza"
:127.0.0.1:6379> SET "Extreme Pizza" "300 Broadway, New York, NY" OK
-
Выборку имеющегося строкового значения можно сделать просто воспользовавшись командой
GET
:127.0.0.1:6379> GET "Extreme Pizza" "300 Broadway, New York, NY"
-
Исполнение
GET
с несуществующим ключом вернёт(nil)
:127.0.0.1:6379> GET "Yummy Pizza" (nil)
-
Соответствующая команда
STRLEN
возвращает значение длины данной строки; к примеру, если мы пожелаем узнать длину строки"Extreme Pizza"
:127.0.0.1:6379> STRLEN "Extreme Pizza" (integer) 26
-
Исполнение
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
если данный ключ
N
ot E
xist), которая может быть применена для
установки соответствующего значения ключа только в том случае, если он не определён, причём в атомарной операции.
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
может ещё много чего делать помимо инспекции кодировки, так как она также позволяет нам инспектировать в объектах Redisrefcount
иidletime
, (https://redis.io/commands/object). -
Из- за ограничения в размере, у нас нет возможности продемонстрировать все команды для типа строковых данных в данном рецепте. Для знакомства со всеми строковыми командами отсылаем вас к https://redis.io/commands#string.
-
Относительно управления ключами, в том числе перечисление, переименование и удаление ключей, обратитесь к разделу Ключи управления в данной главе.
Тип данных списков является очень полезным типом при разработке приложений, так как некий перечень сохраняет последовательность объектов и запросто может применяться в качестве стека или очереди. В Redis конкретное значение, связанное с неким ключом, может выступать в качестве списка строк. Перечень в Redis больше походит на двусвязный список в конкретном мире структур данных. Данный рецепт демонстрирует все основные команды манипуляции списками в Redis.
Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте
Загрузка и установка Redis в
Главе 1, Приступая к Redis
и подключиться к этому Серверу Redis при помощи redis-cli
.
Выполните приводимую ниже последовательность шагов, чтобы ознакомиться с тем, как применять тип данных списка:
-
Откройте Терминал и подключитесь к Redis с помощью
redis-cli
. -
Сейчас мы собираемся применять некий список для хранения любимых ресторанов. Для вставки двух названий ресторанов в левый конец некоторого перечня воспользуйтесь
LPUSH
:127.0.0.1:6379> LPUSH favorite_restaurants "PF Chang's" "Olive Garden" (integer) 2
-
Дл получения всех названий ресторанов из данного перечня примените
LRANGE
:127.0.0.1:6379> LRANGE favorite_restaurants 0 -1 1) "Olive Garden" 2) "PF Chang's"
-
Для всавки некоторого названия ресторана в правый конец списка воспользуйтесь
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"
-
Для вставки нового названия ресторана после
"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"
-
Для выборки определённого названия ресторана по позиции индекса 3 в данном перечне воспользуйтесь
LINDEX
:127.0.0.1:6379> LINDEX favorite_restaurants 3 "Outback Steakhouse"
Как уже упоминалось ранее, некий перечень в Redis аналогичен двойному связанному списку, поэтому такие новые элементы могут добавляться в некий перечень с применением трёх следующих команд:
-
LPUSH
: Вставляет новые элементы в начало, с левого конца данного перечня -
RPUSH
: Добавляет элементы в конец, с правой стороны определённого перечня -
LINSERT
: Вставляет элементы до или после опорного элемента в заданном списке
LPUSH
, RPUSH
и
LINSERT
возвращают значение длины обрабатываемого списка после вставки. Нет необходимости
инициализировать некий пустой перечень для какого- то ключа перед помещением элементов. Если мы помещаем элементы в заданный перечень
для несуществующего ключа, Redis создаст вначале некий пустой список и свяжет его с данным значением ключа. Аналогично, нам нет нужды
удалять ключи, у которых связанные с ними списки пустые, так как Redis выполняет очистку сам за нас.
Совет | |
---|---|
Если вы желаете помещать элементы в некий перечень только если данный список уже имеется, вы можете применять
команды |
Для удаления некоторого элемента из какого- то списка мы можем применять 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
.
Для понимания того, как использовать тип данных хэша, выполните следующую последовательность шагов:
-
Откройте Терминал и подключитесь к Redis при помощи
redis-cli
. -
Теперь давайте установим соответствующие информационные свойства для определённого ресторана
"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
-
Для выборки значений из хэша воспользуйтесь командой
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"
-
Для выборки определённого значения некоторого отдельного ключа примените
HGET
:127.0.0.1:6379> HGET "Kyoto Ramen" "rating" "5.0"
-
Для проверки того, что соответствующие поля и значения присутствуют в каком- то хэше применяйте
HEXISTS
:127.0.0.1:6379> HEXISTS "Kyoto Ramen" "phone" (integer) 1 127.0.0.1:6379> HEXISTS "Kyoto Ramen" "hours" (integer) 0
-
Для получения всех полей и значений в каком- то хэше может применяться команда
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
для больших хэшей; основные причины этого мы поясним позднее. -
Аналогично, имеется команда
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"
-
Для удаления полей из некотрого хэша воспользуйтесь соответствующей командой
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
для данной конфигурации.
-
Относительно команд
SCAN
отсылаем вас к https://redis.io/commands/scan.
Тип данных множества является собранием уникальных и неупорядоченных объектов. Они часто применяются в приложениях для проверки участия, удаления дублирований, а также операций установки соответствия (объединения, пересечения и вычитания). Значениями объектов Redis могут быть наборы строк. В данном рецепте мы будем сохранять в наборе Redis теги ресторанов и демонстрировать основные команды для манипуляции неким множеством.
Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте
Загрузка и установка Redis в
Главе 1, Приступая к Redis
и подключиться к этому Серверу Redis при помощи redis-cli
.
Для того чтобы разобраться с тем как применять тип данных множества, выполните следующие шаги:
-
Откройте Терминал и соединитесь с Redis при помощи
redis-cli
. -
Добавьте тег для ресторана
"Original Buffalo Wings"
, воспользовавшись следующей командойSADD
:127.0.0.1:6379> SADD "Original Buffalo Wings" "affordable" "spicy" "busy" "great taste"(integer) 4
-
Для проверки того, является ли некий элемент участником определённого множества, примените
SISMEMBER
:127.0.0.1:6379> SISMEMBER "Original Buffalo Wings" "busy"(integer) 1127.0.0.1:6379> SISMEMBER "Original Buffalo Wings" "costly"(integer) 0
-
Чтобы применить
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
-
Воспользуйтесь командой
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
.
Для понимания того как применять тип данных сортированного множества выполните следующую последовательность шагов:
-
Откройте Терминал и подключитесь к Redis при помощи
redis-cli
. -
Для осуществления ранжирования для всех локальных ресторанов в Relp, воспользуйтесь следующим:
-
Самый первый шаг, который мы предпримем, состоит в помещении рейтинга голосования и самого названия каждого ресторана в некое сортированное множество. Здесь мы применим команду
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
-
А затем вы можете выполнять выборку этого ранжирования при помощи команды
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"
-
Если один из пользователь Relp поднимает рейтинг некоторого ресторана в Relp, вы можете применить команду
ZINCRBY
для повышения соответствующего уровня данного ресторана в данном ранжировании:127.0.0.1:6379> ZINCRBY ranking:restaurants 1 "Red Lobster" "46"
-
Если некий пользователь пожелает просмотреть установленные ранги и установленное число голосов для некоторого определённого ресторана, имеющиеся команды
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"
-
В случае, когда имеется ещё один более надёжный рейтинг ресторанов из иного источника и требуется комбинация этих двух ранжирований, может применяться команда
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.
Подсчёт отдельных значений является общей задачей в различных сценариях ежедневной обработки данных. В Redis, в то время как чудесно, а иногда и просто необходимо реализовать отличный подсчёт с использованием множества, следует учитывать потребление памяти и снижение производительности в том случае, когда размер набора увеличивается до десятков миллионов. Если вам не нужно извлекать содержимое набора данных, а просто нужно уникальное значение подсчёта, единственная вещь, которую вы можете сделать, это для оптимизации проблем с памятью и производительностью, вызванных таким набором, применять в Redis тип данных HyperLogLog (HLL). В данном рецепте мы расскажем, как использовать HLL в Redis.
Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте
Загрузка и установка Redis в
Главе 1, Приступая к Redis
и подключиться к этому Серверу Redis при помощи redis-cli
.
Для того чтобы разобраться с тем как применять тип данных HyperLogLog, воспользуйтесь следующей последовательностью шагов:
-
Откройте Терминал и подключитесь к Redis при помощи
redis-cli
. -
Для подсчёта различных посетителей ресторана с названием
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
-
Далее, чтобы выполнить выборку того сколько различных пользователей посетило данный ресторан, примените такую команду
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.
-
Для более подробного знакомства с алгоритмами HLL отсылаем вас к следующей статье: Flajolet P, Fusy É, Gandouet O, et al. Hyperloglog: The analysis of a near-optimal cardinality estimation algorithm [C] //AofA: Analysis of Algorithms. Discrete Mathematics and Theoretical Computer Science, 2007: 137-156
Всё большую популярность приобретают службы на основе местоположения по мере того, как смартфоны становятся всё более распространёнными. Для поддержки хранения и запросов географических координат в таких связанных с местоположением сценариях, начиная с выпуска 3.2 в Redis официально был предложен API Geo. В данном рецепте мы исследуем тип данных Geo в Redis.
Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте
Загрузка и установка Redis в
Главе 1, Приступая к Redis
и подключиться к этому Серверу Redis при помощи redis-cli
.
Чтобы разобраться с тем как применять тип данных Geo выполните следующую последовательность действий:
-
Откройте Терминал и подключитесь к Redis при помощи
redis-cli
. -
Для целей нашего демонстрационного приложения 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
-
Теперь, вызвав
GEOPOS
мы получаем координаты для заданного участника набора Geo:127.0.0.1:6379> GEOPOS restaurants:CA "Red Lobster" 1) 1) "-119.1524389386177063" 2) "34.26455707283378871"
-
Допустим, вы пребываете в парке штата Гора дьявола, значения долготы/ широты которого составляют
-121.923170/37.878506
и вы желаете знать какие рестораны находятся в радиусе5
километров от вашего текущего местоположения:127.0.0.1:6379> GEORADIUS restaurants:CA -121.923170 37.878506 5 km 1) "Olive Garden"
-
Иногда вам нужно определить расстояние между двумя ресторанами; для этого вы вызываете API с названием
GEODIST
:127.0.0.1:6379> GEODIST restaurants:CA "P.F. Chang's" "Outback Steakhouse" km "90.7557"
-
По своей сути команда
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. Поэтому, если вы нуждаетесь в максимальной производительности, вам следует иметь ввиду, что значение параметра радиуса в одном
запросе следует устанавливать настолько малым, насколько это возможно для охвата как можно меньшего числа пунктов.
-
Для знакомства с вариантами применения и архитектурой кодировок
GEOHASH
отсылаем вас к https://en.wikipedia.org/wiki/Geohash. -
С полным руководством команд можно ознакомиться на https://redis.io/commands#geo.
До сих пор в данной главе мы обсуждали все имеющиеся в Redis типы данных. Говоря в целом, данные в Redis составляются из пар ключ- значение. Таким образом, управление ключами является другим существенным знанием при разработке приложений и администрировании в Redis. В данном рецепте мы обсудим управление ключами.
Вам требуется завершить установку вашего Сервера Redis, как это описывалось в рецепте
Загрузка и установка Redis в
Главе 1, Приступая к Redis
и подключиться к этому Серверу Redis при помощи redis-cli
.
Чтобы ясно ознакомить вас с работой с ключами, мы для начала наполним Redis некими поддельными данными с использованием
fake2db
, применив следующие шаги:
-
Установите
fake2db
и необходимый драйвер Redis Python:$ sudo pip install redis fake2db Flush all the data of the Redis server: $ bin/redis-cli flushall
-
Наполните свой Сервер 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!
Для того чтобы разобраться с управлением ключами выполните следующую последовательность шагов:
-
Откройте Терминал и подключитесь к Redis при помощи
redis-cli
. -
Для определения того сколько ключей находится в Redis, мы выполним такую операцию:
127.0.0.1:6379> DBSIZE (integer) 50000
-
Если вы страстно желаете знать значения ключей в своём Сервере 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)
-
Другим является
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" ....
-
При некоторых обстоятельствах вам помет потребоваться удалять ключи из 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
-
Для сообщения о том,что некий ключ существует примените следующим образом команду
EXISTS
:127.0.0.1:6379> EXISTS "simple_registration:7681" (integer) 1 127.0.0.1:6379> EXISTS "simple_registration:99999" (integer) 0
-
Применение команды
TYPE
позволит вам определить тип данных некоторого ключа:127.0.0.1:6379> TYPE "company:3859" hash
-
Для переименования ключа вы можете вызвать
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.
-
С полным руководством команд можно ознакомиться на https://redis.io/commands#generi.