Игра с командами Redis-Key, которые должны знать продвинутые программисты

Redis

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

  • [Команда истечения срока действия ключа]: EXPIRE, PEXPIRE, EXPIREAT, PEXPIREAT, TTL, PTTL;
  • [Другие ключевые команды]: DEL, EXISTS, KEYS, DUMP, MIGRATE, MOVE, PERSIST, RANDOMKEY, RENAME, RENAMENX, RESTORE, TOUCH, TYPE, UNLINK, WAIT, OBJECT, SORT;

Оригинальную карту разума последней карты разума можно получить, оставив сообщение в публичном аккаунте [zxiaofan].

Redis-最新思维导图原图

1. Команда истечения срока действия ключа

1.1. Краткое описание команды истечения срока действия ключа

  • Установите время истечения периода времени (EXPIRE, PEXPIRE);
  • Установите время истечения в указанный момент времени (EXPIREAT, PEXPIREAT);
  • Срок действия запроса (TTL, PTTL);
Заказ Функции параметр
EXPIRE Установите срок действия ключа key seconds
PEXPIRE Установить срок действия ключа (миллисекунды) key milliseconds
EXPIREAT Установите срок действия ключа на отметку времени Unix (с 1970-01-01) key timestamp
PEXPIREAT Установите срок действия ключа в миллисекундную временную метку Unix (с 1970-01-01) key milliseconds-timestamp
TTL Запросить оставшееся время жизни указанного ключа key
PTTL Запросить оставшееся время жизни указанного ключа (миллисекунды) key

1.2, Внимание, срок действия ключа истек

  • После версии Redis >= 2.6.0 время истечения срока действия поддерживает миллисекунды;
  • Время истечения поддерживает установку срока действия через определенный период времени, а также поддерживает установку срока действия в указанный момент времени;
  • Срок действия связан с компьютерными часами.Если часы изменены на будущее время, ключ истечет немедленно;
  • После переименования ключа срок действия нового ключа совпадает со сроком действия старого ключа;
  • Когда версия
  • Временная сложность приведенных выше 6 команд составляет O (1);
  • 【ТТЛ, ПТТЛ】
    • Версия Redis
    • Версия Redis >=Redis 2.8: если ключ не существует, вернуть -2, если он существует и срок действия не установлен, вернуть -1;

1.3 Подробный сравнительный анализ ключевых команд с истекшим сроком действия

Key过期命令详细对比分析


1.4 Пример команды истечения срока действия ключа

127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> expire dyh 5
(integer) 1
127.0.0.1:6378> ttl dyh
(integer) 0
127.0.0.1:6378> expire dyh 5
(integer) 0
127.0.0.1:6378> ttl dyh
(integer) -2
127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> expire dyh 50
(integer) 1
127.0.0.1:6378> ttl dyh
(integer) 47
127.0.0.1:6378> ttl dyh
(integer) 44
127.0.0.1:6378> pexpire dyh 3000
(integer) 1
127.0.0.1:6378> pttl dyh
(integer) -2
127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> pexpire dyh 30000
(integer) 1
127.0.0.1:6378> pttl dyh
(integer) 26575
127.0.0.1:6378> pttl dyh
(integer) 25039
127.0.0.1:6378> pexpireat dyh 1572536378000
(integer) 0
127.0.0.1:6378> pttl dyh
(integer) -2
127.0.0.1:6378> set dyh @zxiaofan
OK
127.0.0.1:6378> pexpireat dyh 1572536378000
(integer) 1
127.0.0.1:6378> ttl dyh
(integer) 86359
127.0.0.1:6378> ttl dyh
(integer) 86357

2. Другие ключевые команды Redis

2.1 Краткое описание других команд Redis Key

Redis имеет множество ключевых команд и поддерживает различные функции: удаление, поиск, итерация, оценка, сортировка, перемещение и т. д.

