Серия статей «Играем с 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].
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 Подробный сравнительный анализ ключевых команд с истекшим сроком действия
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 имеет множество ключевых команд и поддерживает различные функции: удаление, поиск, итерация, оценка, сортировка, перемещение и т. д.
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 может понять тип значения;
- Установите политику повторного использования ключей в соответствии с отладочной информацией;
- подкоманда refcount или idletime: возвращаемое число;
2.3 Подробный сравнительный анализ других команд Redis Key
- Подробный сравнительный анализ DEL, UNLINK, EXISTS, KEYS, DUMP:
- Подробный сравнительный анализ MIGRATE, MOVE, PERSIST, RENAME, RENAMENX:
- Подробный сравнительный анализ RESTORE, RANDOMKEY, TOUCH, TYPE, WAIT:
- Подробный сравнительный анализ ОБЪЕКТА и СОРТИРОВКИ:
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.
Удачи тебе!