Обнаружение и обработка BigKey
BigKey могут существенно влиять на производительность и стабильность сервиса Redis, потенциально приводя к ухудшению работы или сбоям. В этом документе представлено понятие BigKey, методы их обнаружения и лучшие практики по работе с ними в производственных средах.
Содержание
Что такое BigKeyВлияние BigKeyОбнаружение BigKeyОбнаружение с помощью инструментов инспекцииОграничения использованияОбнаружение с помощью командной строкиОграничения использованияОптимизация BigKeyОптимизация структур хранения данныхСжатие данныхРегулярная очистка устаревших данныхЧто такое BigKey
BigKey в Redis означает не то, что сам ключ большой, а размер значения, связанного с ключом. BigKey обычно оцениваются по двум критериям: потреблению памяти и количеству элементов. Распространённые пороговые значения включают:
- String: размер превышает 5 МБ
- List: количество элементов превышает 20 000
- Set: количество элементов превышает 10 000
- Sorted Set: количество элементов превышает 10 000
- Hash: количество полей превышает 10 000
Примечание: Эти пороги приведены в качестве рекомендаций и могут потребовать корректировки в зависимости от вашей конкретной среды и требований.
Влияние BigKey
BigKey могут негативно влиять на производительность и стабильность сервиса Redis несколькими способами:
- Блокировка потока: Redis обрабатывает данные в однопоточном режиме. Операции с BigKey могут занимать много времени, блокируя выполнение других команд и ухудшая общую производительность сервиса.
- Таймауты клиентов: Из-за однопоточной архитектуры операции с BigKey могут привести к тому, что Redis перестанет отвечать на запросы клиентов, вызывая таймауты соединений.
- Перегрузка сетевого канала: Передача BigKey требует значительной пропускной способности сети. Например, ключ размером 1 МБ, к которому обращаются 1000 раз в секунду, создаст трафик в 1 ГБ/с, что может перегрузить стандартную сетевую инфраструктуру.
В кластерах возникают дополнительные проблемы:
- Несбалансированное потребление памяти: BigKey могут вызывать чрезмерное потребление памяти на отдельных узлах, что приводит к неэффективному использованию ресурсов кластера.
- Узкие места при миграции: При масштабировании миграция BigKey может блокировать Redis на длительное время, нарушая нормальную работу и потенциально снижая стабильность кластера.
Обнаружение BigKey
Обнаружение с помощью инструментов инспекции
Alauda Application Services предоставляет Inspections для обнаружения BigKey в экземплярах Redis.
-
Отредактируйте конфигурацию развертывания инструмента инспекции, чтобы включить обнаружение BigKey.
На кластере, где расположен экземпляр, отредактируйте функцию RdsInstaller для включения обнаружения BigKey.
Вывод будет следующим:
-
Измените значение переменной окружения
ENABLE_REDIS_KEYS_INDICATORи сохраните изменения.Измените значение
ENABLE_REDIS_KEYS_INDICATORвspec.inspection.envна1. Изменённый экземпляр будет выглядеть так:После сохранения инструмент инспекции Operator перезапустится. Вы можете проверить прогресс перезапуска следующей командой:
Вывод будет следующим:
Примечание: указанное изменение не является постоянным; конфигурация будет перезаписана при обновлениях платформы.
-
Запустите инспекцию
В разделе Redis -> Details Info нажмите кнопку Inspection для запуска инспекции экземпляра.
После запуска кнопка отобразит Inspecting.... По завершении кнопка снова станет активной.
Включённая функция обнаружения BigKey заставит инструмент инспекции выполнить
SCANвсех данных в кэше, поэтому процесс может занять значительное время. -
Просмотр результатов инспекции
По завершении инспекции вы можете нажать кнопку Query в отчёте инспекции на странице Redis -> Detail Info, чтобы просмотреть результаты.

Если в экземпляре действительно есть BigKey, в результатах инспекции будет перечислен
BigKey Top5, как показано на рисунке ниже:
Ограничения использования
- Инструмент инспекции выполняет полное сканирование данных Redis, что может создавать нагрузку на сервис; рекомендуется использовать в периоды низкой нагрузки.
- В настоящее время инструмент инспекции поддерживает обнаружение только типов
string,listиzset.
Обнаружение с помощью командной строки
Сообщество Redis предоставляет возможность обнаружения BigKey с помощью redis-cli. При обнаружении происходит обход/выборка всех ключей в экземпляре Redis с возвратом общей статистики по ключам и самого большого ключа каждого типа данных. В настоящее время анализируются типы string, list, set, zset, hash и stream. Команда для запуска:
Ограничения использования
- Обнаружение с помощью
redis-cliтакже выполняет полное сканирование данных Redis, что может создавать нагрузку на сервис; рекомендуется использовать в периоды низкой нагрузки.
Оптимизация BigKey
Необходимо выбирать подходящие схемы оптимизации в зависимости от конкретных бизнес-сценариев и характеристик данных, обычно фокусируясь на следующих аспектах:
Оптимизация структур хранения данных
Для коллекционных типов с большим количеством элементов (таких как list, set, zset, hash и др.) рекомендуется разбивать их на несколько ключей, обеспечивая разумное количество элементов на каждый ключ. В архитектуре Redis кластера разделение больших ключей значительно улучшает баланс памяти между шардовыми данными.
Сжатие данных
Если хранится большое количество JSON или HTML кэша, рассмотрите возможность сжатия данных. Также можно использовать протоколы сериализации, такие как ProtoBuffer или MessagePack, для уменьшения размера данных.
Регулярная очистка устаревших данных
Для данных с определённым временем жизни можно автоматически очищать устаревшие данные, задавая время истечения. Для данных с неопределённым временем жизни рекомендуется периодическая очистка. Это особенно актуально для структур данных list, set, zset и hash, которые могут накапливать большое количество устаревших элементов; поэтому рекомендуется комбинировать команды SCAN и DEL для удаления невалидных элементов.
Независимо от выбранной схемы оптимизации, следует особенно осторожно использовать команду DEL для очистки существующих BigKey, так как DEL блокирует сервис Redis. Рекомендуется использовать команду UNLINK, которая асинхронно удаляет ключи без блокировки Redis.