Заказ
|Функция |Параметры ---|---|--- DEL | удалить указанный ключ | ключ [ключ...] EXISTS | Определить, существует ли указанный ключ | ключ [ключ ...] KEYS | Найти ключ указанного Pattern | Pattern DUMP | Возвращает сериализованное значение указанного ключа | ключ MIGRATE | Атомарная миграция указанного ключа в указанную БД указанного экземпляра | Ключ порта хоста \| "" Тайм-аут приема-бд [КОПИЯ] [ЗАМЕНА] [Ключ KEYS [ключ ...]] MOVE | Переместить ключ в указанную БД | БД ключей PERSIST | Время ожидания удаления ключа | ключ RANDOMKEY | возвращает случайный ключ | без аргументов RENAME | ключ переименования | ключ newkey RENAMENX | переименовать ключ, если новый ключ не существует | ключ новый ключ ВОССТАНОВИТЬ | Десериализовать данные и сохранить в указанный ключ | Серийное значение ttl ключа [ЗАМЕНИТЬ] [ABSTTL] [IDLETIME секунд] [ЧАСТОТА FREQ] СОРТИРОВАТЬ | Возвращает отсортированные данные списка, набора, отсортированного списка | ключ [Шаблон BY] [ОГРАНИЧЕНИЕ счетчика смещения] [Шаблон GET [Шаблон GET ...]] [ASC|DESC] [ALPHA] [Цель STORE] TOUCH | (пакетно) изменить время последнего доступа к ключу | key [key...] TYPE | тип ключа запроса | ключ UNLINK | удалить ключи из пространства ключей, а затем асинхронно удалить значение | ключ [ключ ...] WAIT | Блокировать клиент до тех пор, пока тайм-аут или предыдущие команды записи не будут синхронизированы с указанным количеством реплик | тайм-аут numreplicas (миллисекунды) ОБЪЕКТ | Отладить значение, соответствующее ключу, часто используемому для оптимизации | подкоманда [аргументы [аргументы...]]

