Политика истечения срока действия
Если мы установим срок действия ключа в 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.