Тринадцать военных правил оптимизации производительности Redis

Redis

предисловие

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

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

1. Избегайте медленных команд запроса

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

Сказать,ValueТипStringчас,GET/SETОперация в основном предназначена для работы с индексом хеш-таблицы Redis. Сложность этой операции в основном фиксирована, т.O(1). Однако, когдаValueТипSetчас,SORT,SUNION/SMEMBERSСложность эксплуатацииO(N+M*log(M))иO(N). в,NзаSetколичество элементов в ,MзаSORTКоличество элементов, возвращенных операцией. Эта сложность сильно возрастает. Сложность каждой команды описана в официальной документации Redis.Когда вам нужно узнать сложность команды, вы можете запросить ее напрямую.

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

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

  1. Замените другими эффективными командами: скажем, если вам нужно вернутьSETвсе участники, не использоватьSMEMBERSкоманда, но использоватьSSCANНесколько итераций возврата, чтобы избежать возврата к большим объемам данных, что приводит к блокировке потока.

  2. Когда вам нужно выполнить операции сортировки, пересечения и объединения, вы можете сделать это на стороне клиента вместо использованияSORT,SUNION、SINTERЭти команды, чтобы не замедлять работу экземпляра Redis.

2. Отключить команду ключей в производственной среде.

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

3. ключи должны установить время истечения срока действия

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

4. Запрещено устанавливать одинаковое время истечения для ключей в пакетах

По умолчанию Redis каждый100Миллисекунды удаляют некоторые истекшиеkeyКонкретный алгоритм заключается в следующем:

  1. выборкаACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOPколичество ключей и удалить все ключи с истекшим сроком действия;
  2. если больше чем25%изkeyЕсли срок его действия истек, повторяйте процесс удаления, пока не истечет срок его действия.keyупал ниже «25%».

ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOPявляется параметром Redis, по умолчанию20, то в течение одной секунды в основном200истекшийkeyбудет удален. Эта стратегия очень полезна для очистки ключей с истекшим сроком действия и освобождения памяти. Если вы будете удалять 200 ключей с истекшим сроком действия в секунду, это не сильно повлияет на Redis.

Однако, если сработает второе правило вышеуказанного алгоритма, Redis продолжит удаление, чтобы освободить место в памяти. Обратите внимание, что операции удаления блокируются (Redis 4.0Затем можно использовать асинхронный механизм многопоточности для уменьшения эффекта блокировки). Таким образом, после срабатывания этого условия поток Redis будет продолжать удаляться, так что другие операции «ключ-значение» не смогут нормально обслуживаться, что еще больше приведет к увеличению задержки других операций «ключ-значение» и замедлению работы Redis.

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

Поэтому необходимо запретить пакетную подачу во время разработки.keysУстановите срок годности.

5. Тщательно выбирайте структуру данных

В Redis есть пять часто используемых структур данных:string,hash,list,set,zset(сортированный набор). Можно обнаружить, что использование строки может решить проблему в большинстве сценариев. Однако это не обязательно лучший выбор. Ниже приводится краткое описание их соответствующих применимых сценариев:

  1. string: один кэшированный результат, не связанный с другими KV
  2. hash: Объект содержит множество свойств, и эти свойства необходимо хранить отдельно. Примечание. Не используйте строку в этом случае, потому что строка займет больше памяти.
  3. list: Объект содержит много данных, и эти данные допускают повторение и требуют последовательности.
  4. set: Объект содержит много данных, порядок данных не требуется, но повторение не допускается.
  5. zset: Объект содержит много данных, а сами данные также содержат значение веса, которое можно использовать для сортировки.

Кроме того, Redis также предоставляет несколько типов расширений, а именно:

  1. HyperLogLog: подходит для基数Существуют статистические данные, такие как статистика PV, UV.误差проблема, не подходящая для точной статистики.
  2. BitMap:Подходит для二值状态Статистика, например вход в карту, либо тап, либо нет.

6. Проверьте стратегию настойчивости

После Redis4.0 используются следующие три стратегии сохранения:

  1. AOF日志: стратегия записи команд в журнал путем добавления файлов.Предусмотрено три элемента конфигурации для синхронного и асинхронного добавления.Если вам интересно, вы можете проверить официальную документацию.
  2. RDB快照: Запись данных памяти в определенный момент на диск в виде снимка.
  3. AOFиRDBСмешанное использование: новый метод Redis 4.0, чтобы использовать соответствующие преимущества двух методов, журнал AOF, используемый в период времени моментального снимка RDB, записывает рабочие команды этого периода, так что в случае простоя два метода не будут потеряны.Данные в середине снимка сегмента.