2.2. Примечание о других командах Redis Key

  • [EXISTS] Определить, существует ли указанный ключ

    • Возвращает 1, если ключ существует, возвращает 0, если он не существует;
    • Если имеется более одного ключа параметра, вернуть количество существующих ключей;
    • 3.0.3 поддерживает несколько параметров;
  • [KEYS] Найти тональность указанного паттерна

    • Командная функция мощная, но производительность низкая, вместо нее рекомендуется использовать SCAN;
    • Для сканирования 1 миллиона ключей требуется 40 мс, а производительность в больших базах данных очень низкая;
    • Используется только для отладки или специальных операций, таких как изменение пространства ключей;
    • подстановочный знак шаблона:
      • ?: любой символ; *: любое количество символов
      • [ae]: соответствует a или e; [^e]: соответствует не-e
      • [a-b]: соответствует символам между (включительно) a-b
      • \ : экранирование символа
  • [DUMP] Возвращает сериализованное значение указанного ключа

    • Сериализованное значение не имеет срока действия;
    • Сериализованный результат содержит 64-битную контрольную сумму для проверки на наличие ошибок;
    • Формат кодирования соответствует формату, используемому RDB;
    • Сериализованное значение содержит информацию о версии RDB, и версия Redis с несовместимым форматом RDB откажется обрабатывать сериализованное значение (отклонит операцию десериализации);
  • [MIGRATE] Атомарная миграция указанного ключа в указанную БД указанного экземпляра

    • Принцип: Исходная БД выполняет DUMP+DEL, целевая БД выполняет RESTORE. DUMP исходной БД "ВОССТАНОВЛЕНИЕ целевой БД" целевая БД возвращает "ОК", затем исходная БД DEL;
    • 2 экземпляра будут заблокированы во время миграции до успешного завершения или тайм-аута (миллисекунды), исключения;
    • Миграция нескольких ключей: ключевой параметр — «», а ключи указывают несколько ключей;
    • Тайм-аут (миллисекунды) относится не ко времени завершения, а ко времени передачи данных;
    • ИОЭРР:
      • MIGRATE необходимо завершить операцию ввода-вывода в указанное время и вернуть IOERR, если операция ввода-вывода ненормальна или истекло время ожидания;
      • Возможны 2 сценария: 1. Ключ существует в 2 экземплярах 2. Ключ существует только в исходном экземпляре;
      • Потеря ключа невозможна;
      • Если тайм-аут обнаружен, он должен проверить, существует ли ключ в целевом экземпляре;
    • Если возвращается исключение (начиная с ERR), MIGRATE гарантирует, что ключ существует только в исходном экземпляре (если только в целевом экземпляре нет ключа с таким же именем);
    • AUTH нельзя ставить после параметра KEYS;
  • 【MOVE】Кнопка перемещения для указания БД

    • Ключ не существует в текущей БД ==> не перемещать;
    • В целевой БД уже есть ключ ==" Не перемещать;
  • 【RENAME】Кнопка переименования

    • ключ не существует: ошибка (нет такого ключа);
    • Принцип: сначала удалите ключ, а затем добавьте новый;
    • Если исходный ключ большой, это вызовет большую задержку;
    • Обратите внимание, чтобы сравнить и узнать с [RENAMENX];
  • [ВОССТАНОВЛЕНИЕ] Десериализовать данные и сохранить их по указанному ключу

    • Сериализованные значения доступны через DUMP;
    • Если ttl равно 0, это означает, что время ожидания не устанавливается, в противном случае устанавливается время ожидания (в миллисекундах);
    • Redis"=5..0: поддержка модификатора ABSTTL, ttl представляет временную метку Unix (миллисекунды);
    • IDLETIME секунд: установите время простоя десериализованного значения.Время простоя можно запросить с помощью ключа Object idletime;
    • Частота FREQ: установите FREQ десериализованного значения, FREQ можно запросить с помощью клавиши Object freq;
    • ключ уже существует: return (ошибка) BUSYKEY Имя целевого ключа уже существует [или используйте модификатор REPLACE];
    • RESTORE проверит информацию о версии RDB и контрольную сумму данных, если совпадений нет, будет возвращено исключение;
    • ВОССТАНОВЛЕНИЕ временной сложности: O(1)+O(N*M)
      • O(1): создать новый ключ;
      • N: количество элементов структуры данных, составляющих значение;
      • M: средний размер элементов, составляющих структуру данных значения;
      • значение представляет собой небольшую строку: O(1)+O(1*M), а M мало, поэтому оно приблизительно рассматривается как O(1);
      • значение отсортировано: сложность O(NMlog(N)), потому что вставка данных в отсортированные наборы — это O(log(N));
  • [СОРТИРОВАТЬ] Возвращает отсортированные данные списка, набора, отсортированного списка

    • По умолчанию значения сортируются от меньшего к большему и сравниваются по числам с плавающей запятой двойной точности;
    • Обратный порядок: DESC;
    • Алфавитная сортировка: АЛЬФА, будет ненормально, если этот модификатор не используется;
    • После правильной установки переменной окружения !LC_COLLATE можно использовать модификатор lIMIT;
    • Сортировка по внешнему ключу: SORT user_id BY user_level_* DESC GET user_name_*;
      • * на самом деле является заполнителем значения в user_id (список);
      • Если соответствующий ключ by не существует, он не будет отсортирован;
      • GET возвращает значение, соответствующее отсортированному результату;
        • # вернет сам элемент списка;
    • STORE resultkey: сохранить результат сортировки по указанному ключу;
  • 【TYPE】Тип ключа запроса

    • Тип возвращаемого значения: строка, список, набор, zset, хеш и поток;
  • [UNLINK] Удалить ключи из пространства ключей, а затем асинхронно удалить значение

    • Аналог ДЕЛ. Клавиша удаления: DEL, UNLINK — синхронные, значение удаления: DEL — синхронный, UNLINK — асинхронный;
    • Часто используется для удаления больших ключей (до 4.0.0 можно было использовать Pipeline для пакетного удаления значений);
  • [WAIT] Блокировать клиент до тех пор, пока не истечет время ожидания или предыдущая команда записи не будет синхронизирована с указанным количеством реплик.

    • Когда команда WAIT возвращается, все предыдущие команды записи текущего соединения должны быть получены указанным количеством реплик;
    • Если команда WAIT является частью мультитранзакции, WAIT не будет блокировать, а вернет количество реплик, указанное параметром, как можно скорее;
    • Таймаут 0 означает постоянную блокировку;
    • Независимо от успеха или неудачи, WAIT вернет количество обработанных копий, и клиент должен проверить, больше ли возвращенный результат ожидаемого значения или равен ему;
    • 【последовательность】
      • WAIT не гарантирует строгой согласованности;
      • При отработке отказа Sentinel или Redis Cluster можно повысить безопасность данных;
    • [детали реализации]
      • На основе функции PSYNC (синхронизация Redis master-slave) реплика будет содержать обработанное смещение, которое можно применять к различным сценариям:
      • 1. Обнаружение тайм-аута реплики 2. Повторная синхронизация после отключения 3. Реализовать WAIT;
      • В сценарии WAIT: когда клиент выполняет команду записи, Redis записывает смещение реплики. Когда выполняется WAIT, Redis определяет, завершила ли реплика операцию или выполнила операцию обновления;
  • [ОБЪЕКТ] Отладка значения, соответствующего ключу, который часто используется для оптимизации

    • подкоманда refcount или idletime: возвращаемое число;
      • Возвращает количество ссылок на значение, соответствующее указанному ключу;
      • Сценарий: Целочисленный общий пул объектов экономит память;
    • подкоманда кодирования: вернуть базовую структуру значения;
      • Возвращает базовую структуру значения, соответствующего ключу;
    • IDLETIME
      • Возвращает время (в секундах), в течение которого ключ был бездействующим (незаписанным и непрочитанным);
      • Доступно, когда стратегия памяти Redis — LRU или noeviction;
    • FREQ
      • Возвращает логарифмический счетчик частоты обращения к ключу;
      • В сочетании с SCAN для получения горячей клавиши;
    • ключ не существует: вернуть nil;
    • OBJECT может понять тип значения;
    • Установите политику повторного использования ключей в соответствии с отладочной информацией;

2.3 Подробный сравнительный анализ других команд Redis Key

  • Подробный сравнительный анализ DEL, UNLINK, EXISTS, KEYS, DUMP:

