просмотреть оглавление
- Бизнес-сценарий |Синхронная реализация seckill: практика Redis в функции seckill
- Шаблоны проектирования |Понимание шаблонов проектирования в одном предложении
- Apache SkyWalking | Продвинутый геймплей SkyWalking
- Apache SkyWalking | Практика разработки Java-плагинов SkyWalking
- Распределенное планирование заданий |Распределенная операционная платформа Lianjia (рекомендовано автором)
Использование Redis в сценариях всплеска ресурсов
Обзор бизнеса
- Ресурсы мгновенного убийства: Еженедельные ресурсы.
- На каждой странице будут ресурсы seckill, от 1 до 8 копий, которые будут отображаться посетителям в случайном виде.
- Цена еженедельных пиковых ресурсов рассчитывается и оценивается отделом данных, и нет времени для панической покупки, например: 10:00 каждую среду. Количество покупок покупателем может быть любым количеством оставшихся ресурсов seckill.
- Наличие у покупателя права расхватывать ресурсы seckill определяется информацией о пользовательском интерфейсе, информацией об учетной записи и другими интерфейсами разрешений.
- Способ оплаты покупателя использует интерфейс оплаты. Система генерирует зашифрованную информацию о срочном платеже покупателя, переходит на страницу оплаты, а затем асинхронно возвращается к интерфейсу оплаты, чтобы определить, была ли покупка успешной. Если покупка не удалась, тебе надоСвоевременный возврат к запасам ресурсов seckill, для других, чтобы купить.
Бизнес-процесс
Лента новостей | бизнес | Примечания к узлу процесса |
---|---|---|
в понедельник | Создание данных о ресурсах | Процесс ① |
Среда до 10:00 | проверитьДанные о ресурсах | Процесс ② |
Среда 10:00 | Покупатели seckill ресурсы seckill | Процесс ③ |
Среда после 10:00 | Возврат денег покупателем | Процесс 4 |
Воскресенье | Спрос на ресурсы на этой неделе закончился, и создается информация для отображения в экстрасети. | Процесс⑤ |
Описание узла Redis
- Универсальный Redis: используется для SSO для унифицированного входа в систему и функций, отличных от seckill.
- Кэш Redis: используется для хранения данных о прогреве покупателя и захвата кеша этой информации запроса.
- Core Redis: Ответственный за инвентаризацию ресурсов Оставшееся количество, Spike Spike Resource Sevure и т. Д. Основная реализация бизнеса,Стратегия lru redis должна быть закрыта, а программа управляет устранением ключей в памяти.
Сведения об использовании Redis
-
Процесс разогрева кэш-памяти данных ①② (стратегия снижения количества молока)
-
ключевой псевдокод
cacheRedis.setex(key,EXPIRE_TIME_7D,info);
-
Пиковое значение seckill qps составляет около 1w, но более 60% запросов qps приходятся на метод списка запросов, поэтому необходимо увеличить кеш покупаемых ресурсов seckill.
-
ключевой псевдокод
生成rediskey, objects包括ucid、用户输入入参、分页信息等等 public static String builder(String prefix, Object... objects) { String input = JSONObject.toJSONString(Arrays.asList(objects)); String output = Util.md5_16(input); return prefix+output; } cacheRedis.setex(key,EXPIRE_TIME_2S,info);
-
Преимущества дизайна: используйте spring-data-redis для сериализации входных параметров в виде объектов... а затем сжимайте JsonString Md5 до битов 16. Это в основном потому, что в начале всплеска будет большой объем данных списка кеша в данных Redis, а Redis хранит 100 Вт. Когда длина значения составляет 32 бита, а длина ключа — 16 бит, необходимо использовать 130 МБ памяти.Если длина ключа составляет 32 бита, требуется около 160 МБ памяти, поэтому необходимо сжать длину ключа в этом сценарии.
-
-
Основной процесс всплеска ресурсов Redis-Seckill ③
-
Каждый ресурс seckill имеет собственную очередь для завершения seckill с несколькими очередями и небольшой длиной очереди.
-
ключевой псевдокод
String key = PURCHASING_PRODUCT + productId; Long count = coreRedis.llen(key); 判断count是否大于库存 判断count+用户欲购买秒杀资源数量(share)是否大于库存 String[] values = (uuid+uid) * share; if (inventory - coreRedis.lpush(key, values)) < 0) { coreRedis.lrem(key, share, values); } 例如:id:1 秒杀资源有3份流量的库存, 当llen时发现秒杀资源在redis中没有数据, 购买者20xxxxx1想买此资源3份流量, 这时lpush后发现超卖,lrem退回库存。 redis 127.0.0.1:6379> lrange XX_PRODUCT_1 0 -1 1) "jali7xz20xxxxx1" 2) "3whsh6b20xxxxx2" 3) "3whsh6b20xxxxx2" 4) "3whsh6b20xxxxx2"
-
Преимущества дизайна: временная сложность основных команд llen и lpush составляет O(1),Временная сложность lrem равна O(N), а сложность, указанная официальным lrem, равна O(N), но я думаю, что сложность lrem в этом сценарии использования должна быть бесконечно близка к O(count), но инкапсулирует операцию компенсации как атомарную и поддерживает многократное идемпотентное выполнение. Я также думал об использовании некоторых getset, setnx, конвейера, инвентаризации кеша в очередь, а затем всплывающих окон, транзакций и т. Д., Чтобы добиться мгновенного уничтожения. Но ни производительность, ни надежность в этом сценарии не так хороши, как в приведенных выше конструкциях, иТаким образом, если платеж не проходит или запрос не оплачивается, порядок очереди ресурсов становится немедленно идемпотентным, и другие покупатели, имеющие право на покупку, могут продолжать покупать.
-
Использование Redis в Интернете
- Кэш Redis (адрес источника изображения: github)
- ядро редис
Сводка по использованию Redis
- Используя архитектуру Redis с одним ведущим и одним ведомым устройством, а также rdb в качестве стратегии резервного копирования, нет проблем с QPS ниже 8W (первая фаза второго уничтожения ресурса, без разделения нагрузки Redis на несколько баз данных и без оптимизировано использование до 5W QPS, нет связи с тайм-аутом или ресурсы пула соединений не могут быть получены,Также связано с отказом от транзакций и использованием несложных реализаций команд.)
- Как и кэш страницы списка, не помещайте каждый столбец базы данных в redis, чтобы уменьшить накладные расходы redis, а запрашивайте сводку в redis, например: каждый ресурс seckill помещается в redis, а странице ресурса seckill требуется 10 ссылки redis для завершения сборки страницы списка. Это приведет к геометрическому расширению qps сервера до qps redis, так что система не сможет получить ресурсы соединения redis.
- Если Redis используется только для кэширования данных и преследуется максимальная производительность, главный узел может отключить моментальные снимки памяти и ведение журнала, а подчиненный узел завершит их.
- Пакетные команды для снижения QPS можно заменить скриптами Redisson, Lettuce или lua.