Это может быть наиболее подходящей спецификацией использования Redis.
Брат Код, вчера я подвергся критике со стороны руководителя компании.
Я работаю в единственной интернет-компании по типу свахи, и на Double Eleven мы запустили мероприятие по отправке подруг при размещении заказа.
Кто бы мог подумать, что после 12 часов ночи количество пользователей резко увеличилось, произошел технический сбой, и пользователи не могли размещать заказы, в это время начальник был в ярости!
Нашел по поискуRedisгазетаCould not get a resource from the pool
.
Невозможно получить ресурсы подключения, а количество подключений к одному Redis в кластере велико.
Таким образом, максимальное количество подключений и количество ожиданий подключения изменяются различными способами.Хотя частота сообщений об ошибках уменьшилась, она по-прежнемупродолжайте сообщать об ошибках.
Позже, после автономного тестирования, было обнаружено, что хранилищеRedisсерединаДанные символов очень большие, в среднем возвращаются данные за 1 с..
Брат по коду, не могли бы вы поделиться спецификацией использования Redis? Я хочу быть настоящим мужчиной, который только быстр и нерушим!
пройти черезПочему Redis такой быстрый?В этой статье мы знаем, что Redis усердно работает над достижением высокой производительности и экономии памяти.
Таким образом, только нормативное использованиеRedis, чтобы добиться высокой производительности и сэкономить память, иначе Redis, каким бы хорошим он ни был, не поможет нам метаться.
Спецификация использования Redis вращается вокруг следующих аспектов:
- Спецификация использования пары ключ-значение;
- Спецификация использования команд;
- спецификации хранения данных;
- Технические характеристики эксплуатации и обслуживания.
Спецификация использования пары ключ-значение
Следует отметить две вещи:
- Ok
key
Именование может обеспечить ключ с высокой удобочитаемостью и высокой ремонтопригодностью, что удобно для обнаружения проблем и поиска данных. -
value
избегатьbigkey
, выбрать эффективную сериализацию и сжатие, использовать общий пул объектов, выбрать эффективные и подходящие типы данных (см.Redis Actual Combat: использование типов данных для получения статистики данных на уровне миллиардов").
соглашение об именовании ключей
нормативныйkey
Назовите его так, чтобы вы могли легко найти его, когда столкнетесь с проблемами. Redis не принадлежитScheme
изNoSQL
база данных.
Поэтому для установления его необходимо опираться на нормы.Scheme
Семантика, точно так же, как мы строим разные базы данных по разным сценариям.
постучать по доске
Префикс «имя бизнес-модуля» (например, база данныхScheme
), разделенных двоеточием, за которым следует "конкретное название компании".
Так что мы можем пройтиkey
Префикс для различения различных бизнес-данных, понятных и понятных.
Подводя итог: «название компании: имя таблицы: идентификатор»
Например, мы хотим подсчитать количество поклонников блогера «Код Байт», чей официальный аккаунт относится к техническому типу.
set 公众号:技术类:码哥字节 100000
Код брат, есть ли проблема, если ключ слишком длинный?
key — это строка, а базовая структура данных —SDS
, структура SDS будет содержать метаданные, такие как длина строки и размер выделенного пространства.
По мере увеличения длины строки метаданные SDS также будут занимать больше места в памяти.
Поэтому, когда строка слишком длинная, мы можем использовать соответствующую сокращенную форму.
не используйте большой ключ
Код, брат, я был поражен, что привело к ошибке и невозможности установить соединение.
Поскольку Redis — это один поток для выполнения инструкций чтения и записи, если естьbigkey
Операции чтения и записи блокируют поток и снижают эффективность обработки Redis.
bigkey
Есть два случая:
- пара ключ-значение
value
очень большой, напримерvalue
сохранен2MB
изString
данные; - пара ключ-значение
value
Это тип коллекции с множеством элементов, например тот, который содержит 50 000 элементов.List
собирать.
Хотя Redis официально заявилkey
а такжеstring
Типыvalue
Ограничения512MB
.
Предотвратить трафик сетевой карты, медленный запрос,string
введите контроль в10KB
в пределах,hash、list、set、zset
Количество элементов не должно превышать 5000.
Brother Code, что, если бизнес-данные такие большие? Например, шедевр «Золотой пинмэй» сохранился.
Мы также можем пройтиgzip
Сжатие данных для уменьшения размера данных:
/**
* 使用gzip压缩字符串
*/
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
try (ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out)) {
gzip.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return new sun.misc.BASE64Encoder().encode(out.toByteArray());
}
/**
* 使用gzip解压缩
*/
public static String uncompress(String compressedStr) {
if (compressedStr == null || compressedStr.length() == 0) {
return compressedStr;
}
byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);;
String decompressed = null;
try (ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(compressed);
GZIPInputStream ginzip = new GZIPInputStream(in);) {
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = ginzip.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString();
} catch (IOException e) {
e.printStackTrace();
}
return decompressed;
}
Тип коллекции
Если элементов типа коллекции действительно много, мы можем разделить большую коллекцию на несколько небольших коллекций для сохранения.
Используйте эффективные методы сериализации и сжатия
Чтобы сэкономить память, мы можем использовать эффективные методы сериализации и сжатия, чтобы уменьшитьvalue
размер.
protostuff
а такжеkryo
Эти два метода сериализации необходимо сравнитьJava
Встроенный метод сериализации более эффективен.
Хотя приведенные выше два метода сериализации экономят память, все они представляют собой двоичные данные после сериализации, и удобочитаемость слишком плохая.
Обычно мы сериализуем вJSON
илиXML
, чтобы избежать большого объема данных, мы можем использовать инструменты сжатия (snappy, gzip) для сжатия данных и сохранения их в Redis.
Общий пул с использованием целочисленных объектов
Redis внутренне поддерживает 10 000 целочисленных объектов от 0 до 9999 и использует эти целые числа в качестве общего пула.
Даже если большое количество пар ключ-значение хранит целые числа в диапазоне от 0 до 9999, в экземпляре Redis фактически сохраняется только один целочисленный объект, что может сэкономить место в памяти.
Следует отметить, что есть две ситуации, которые не действуют:
-
Редис установлен
maxmemory
и включенLRU
Стратегия(allkeys-lru 或 volatile-lru 策略
), то общий пул целочисленных объектов использовать нельзя.Это связано с тем, что LRU необходимо подсчитывать время использования каждой пары ключ-значение, которое невозможно подсчитать, если разные пары ключ-значение повторно используют целочисленный объект.
-
Если данные типа коллекции закодированы ziplist, а элементы коллекции являются целыми числами, общий пул в настоящее время использовать нельзя.
Поскольку ziplist использует компактную структуру памяти, неэффективно оценивать совместное использование целочисленных объектов.
Спецификация использования команды
Выполнение некоторых команд вызовет большие проблемы с производительностью, и нам нужно уделить особое внимание.
Инструкции для отключенных продуктов
Redis — это однопоточная операция обработки запроса.Если мы выполним некоторые команды, которые включают большое количество операций и занимают много времени, основной поток будет серьезно заблокирован, что приведет к невозможности нормальной обработки других запросов.
-
КЛЮЧИ: эта команда требует полного сканирования глобальной хеш-таблицы Redis, что серьезно блокирует основной поток Redis;
Вместо этого следует использовать SCAN для возврата подходящих пар ключ-значение в пакетах, чтобы избежать блокировки основного потока.
-
FLUSHALL: удалите все данные в экземпляре Redis, если объем данных большой, это серьезно заблокирует основной поток Redis;
-
FLUSHDB, удалите данные в текущей базе данных, если объем данных большой, это также заблокирует основной поток Redis.
Добавьте параметр ASYNC, чтобы FLUSHALL, FLUSHDB выполнялись асинхронно.
Мы также можем отключить его напрямую, используяrename-command
Команды переименовывают эти команды в файле конфигурации, делая их недоступными для клиентов.
Используйте команду MONITOR с осторожностью
Команда MONITOR будет непрерывно записывать отслеживаемое содержимое в выходной буфер.
Если над онлайн-командой будет много операций, буфер вывода скоро переполнится, что повлияет на производительность Redis и даже вызовет сбой службы.
Так что, если только нет особой необходимости следить за выполнением тех или иных команд (например, производительность Redis вдруг тормозит и мы хотим посмотреть, какие команды выполняет клиент) используем его.
Используйте команды полной операции с осторожностью
Например, получить все элементы коллекции (hgetall типа HASH, lrange типа List, smembers типа Set, zrange и другие команды).
Эти операции будут выполнять полное сканирование всей базовой структуры данных, что приведет к блокировке основного потока Redis.
Brother Code, что, если бизнес-сценарий заключается в получении полных данных?
Есть два пути ее решения:
- использовать
SSCAN、HSCAN
Подождите, пока команды вернут данные коллекции в пакетах; - Разделите большие наборы на маленькие, например, по времени, региону и т. д.
Спецификации хранения данных
Разделение горячих и холодных данных
Хотя Redis поддерживает использование моментальных снимков RDB и журналов AOF для сохранения данных, эти два механизма используются для обеспечения гарантий надежности данных, а не для увеличения емкости данных.
Не храните все данные в Redis, они должны храниться в виде кеша.Горячие данные, который может не только в полной мере использовать высокопроизводительные функции Redis, но и использовать драгоценные ресурсы памяти для обслуживания горячих данных.
Изоляция бизнес-данных
Не помещайте все несвязанные службы данных в один Redis. С одной стороны, он позволяет избежать бизнес-взаимодействия, а с другой стороны, позволяет избежать расширения одного экземпляра и может уменьшить влияние и быстро восстановиться в случае сбоя.
Установить срок действия
При сохранении данных я рекомендую вам установить время истечения срока действия данных в соответствии с продолжительностью использования данных в вашем бизнесе.
Данные, записываемые в Redis, всегда будут занимать память. Если данные продолжают увеличиваться, они могут достичь верхнего предела памяти компьютера, что приведет к переполнению памяти и сбою службы.
Управление объемом памяти одного экземпляра
Рекомендуется установить его в диапазоне от 2 до 6 ГБ. Таким образом, будь то моментальный снимок RDB или синхронизация данных между ведущим и подчиненным кластерами, ее можно выполнить быстро, не блокируя обработку обычных запросов.
Предотвращение лавин кеша
Избегайте лавин кеша, вызванных централизованными ключами с истекшим сроком действия.
Код брат, что такое лавина кеша?
Когда в определенный момент происходит крупномасштабная инвалидация кеша, большое количество запросов будет напрямую попадать в базу данных, что приведет к огромному давлению на базу данных.В случае высокого параллелизма база данных может быть отключена в одно мгновение.
Спецификации по эксплуатации и техническому обслуживанию
- Используйте кластер Cluster или кластер Sentinel для достижения высокой доступности;
- Экземпляр задает максимальное количество подключений, чтобы предотвратить чрезмерную нагрузку на экземпляр и влияние на производительность чрезмерных клиентских подключений.
- Не включайте AOF или включите AOF и настройте его на обновление диска каждую секунду, чтобы дисковый ввод-вывод не замедлял производительность Redis.
- Установите разумный repl-backlog, чтобы уменьшить вероятность полной синхронизации master-slave.
- Установите разумный лимит клиентского выходного буфера подчиненного устройства, чтобы избежать прерывания репликации ведущий-ведомый.
- Установите соответствующую стратегию ликвидации памяти в соответствии с реальным сценарием.
- Работайте с Redis, используя пул соединений.
Наконец, добро пожаловать, чтобы поделиться своими часто используемыми спецификациями использования в области сообщений, и мы будем общаться и обсуждать вместе.
Хорошая статья рекомендуется
Redis Persistence: как AOF и RDB обеспечивают высокую доступность данных
Redis High Availability: Принцип синхронизации согласованности данных в архитектуре Master-Slave
Высокая доступность Redis: принцип кластера Sentinel
Высокая доступность Redis: принцип кластера кластера
Redis Actual Combat: осознание того, что люди поблизости встречают богиню с помощью геотипа
Новые возможности Redis: интерпретация модели многопоточности
Новые возможности Redis 6.0: революция, вызванная кэшированием на стороне клиента