7. Как реализована базовая политика истечения срока действия Redis?

Redis задняя часть опрос
7. Как реализована базовая политика истечения срока действия Redis?

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

Если мы установим срок действия ключа в 1 минуту, как Redis удалит ключ через 1 минуту?

Стратегия истечения срока действия Redis использует стратегию ленивого удаления + периодического удаления.

1. Ленивое удаление

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

2. Периодически удалять

Когда для ключа установлено время истечения срока действия, каждый раз, когда клиент получает доступ (чтение и запись) к ключу, он определяет, истек ли срок действия ключа заранее, и если срок его действия истекает, он будет удален напрямую (это пассивное удаление). ;Но к некоторым ключам обращаются только один раз или они являются холодными данными., поэтому его нужно активно удалять.По умолчанию Redis обнаруживает 10 раз в секунду.Обнаруженный объект представляет собой набор ключей с установленным сроком действия, Каждый раз случайным образом проверяйте 20 ключей из этого набора на предмет просроченности. Если срок их действия истек, удалите их напрямую. Если доля просроченных ключей превышает 1/4, повторите вышеописанную операцию один раз (жадный алгоритм). В то же время, чтобы гарантировать, что просроченное сканирование не приведет к чрезмерному зацикливанию и зависанию потока, алгоритм также увеличивает верхний предел времени сканирования, которое по умолчанию не будет превышать 25 мс.

Что, если срок действия всех ключей в большом экземпляре Redis истекает одновременно?

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

Некоторые друзья спрашивали, нет ли ограничения по времени сканирования в 25 мс, как это может вызывать задержки?

Если 1001 клиент отправляет запросы одновременно, а время выполнения первых 1000 запросов составляет 25 мс, сколько времени потребуется для выполнения 1001-й инструкции? 25000мс, 25 секунд, это время зависания клиента, которое вызвано непрерывным небольшим зависанием сервера.

Как централизованно решить проблему зависания из-за большого количества ключей с истекшим сроком действия?

Вариант 1: При установке срока действия ключа добавить случайное время

redis.expireat(key, expire_time + random(300))

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

Вариант 2. В Redis 4.0 и более поздних версиях включите механизм бездействия.

lazyfree-lazy-expire yes

Кроме того, помимо оптимизации и изменения конфигурации на бизнес-уровне, вы также можете вовремя обнаружить эту ситуацию с помощью методов эксплуатации и обслуживания.

На уровне эксплуатации и обслуживания вам необходимо отслеживать различные данные о рабочем состоянии Redis. Вы можете получить все данные о рабочем состоянии этого экземпляра, выполнив команду INFO в Redis.

Здесь нам нужно сосредоточиться на expired_keys, это один из примеров до сих пор, совокупное количество удаленных ключей с истекшим сроком действия.

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

Политика истечения срока действия подчиненной библиотеки:Сканирование срока действия не будет выполняться из библиотеки, обработка истечения срока действия ведомой библиотекой является пассивной. Когда срок действия ключа истечет, главная библиотека добавит инструкцию del в файл AOF для синхронизации со всеми подчиненными библиотеками.Подчиненная библиотека удалит ключ с истекшим сроком действия, выполнив эту инструкцию del.