Этот блог является пятой статьей в серии Redis, в основном объясняющей стратегию удаления ключа истечения срока действия Redis.
Первые 4 статьи из этой серии можно просмотреть, перейдя по следующим ссылкам:
Серия Redis (1): Введение в Redis и установку среды
Серия Redis (2): 5 структур данных Redis и их общие команды
Серия Redis (3): механизм сохранения Redis (RDB, AOF)
Серия Redis (4): механизм репликации Redis (репликация master-slave)
Фокус: стратегию удаления ключа с истечением срока действия Redis также часто спрашивают в интервью. Недавно я брал интервью, и мне задавали этот вопрос несколько раз.
Для серверов Redis очень ценны ресурсы памяти, если не удалить некоторые ключи с истекшим сроком действия, ресурсы будут потрачены впустую.
Итак, нам нужно рассмотреть вопрос: если срок действия ключа истекает, когда он будет удален?
1. Общие стратегии удаления
Существует три общих стратегии удаления:
-
Регулярно удалять
При установке времени истечения срока действия ключа создайте таймер и позвольте таймеру выполнить операцию удаления ключа немедленно, когда наступит время истечения срока действия ключа.
-
ленивое удаление
Оставьте просроченный ключ в покое. Каждый раз, когда вы получаете ключ из пространства ключей, проверяйте, не просрочен ли ключ. Если срок его действия истек, удалите ключ. Если нет, верните ключ.
-
регулярно удалять
Время от времени программа проверяет базу и удаляет в ней просроченные ключи, а какие просроченные ключи каких баз удалять, определяется алгоритмом.
Среди них регулярное удаление и периодическое удаление являются стратегиями активного удаления, а ленивое удаление — стратегией пассивного удаления.
Далее мы объясним их один за другим.
1.1 Стратегия запланированного удаления
Стратегия удаления по времени Используя таймер, стратегия удаления по времени может гарантировать максимально быстрое удаление ключей с истекшим сроком действия и освобождение памяти, занимаемой ключами с истекшим сроком действия.
Таким образом, преимущества и недостатки стратегии удаления по времени следующие:
- Плюсы: очень удобный для памяти
- Минусы: Очень недружелюбен к процессорному времени
Например, если есть большое количество командных запросов, ожидающих обработки сервером, и серверу в настоящее время не хватает памяти, время отклика и пропускная способность сервера пострадают, если сервер тратит много времени ЦП на удаление просроченные ключи.
То есть, если сервер создаст большое количество таймеров, производительность сервера по обработке командных запросов снизится,
Поэтому Redis в настоящее время не использует стратегию удаления по расписанию.
1.2 Стратегия ленивого удаления
Стратегия ленивого удаления будет выполнять проверку срока действия ключей только после их получения и не будет тратить слишком много времени ЦП на удаление других ненужных ключей с истекшим сроком действия.
Таким образом, преимущества и недостатки стратегии ленивого удаления заключаются в следующем:
- Плюсы: очень дружелюбен к процессорному времени
- Недостаток: очень недружественный к памяти
Например, если в базе данных много ключей с истекшим сроком действия, и к этим ключам с истекшим сроком действия никогда не обращались, эти ключи с истекшим сроком действия всегда будут занимать ценные ресурсы памяти, что приводит к пустой трате ресурсов.
1.3 Периодически удалять политики
Стратегия периодического удаления представляет собой интегрированный компромисс между стратегией периодического удаления и стратегией отложенного удаления.
Стратегия периодического удаления выполняет удаление ключей с истекшим сроком действия через регулярные промежутки времени и снижает влияние операций удаления на время ЦП, ограничивая продолжительность и частоту операций удаления, что приводит к потере памяти.
2. Стратегия удаления просроченного ключа, используемая Redis
Сервер Redis использует стратегию отложенного удаления и стратегию периодического удаления.
2.1 Реализация стратегии ленивого удаления
Стратегия ленивого удаления ключей с истекшим сроком действия определяется следующим образом:expireIfNeeded
Реализация функции, все команды Redis, которые читают и записывают базу данных, будут вызываться перед выполнениемexpireIfNeeded
Функция проверяет ключ ввода:
- Если срок действия ключа ввода истек, удалите ключ ввода из базы данных.
- Если срок действия ключа ввода не истек, ничего не делать
Приведенное выше описание можно представить с помощью следующей блок-схемы:
2.2 Реализация политики периодического удаления
Политика периодического удаления ключей с истекшим сроком действия определяетсяactiveExpireCycle
Реализация функции при периодической работе сервера RedisserverCron
Когда функция выполняется,activeExpireCycle
Функция будет вызвана, она будет проходить каждую базу данных на сервере несколько раз в течение указанного времени, из базы данныхexpires
в словаревыборочная проверкаСрок действия некоторых ключей и удаление ключей с истекшим сроком действия.
activeExpireCycle
Общий поток функции:
При каждом запуске функция случайным образом выбирает определенное количество ключей из определенного количества баз для проверки и удаляет просроченные ключи, например, проверка начинается с базы № 0. При следующем запуске функция может быть из базы данных № 1. Начинайте проверку до тех пор, пока не будет проверена база данных № 15, а затем снова начните проверку из базы данных № 0, чтобы убедиться, что проверяется каждая база данных.
Фокус:
- Что касается общего процесса периодического удаления, меня спросили в недавнем интервью, и я ответил на него в соответствии с приведенным выше описанием.
- Некоторые интервьюеры могут также спросить, какие ключи удаляются каждый раз случайным образом? Можно упомянуть алгоритм LRU (Least Недавно Используемый наименее недавно), в общем, подробно расспрашивать не буду, но заинтересованные студенты могут его подробно изучить.
3. Обработка RDB ключей с истекшим сроком действия
3.1 Создание RDB-файла
в исполненииSAVE
команда илиBGSAVE
Когда команда создает новый файл RDB, программа проверяет ключи в базе данных,Ключи с истекшим сроком действия не сохраняются во вновь созданных файлах RDB..
Например, если в базе данных содержится 3 ключа k1, k2, k3, а срок действия k2 истек, то при создании нового RDB-файла программа сохранит в RDB-файл только k1 и k3, а k2 будет проигнорирован.
3.2 Загрузить файл RDB
При запуске сервера Redis, если на сервере включена только сохраняемость RDB, сервер загрузит файл RDB:
-
Если сервер запускается сглавный серверРежим работы, при загрузке файла RDB программа будет проверять ключи, сохраненные в файле, ключи с неистекшим сроком действия будут загружены в базу данных, а ключи с истекшим сроком действия будут проигнорированы.
-
Если сервер запускается сподчиненный серверРежим работы, при загрузке RDB-файла все ключи, сохраненные в файле, вне зависимости от того, просрочены они или нет, будут загружены в базу данных.
Поскольку база данных ведомого сервера будет очищена, когда главный-ведомый сервер выполнит синхронизацию данных (полную повторную синхронизацию), ключ с истекшим сроком действия, как правило, не повлияет на ведомый сервер, загружающий файл RDB.
4. Обработка просроченных ключей AOF
4.1 Запись файла AOF
Если срок действия ключа в базе данных истек, а сервер включил функцию сохранения AOF, при ленивом или периодическом удалении ключа с истекшим сроком действия программа добавит запись в файл AOF.DEL
команда, которая явно записывает, что ключ был удален.
Например, если клиент выполняет командуGET message
Чтобы получить доступ к ключу сообщения с истекшим сроком действия, сервер выполнит следующие 3 действия:
- Удалить ключ сообщения из базы данных
- добавить один
DEL message
команда для файла AOF - выполнить
GET message
Клиент команды возвращает пустой ответ
4.2 Перезапись файла AOF
При перезаписи файла AOF программа проверяет ключи в базе данных,Ключи с истекшим сроком действия не сохраняются в перезаписанный файл AOF..
5. Обработка просроченных ключей функцией копирования
В режиме репликации master-slave удаление просроченных ключей с подчиненного сервера контролируется главным сервером.:
- После того, как главный сервер удалит ключ с истекшим сроком действия, он явным образом отправит команду DEL всем подчиненным серверам, чтобы указать подчиненным серверам удалить ключ с истекшим сроком действия.
- Когда подчиненный сервер выполняет команду чтения, отправленную клиентом, даже если он обнаружит, что срок действия ключа истек, он не удалит ключ и вернет значение ключа, как обычно.
- Подчиненный сервер удалит ключ с истекшим сроком действия только после получения команды DEL, отправленной главным сервером.
6. Исходный код и ссылка
Хуан Цзяньхун «Проектирование и реализация Redis»