предисловие
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
Инструменты, запросите медленный запрос, в соответствии с конкретной командой, соответствующей запросу и официальному документу, подтвердите, используется ли команда медленного запроса с высокой сложностью.
Если действительно имеется большое количество медленных команд запросов, рекомендуются следующие два метода:
-
Замените другими эффективными командами: скажем, если вам нужно вернуть
SET
все участники, не использоватьSMEMBERS
команда, но использоватьSSCAN
Несколько итераций возврата, чтобы избежать возврата к большим объемам данных, что приводит к блокировке потока. -
Когда вам нужно выполнить операции сортировки, пересечения и объединения, вы можете сделать это на стороне клиента вместо использования
SORT
,SUNION、SINTER
Эти команды, чтобы не замедлять работу экземпляра Redis.
2. Отключить команду ключей в производственной среде.
keys
Эту команду медленного запроса проще всего игнорировать, потому что команде keys необходимо пройти через сохраненные пары ключ-значение, поэтому задержка операции очень велика и может привести к блокировке Redis при использовании в производственной среде;Поэтому не рекомендуется использовать в производственной среде.keys
Заказ.
3. ключи должны установить время истечения срока действия
Redis - это база данных в памяти, и все данные находятся в памяти. Если использование памяти слишком велико, это сильно повлияет на производительность. Поэтому необходимо установить время истечения для данных с ограниченным сроком действия, чтобы Redis мог регулярно удалить просроченные данные.
4. Запрещено устанавливать одинаковое время истечения для ключей в пакетах
По умолчанию Redis каждый100
Миллисекунды удаляют некоторые истекшиеkey
Конкретный алгоритм заключается в следующем:
- выборка
ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
количество ключей и удалить все ключи с истекшим сроком действия; - если больше чем
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
(сортированный набор). Можно обнаружить, что использование строки может решить проблему в большинстве сценариев. Однако это не обязательно лучший выбор. Ниже приводится краткое описание их соответствующих применимых сценариев:
-
string
: один кэшированный результат, не связанный с другими KV -
hash
: Объект содержит множество свойств, и эти свойства необходимо хранить отдельно. Примечание. Не используйте строку в этом случае, потому что строка займет больше памяти. -
list
: Объект содержит много данных, и эти данные допускают повторение и требуют последовательности. -
set
: Объект содержит много данных, порядок данных не требуется, но повторение не допускается. -
zset
: Объект содержит много данных, а сами данные также содержат значение веса, которое можно использовать для сортировки.
Кроме того, Redis также предоставляет несколько типов расширений, а именно:
-
HyperLogLog
: подходит для基数
Существуют статистические данные, такие как статистика PV, UV.误差
проблема, не подходящая для точной статистики. -
BitMap
:Подходит для二值状态
Статистика, например вход в карту, либо тап, либо нет.
6. Проверьте стратегию настойчивости
После Redis4.0 используются следующие три стратегии сохранения:
-
AOF日志
: стратегия записи команд в журнал путем добавления файлов.Предусмотрено три элемента конфигурации для синхронного и асинхронного добавления.Если вам интересно, вы можете проверить официальную документацию. -
RDB快照
: Запись данных памяти в определенный момент на диск в виде снимка. -
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 имеет три важных средства:
- синхронизация ведущий-ведомый
- Режим стража
-
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 для хранения данных.
Итак, зная этот индикатор, как мы его используем? Здесь я привожу некоторые эмпирические пороговые значения:
-
mem_fragmentation_ratio
Больше 1, но меньше 1,5. Эта ситуация разумна. Это потому, что факторы, которые я только что представил, неизбежны. Ведь должен использоваться внутренний распределитель памяти, а стратегия выделения универсальна и не будет легко модифицироваться, внешняя причина определяется нагрузкой на Redis и не может быть ограничена. Таким образом, фрагментация памяти — это нормально. -
mem_fragmentation_ratio
больше 1,5. Это указывает на то, что уровень фрагментации памяти превысил 50%. В обычных условиях в это время нам необходимо принять некоторые меры для снижения скорости фрагментации памяти.
Если уровень фрагментации памяти слишком высок, необходимо принять меры по устранению фрагментации памяти.Подробности см. в статье:Redis устраняет фрагментацию памяти
Суммировать
Эта статья посвящена 13 военным уставам оптимизации производительности.В процессе разработки необходимо детально проанализировать конкретные проблемы.Надеюсь, эта статья сможет вам помочь.
Статья добавлена на GitHub:github.com/JavaFamily