Чтобы лучше использовать память, чтобы Redis сохранял кешированные горячие данные, Redis разработал соответствующий механизм исключения памяти (также называемый механизмом исключения кеша).
Элемент конфигурации maxmemory используется для установки максимального размера памяти, который разрешено использовать пользователю.Когда размер набора данных памяти достигает определенного размера, данные будут удалены в соответствии с политикой, настроенной элементом конфигурации maxmemory-policy noeviction.
Процесс устранения памяти
- Клиент инициирует команду (например, set), которая должна запросить больше памяти.
- Redis проверяет использование памяти.Если используемая память больше, чем maxmemory, он начинает удалять память (ключ) в соответствии с различными стратегиями устранения, настроенными пользователем, в обмен на определенный объем памяти.
- Если нет проблем с вышеперечисленным, команда выполняется успешно
6 стратегий удаления данных
По умолчанию политика запрета выселения
- volatile-lru
Выберите наименее использованные данные из набора данных с установленным сроком действия (server.db[i].expires)
- allkeys-lru
Выберите наименее использованные данные из набора данных (server.db[i].dict)
- volatile-ttl
Выберите данные, срок действия которых истекает, из набора данных (server.db[i].expires) с установленным временем истечения срока действия.
- volatile-random
Произвольно выберите удаление данных из набора данных с установленным сроком действия (server.db[i].expires)
- allkeys-random
Произвольно выбрать удаление данных из набора данных (server.db[i].dict)
- no-enviction
Запретить вытеснение данных, никогда не истекать, возвращать ошибку только для операций записи, по умолчанию стоит этот пункт
После того, как Redis решит удалить пару ключ-значение, он удалит данные и опубликует сообщение об изменении данных на локальном (постоянство AOF) и подчиненном (соединение ведущий-ведомый)
Механизм удаления данных LRU
На самом деле LRU, реализованный Redis, не является надежным LRU, то есть мы используем алгоритм LRU для устранения ключей в названии, но на самом деле исключаемые ключи — это не обязательно те, которые не использовались дольше всего. Здесь есть компромисс: если нужно искать оптимальное решение во всем ключевом пространстве, это неизбежно увеличит нагрузку на систему, Redis однопоточный, то есть один и тот же инстанс может обслуживать только одного клиента. за раз, поэтому трудоемкая операция должна быть осторожной. Для достижения относительного LRU в рамках определенной стоимости ранняя версия Redis основывалась на выборке LRU, то есть отказе от всех поисковых решений в ключевом пространстве и поиске оптимального решения в выборочном пространстве. Начиная с версии Redis 3.0, авторы Redis внесли некоторые оптимизации для LRU на основе выборки, чтобы сделать результат ближе к реальному LRU при определенной стоимости.
Механизм удаления данных TTL
Структура набора данных Redis хранит таблицу времени истечения срока действия пары ключ-значение, а именно redisDb.expires.При использовании команды SET есть параметр для времени ожидания пары ключ-значение. Произвольно выберите несколько пар ключ-значение из таблицы времени истечения срока действия redisDB.expires и удалите пару ключ-значение с наибольшим ttl для исключения. Точно так же стратегия устранения TTL не является парой ключ-значение с самым быстрым сроком действия во всех таблицах времени истечения срока действия, а всего лишь несколькими случайно выбранными парами ключ-значение.
случайное исключение
В сценарии случайного исключения получите пару ключ-значение, которая будет удалена, и случайным образом найдите хеш-ведро и снова хешируйте dictEntry в указанном месте.
Суммировать
Механизмы исключения (LRU и TTL) в Redis реализованы по неточным алгоритмам, в основном уравновешивающим производительность и надежность, поэтому они не являются полностью надежными.После понимания стратегии исключения Redis следует активнее устанавливать или чаще обновлять ключ.Срок действия, активно удалять бесполезные данные, улучшать общую производительность и пространство Redis