Синхронная реализация seckill: практика Redis в функции seckill

Java

просмотреть оглавление

Использование 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)

cache redis

  • ядро редис

cache redis

Сводка по использованию 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.