Демистификация узкого места производительности Redis: как оптимизировать основные проблемы?

Эта статья участвуетПроект «Золотой камень».

1. В чем проблема большого ключа Redis

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

Какой объем данных считается большим ключом?

Фиксированного критерия нет, обычно считается, что значение, соответствующее ключу строкового типа, занимает более 1M места, или количество k элементов типа коллекции превышает 10 000, что считается большим ключом.

Определение и критерии оценки большой ключевой проблемы Redis не являются статичными, и их следует всесторонне оценивать в соответствии с фактическим применением Redis и потребностями бизнеса. Например, в сценарии с высокой степенью параллелизма и малой задержкой размер большого ключа может составлять всего 10 КБ, однако в среде с низкой степенью параллелизма и высокой емкостью ограничение для большого ключа может составлять 100 КБ. Поэтому при проектировании и использовании Redis необходимо установить разумный большой порог ключа на основе бизнес-требований и показателей производительности.

2. Воздействие большого ключа

  1. Использование памяти слишком велико. Большие ключи занимают слишком много места в памяти, что может привести к нехватке доступной памяти, что запускает стратегию ликвидации памяти. В крайних случаях память может быть исчерпана, и экземпляр Redis может выйти из строя, что повлияет на стабильность системы.
  2. Производительность падает. Большой ключ будет занимать большой объем памяти, что приведет к увеличению фрагментации памяти, что, в свою очередь, повлияет на производительность Redis. Операции с большими ключами, такие как чтение, запись и удаление, потребляют больше процессорного времени и ресурсов памяти, что еще больше снижает производительность системы.
  3. Блокировать другие операции. Некоторые операции с большими ключами могут привести к блокировке экземпляра Redis. Например, использование команды DEL для удаления большого ключа может привести к тому, что экземпляр Redis не сможет отвечать на другие клиентские запросы в течение определенного периода времени, что повлияет на время ответа и пропускную способность системы.
  4. Перегруженность сети. Каждое получение большого ключа генерирует большой объем сетевого трафика, что может привести к полному использованию полосы пропускания компьютера или локальной сети и одновременно повлиять на другие службы. Например: большой ключ занимает 1 МБ, а 1000 посещений в секунду приведут к 1000 МБ трафика.
  5. Задержка синхронизации ведущий-ведомый. Когда экземпляр Redis настроен на синхронизацию ведущий-ведомый, большие ключи могут вызывать задержки в синхронизации ведущий-ведомый. Поскольку большой ключ занимает больше памяти, в процессе синхронизации необходимо передать большой объем данных, что увеличит задержку передачи по сети между ведущим и ведомым устройством, что повлияет на согласованность данных.
  6. Перекос данных. В режиме кластера Redis использование памяти для определенного фрагмента данных намного выше, чем для других фрагментов данных, и ресурсы памяти для фрагментов данных не могут быть сбалансированы. Кроме того, это также может привести к тому, что память Redis достигнет верхнего предела, определенного параметром maxmemory, что приведет к вытеснению важных ключей или даже к переполнению памяти.

3. Причина большого ключа

  1. Бизнес-дизайн неразумен. Это самая распространенная причина, большой объем данных не должен храниться в одном ключе, а должен быть разбросан по нескольким ключам. Например, разделение национальных данных на 34 ключа в соответствии с провинциями и административными районами или их разделение на 300 ключей в соответствии с городами может дополнительно снизить вероятность создания больших ключей.
  2. Проблема динамического роста стоимости не предвидится. Если вы продолжаете добавлять ценные данные без механизма удаления, механизма истечения срока действия или ограничения на количество, большие ключи рано или поздно появятся. Например: список поклонников звезды Weibo, популярные комментарии и т. д.
  3. Время истечения не установлено должным образом. Если для определенного ключа не установлено время истечения срока действия или установлено более длительное время истечения срока действия. Со временем количество значений быстро накапливается, в итоге образуя большой ключ.
  4. Ошибки программы. Некоторые ненормальные условия приводят к тому, что жизненный цикл некоторых ключей превышает ожидания, или количество значений ненормально увеличивается, а также будут генерироваться большие ключи.

4. Как устранить неполадки с большими ключами

4.1 Команда СКАНИРОВАНИЕ

Используя команду SCAN Redis, мы можем просмотреть все ключи в базе данных. В сочетании с другими командами (такими как STRLEN, LLEN, SCARD, HLEN и т. д.) мы можем идентифицировать большие ключи. Преимущество команды SCAN заключается в том, что она может проходить без блокировки экземпляра Redis.

4.2 параметры больших ключей

Используя командный клиент redis-cli, при подключении к сервису Redis добавьте параметр --bigkeys для сканирования ключа с наибольшим числом каждого типа данных.

redis-cli -h 127.0.0.1 -p 6379 — большие ключи

4.3 Инструмент Redis RDB Tools

Используйте инструмент с открытым исходным кодом Redis RDB Tools для анализа файла RDB и сканирования большого ключа Redis.

Например: Выведите 3 верхних ключа, которые занимают более 1 КБ памяти.

rdb — общая память — 1024 байта — самый большой 3 dump.rbd

5. Как разгадать большой ключ

  1. Разделить на несколько маленьких клавиш. Это самый простой способ уменьшить размер одного ключа, вы можете использовать mget для чтения в пакетном режиме.
  2. Сжатие данных. При использовании типа String используйте алгоритм сжатия, чтобы уменьшить размер значения. Или используйте хранилище типа Hash, поскольку базовый тип Hash использует структуру данных сжатого списка.
  3. Установите разумный срок действия. Установите срок действия для каждого ключа и установите разумный срок действия, чтобы данные автоматически очищались после истечения срока действия, избегая проблемы больших ключей, накопленных за длительный период времени.
  4. Включить политику исключения памяти. Включите стратегию удаления памяти Redis, такую ​​как LRU (наименее недавно использованная, наименее недавно использованная), чтобы при нехватке памяти наименее недавно использовавшиеся данные автоматически удалялись, чтобы большие ключи не занимали память в течение длительного времени.
  5. Разделение данных. Например, используйте Redis Cluster для распределения данных по нескольким экземплярам Redis, чтобы снизить нагрузку на один экземпляр и снизить риск серьезных проблем с ключевыми элементами.
  6. Удалить большой ключ. Используйте команду UNLINK для удаления больших ключей. Команда UNLINK представляет собой асинхронную версию команды DEL. Она может удалять ключи в фоновом режиме, чтобы не блокировать экземпляр Redis.

6. Резюме

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

Я "Архитектура Yideng". Если эта статья была вам полезна, пожалуйста, ставьте лайки, комментируйте и уделяйте внимание всем. Спасибо, ветераны. Увидимся в следующем выпуске.

Supongo que te gusta

Origin juejin.im/post/7222825885203218491
Recomendado
Clasificación