Redis其他Key命令详细对比分析1

  • Подробный сравнительный анализ MIGRATE, MOVE, PERSIST, RENAME, RENAMENX:

Redis其他Key命令详细对比分析2

  • Подробный сравнительный анализ RESTORE, RANDOMKEY, TOUCH, TYPE, WAIT:

Redis其他Key命令详细对比分析3

  • Подробный сравнительный анализ ОБЪЕКТА и СОРТИРОВКИ:

Redis其他Key命令详细对比分析4


2.4 Примеры других команд Redis Key

2.4.1, отвязать, удалить, существует, пример ключей

127.0.0.1:6378> set key1 dyh
OK
127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> unlink key1
(integer) 1
127.0.0.1:6378> del key2
(integer) 1
127.0.0.1:6378> exists key1 key2
(integer) 0
127.0.0.1:6378> keys key*
1) "key3"
2) "keylist"
3) "key4"
4) "key"
127.0.0.1:6378> keys key?
1) "key3"
2) "key4"
127.0.0.1:6378> keys key[35]
1) "key3"
127.0.0.1:6378> keys key[^3]
1) "key4"

2.4.2, пример дампа

127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> get key2
"@zxiaofan"
127.0.0.1:6378> dump key2
"\x00\t@zxiaofan\t\x00\xe8\xd2c%\x02\xc7]="

2.4.3, пример перемещения

127.0.0.1:6378> set key1 hi
OK
127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> select 1
OK
127.0.0.1:6378[1]> del key1
(integer) 0
127.0.0.1:6378[1]> set key2 @zxiaofan-db1
OK
127.0.0.1:6378[1]> select 0
OK
127.0.0.1:6378> move key1 1
(integer) 1
127.0.0.1:6378> move key2 1
(integer) 0
127.0.0.1:6378> get key1
(nil)
127.0.0.1:6378> get key2
"@zxiaofan"
127.0.0.1:6378> select 1
OK
127.0.0.1:6378[1]> get key2
"@zxiaofan-db1"

2.4.4, переименовать, пример переименования

127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> rename key2 key2019
OK
127.0.0.1:6378> rename key2 key2019
(error) ERR no such key
127.0.0.1:6378> set key1 hi
OK
127.0.0.1:6378> rename key2019 key1
OK
127.0.0.1:6378> get key1
"@zxiaofan"
127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> renamenx key2019 key1
(error) ERR no such key
127.0.0.1:6378> renamenx key2 key1
(integer) 0
127.0.0.1:6378> rename key2 key1
OK

2.4.5, пример типа

127.0.0.1:6378> set key2 @zxiaofan
OK
127.0.0.1:6378> type key2
string
127.0.0.1:6378> set key1 1
OK
127.0.0.1:6378> type key1
string
127.0.0.1:6378> lpush listkey csdn github zxiaofan.com
(integer) 6
127.0.0.1:6378> type listkey
list
127.0.0.1:6378> hmset hashkey name zxiaofan blog csdn
OK
127.0.0.1:6378> type hashkey
hash

2.4.5, пример RANDOMKEY

127.0.0.1:6378> RANDOMKEY
"list3"
127.0.0.1:6378> RANDOMKEY
"num4"
127.0.0.1:6378> RANDOMKEY
"dyh"
127.0.0.1:6378> mget list3 num4 dyh
1) (nil)
2) "200"
3) "@zxiaofan"
127.0.0.1:6378> 

3. Резюме

Что вы знаете о команде Redis Key? Если не знаете, быстро прокрутите вверх.

  • Какие типы срока действия поддерживаются?
  • Как запросить время истечения указанного ключа;
  • Как убрать срок действия указанного ключа;
  • Как определить, существует ли какой-либо ключ в Redis, и какое возвращаемое значение, если он существует;
  • Какие подстановочные знаки поддерживаются мощной командой KEYS;
  • Можно ли переименовать ключ, на что обратить внимание при переименовании?
  • Какие типы данных поддерживаются сортировкой SORT и каковы правила сортировки по умолчанию для каждого типа данных;
  • В чем разница между UNLINK и DEL;
  • Какие подкоманды есть у команды ОБЪЕКТ и как их применять для отладки и анализа;

Это конец команд Redis, связанных с ключом? Предстоит долгий путь...

  • Команды серии SCAN (SCAN/SSCAN/HSCAN/ZSCAN), как обрабатывать массивные данные Redis с высокой производительностью;
  • Как сортировать в реальном бою SORT;
  • Как Object используется для анализа производительности в реальном бою.

Пожалуйста, обратите внимание на серию статей Fun with Redis.


Удачи тебе!

Вся жизнь состоит из выбора!
В будущем вы обязательно будете благодарны себе за то, что усердно трудитесь сейчас!
CSDN】【GitHub】【OSCHINA】【Наггетс】【Публичный аккаунт WeChat