Поскольку запись на диск содержит узкое место работы IO, если Redis не используется в качестве базы данных (которая может быть восстановлена ​​из бэкэнда), рекомендуется отключить постоянство или отрегулировать стратегию настойчивости.

7. Высокоскоростной SSD в качестве устройства записи журнала

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

8. Используйте физические машины вместо виртуальных машин

Поскольку виртуальная машина добавляет программный уровень виртуализации, по сравнению с физической машиной, сама виртуальная машина имеет накладные расходы на производительность.Вы можете использовать следующие команды для проверки производительности физической машины и виртуальной машины соответственно.基线性能:

./redis-cli --intrinsic-latency 120

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

9. Увеличьте объем памяти компьютера или используйте кластер Redis

Недостаток памяти на физическом компьютере приведет к тому, что операционной системе не хватит памяти.Swap.

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

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

Это еще более важно для базы данных Redis в памяти: в обычных условиях работа Redis может выполняться напрямую путем доступа к памяти.swapОн запускается, и операция запроса Redis должна дождаться завершения чтения и записи данных на диск. И, как я только что сказалAOFлог-файл чтение и запись использованияfsyncразные потоки,swapПосле срабатывания он влияет на мастер RedisIOпотоков, что может значительно увеличить время отклика Redis.

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

10. Используйте Pipeline для пакетной обработки данных

Pipeline(Конвейерная технология) — это пакетная технология, предоставляемая клиентом для одновременной обработки нескольких команд Redis, что повышает производительность всего взаимодействия.

11. Оптимизация использования клиента

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

12. Используйте распределенную архитектуру для увеличения скорости чтения и записи

Распределенная архитектура Redis имеет три важных средства:

  1. синхронизация ведущий-ведомый
  2. Режим стража
  3. Redis Clusterкластер

Используя функцию синхронизации master-slave, мы можем выполнять запись в основную библиотеку и передавать функцию чтения подчиненному сервису, чтобы в единицу времени можно было обрабатывать больше запросов, тем самым повышая общую скорость работы Redis.

Режим Sentinel представляет собой обновление функции master-slave, но при сбое главного узла нормальное использование Redis может быть автоматически восстановлено без ручного вмешательства.

Redis ClusterдаRedis 3.0Официально запущенный кластер Redis уравновешивает нагрузку на каждый узел, распределяя и сохраняя данные на нескольких узлах.

Redis ClusterИспользуя разделение виртуального хеш-слота, все ключи сопоставляются с0 ~ 16383 В целочисленном слоте формула расчета такова:slot = CRC16(key) & 16383, каждый узел отвечает за поддержку части слота и данных ключ-значение, отображаемых слотом. Таким образом, Redis может распределять давление чтения и записи с одного сервера на несколько серверов, поэтому производительность будет значительно улучшена.

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

13. Избегайте фрагментации памяти

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

Redis предоставляетINFO memoryВы можете просмотреть информацию об использовании памяти следующим образом:

INFO memory
# Memory
used_memory:1073741736
used_memory_human:1024.00M
used_memory_rss:1997159792
used_memory_rss_human:1.86G
…
mem_fragmentation_ratio:1.86

вот одинmem_fragmentation_ratio, который представляет текущую скорость фрагментации памяти Redis. Итак, как рассчитывается эта скорость фрагментации? По сути, это два индикатора в приведенной выше командеused_memory_rssиused_memoryрезультат деления.

mem_fragmentation_ratio = used_memory_rss/ used_memory

used_memory_rssЭто пространство физической памяти, фактически выделенное Redis операционной системой, которое содержит фрагменты; иused_memoryЭто пространство, фактически используемое Redis для хранения данных.

Итак, зная этот индикатор, как мы его используем? Здесь я привожу некоторые эмпирические пороговые значения:

  1. mem_fragmentation_ratioБольше 1, но меньше 1,5. Эта ситуация разумна. Это потому, что факторы, которые я только что представил, неизбежны. Ведь должен использоваться внутренний распределитель памяти, а стратегия выделения универсальна и не будет легко модифицироваться, внешняя причина определяется нагрузкой на Redis и не может быть ограничена. Таким образом, фрагментация памяти — это нормально.

  2. mem_fragmentation_ratioбольше 1,5. Это указывает на то, что уровень фрагментации памяти превысил 50%. В обычных условиях в это время нам необходимо принять некоторые меры для снижения скорости фрагментации памяти.

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

Суммировать

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

Статья добавлена ​​на GitHub:github.com/JavaFamily