Не спрашивайте меня, что делать, когда память Redis заполнена

Redis

Обзор

Redis, ранее я писал статью оТри основные проблемы с кэшированием Redis, кумулятивное количество чтений почти 800. Для числа фанатов, у которых всего около 3к, достичь такого количества чтений уже относительно сложно.

Это говорит о том, что статья написана хорошо, и это было подтверждено многими людьми.Если вам интересно, взгляните на [].

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

Итак, сегодня возникает вопрос, который часто задают в интервью:Что делать, если ваша память Redis заполнена?Если вы используете Redis в качестве кеша в течение длительного времени, однажды он будет заполнен, верно?

Не паникуйте из-за этого вопроса интервью, в Redis есть параметры конфигурации.maxmemoryМожетУстановите размер памяти Redis.

Файл конфигурации в Redisredis.confфайл, настроитьmaxmemoryПараметр размера выглядит следующим образом:В реальном производстве точно нет100mbРазмер Ха, не вводите меня в заблуждение, здесь я просто сообщаю всем этот параметр, как правило, небольшие компании настроены на3Gвокруг размера.

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

//获取maxmemory配置参数的大小
127.0.0.1:6379> config get maxmemory
//设置maxmemory参数为100mb
127.0.0.1:6379> config set maxmemory 100mb

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

Далее мы подробно поговорим о стратегии исключения в Redis и глубоко разберемся в принципе и сценариях применения каждой стратегии исключения.

стратегия устранения

Redis предоставляет6 стратегий устранения, где по умолчаниюnoeviction, 6 стратегий устранения следующие:

  1. noeviction(политика по умолчанию): Если размер памяти достигает порога, все инструкции по подаче заявки на память будут сообщать об ошибке.
  2. allkeys-lru: Используются все ключиАлгоритм LRUУстранять.
  3. volatile-lru:всеКлюч с установленным сроком действия использует алгоритм LRUУстранять.
  4. allkeys-random: используются все ключислучайное исключениеспособ устранения.
  5. volatile-random:всеКлюч со сроком действия настроен на использование случайного исключенияспособ устранения.
  6. volatile-ttl: Все ключи с установленным сроком действияУстранение на основе времени истечения срока действия, чем раньше оно истечет, тем раньше оно будет устранено.

Если данные в RedisЧасть из них — горячие данные, а остальное — холодные данные.,илиМы мало что знаем о распределении доступа к кешу в нашем приложении., то вы можете использоватьallkeys-lru.

Предполагая, что доступ ко всем данным осуществляется с одинаковой частотой, вы можете использоватьallkeys-randomстратегия ликвидации.

Если вы хотите настроить конкретную стратегию исключения, вы можетеredis.confНастроенная в файле конфигурации, конкретная конфигурация выглядит следующим образом:Для этого нужно только открыть комментарий и настроить указанный метод политики.Другой метод настройки — настроить команду.Конкретная команда выполнения выглядит следующим образом:

// 获取maxmemory-policy配置
127.0.0.1:6379> config get maxmemory-policy
// 设置maxmemory-policy配置为allkeys-lru
127.0.0.1:6379> config set maxmemory-policy allkeys-lru

При введении 6 видов стратегий исключения, когда речь идет об алгоритме LRU,Так что же такое алгоритм LRU?

Алгоритм LRU

LRU(Least Recently Used)То есть это означает наименее недавно использованный ключ, то есть ключ, к которому реже всего обращались в последнее время.Алгоритм удаляет данные в соответствии с историческими записями доступа к данным.

Его основная идея заключается в следующем:Если ключ редко использовался в последнее время, к нему редко будут обращаться в будущем..

На самом деле LRU, реализованный Redis, не является настоящим алгоритмом LRU, то есть мы используем алгоритм LRU для исключения ключей по имени, но на самом деле исключаемые ключи — это не обязательно те ключи, которые действительно бесполезны в течение длительного времени.

Redis использует приблизительный алгоритм LRU,Удалите ключи методом случайного сбора, каждый раз будет случайным образом выбираться 5 ключей, а затем будет исключен последний использованный ключ..

5 ключей здесь являются только номером по умолчанию, и конкретный номер также может быть настроен в файле конфигурации.Конфигурация в файле конфигурации показана на следующем рисунке:Чем больше значение приближенного алгоритма LRU, тем ближе он будет к реальному алгоритму LRU, который можно понять таким образом, т.к.Чем больше значение, тем полнее собранные данные и тем ближе исключаемые данные к последним использованным данным..

Затем, чтобы реализовать алгоритм LRU на основе времени, Redis должен добавить дополнительное пространство памяти для каждого ключа для хранения времени каждого ключа, а размер составляет 3 байта.

В приблизительный алгоритм LRU в Redis 3.0 были внесены некоторые оптимизации.16память пула кандидатов.

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

Когда данные выбраны после второго раза, толькоменьше минимального времени пребывания в пуле кандидатовпопадут в резерв кандидатов.

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

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

Однако у алгоритма LRU есть недостаток: если к значению ключа ранее не обращались, но обращались недавно, оно будет считаться горячими данными и не будет устранено.

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

Так в Redis 4.0 помимо алгоритма LRU был добавлен новый алгоритм LFU.Так что же такое алгоритм алгоритма LFU?

LFU-алгоритм

LFU(Least Frequently Used)То есть это означает, что ключ часто используется в последнее время, то есть ключ, к которому часто обращаются в последний период времени, и в качестве критерия он принимает частоту количества посещений в последний период времени.

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

Алгоритм LFU отражает актуальность ключа и не будет считаться горячими данными, поскольку доступ к алгоритму LRU осуществляется время от времени.

Поддерживается в алгоритме LFUvolatile-lfuстратегия иallkeys-lfuСтратегия.

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

Удалить ключевую политику с истекшим сроком действия

В Redis есть три операции удаления, а именно:

  1. Регулярно удалять: Создайте таймер для периодического удаления ключа.
  2. ленивое удаление: при каждом повторном доступе к ключу будет проверяться срок действия ключа, и если он истек, он будет удален.
  3. регулярно удалять: Время от времени он будет проверять и удалять ключи с истекшим сроком действия.

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

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

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

пройти черезНаиболее разумный временной интервал для контроля удаленияудалить ключ, вычестьМеньшее потребление ресурсов процессора, чтобы рационализировать операцию удаления.

Устранение RDB и AOF

Есть два способа сохраниться в RedisRDBиAOF, для подробного ознакомления с этими двумя типами персистентности вы можете обратиться к этой статье [].

В RDB копия данных в определенный момент времени в памяти получается в виде моментального снимка.При создании RDB-файла можно передатьsaveиbgsaveКоманда выполняется для создания файла RDB.

Ни одна из команд не сохранит ключ с истекшим сроком действия в файле RDB., что также может привести к удалению ключей с истекшим сроком действия.

При запуске Redis для загрузки файла RDB,MasterКлючи с истекшим сроком действия не будут загружены, иSlaveЗагрузит ключи с истекшим сроком действия.

В режиме AOF Redis предоставляет меры по оптимизации для Rewrite, а выполняемые команды:REWRITEAOFиBGREWRITEAOF,Ни одна из этих двух команд не будет записывать ключи с истекшим сроком действия в файл AOF, и они также могут удалять ключи с истекшим сроком действия..