Interpretação do negócio de pico: como o Redis ajuda o sistema de pico de alta simultaneidade e resolve perfeitamente o problema de venda excessiva

Spike business

No campo do e-commerce, existem cenários de negócios típicos de pico, então, o que é um cenário de pico? Simplificando, o número de compradores de um produto é muito maior do que o estoque do produto, e o produto será vendido em um curto período de tempo. Por exemplo, cenários de negócios como a promoção anual 618, Double 11 big e a promoção de novos produtos da Xiaomi são cenários típicos de negócios de pico.

A maior característica do negócio de pico é o alto tráfego simultâneo instantâneo. No sistema de e-commerce, a quantidade de estoque é frequentemente muito menor do que o tráfego simultâneo. Por exemplo: a atividade de pico de Tmall pode ter apenas algumas centenas ou milhares de itens em estoque e o influxo deles instantaneamente As compras simultâneas podem atingir dezenas a milhões de tráfego.

Portanto, podemos resumir as características de negócios do sistema de spikes da seguinte maneira.

Insira a descrição da imagem aqui

Amigos que precisam de mais conhecimento de Java e perguntas para entrevistas podem clicar no link abaixo para obtê-lo gratuitamente

Link: 1103806531 Senha: CSDN

Insira a descrição da imagem aqui

(1) Tempo limitado, quantidade limitada, limite de preço

No tempo especificado; a quantidade de produtos na atividade de pico é limitada; o preço dos produtos será muito menor do que o preço original, ou seja, na atividade de pico, os produtos serão vendidos a um preço muito inferior ao preço original.

Por exemplo, o horário da atividade de pico é limitado às 10h00 às 10h30 de um determinado dia, a quantidade de mercadorias é de apenas 100.000 peças e o preço das mercadorias é muito baixo, como: compra de 1 yuan e outros cenários de negócios.

Limite de tempo, limite e preço podem existir sozinhos ou em combinação.

(2) Atividades de pré-aquecimento

O evento deve ser configurado com antecedência; antes do início do evento, os usuários podem visualizar as informações relacionadas ao evento; antes do início do evento de pico, o evento será promovido vigorosamente.

(3) Curta duração

O número de pessoas comprando é enorme; os produtos se esgotarão rapidamente.

Na apresentação do tráfego do sistema, haverá um fenômeno de pico repentino. Neste momento, o número de visitas simultâneas é muito alto. Na maioria dos cenários de pico, as mercadorias se esgotarão em um período muito curto.

Três pontas

Normalmente, do início ao fim do pico, geralmente existem três estágios:

  • Estágio de preparação: este estágio também é chamado de estágio de aquecimento do sistema. Nesse momento, os dados de negócios do sistema de pico serão aquecidos com antecedência. Nesse momento, os usuários atualizarão constantemente a página de pico para verificar se a atividade de pico foi iniciada. Até certo ponto, alguns dados podem ser armazenados no Redis para pré-aquecimento por meio da operação de atualização contínua da página do usuário.
  • Fase de pico: Esta fase é principalmente o processo de atividade de pico, que irá gerar tráfego simultâneo alto instantâneo, o que terá um grande impacto nos recursos do sistema, portanto, a proteção do sistema deve ser feita na fase de pico.
  • Estágio de liquidação: processamento de dados após a conclusão do pico, como processamento de problemas de consistência de dados, processamento de situação anormal e processamento de devolução de mercadoria.

Redis ajuda o sistema de spike

Podemos projetar uma estrutura de dados Hash no Redis para dar suporte à dedução do estoque de commodities, conforme mostrado abaixo.

seckill:goodsStock:${
    
    goodsId}{
    
    
    totalCount:200,
    initStatus:0,
    seckillCount:0
}

Na estrutura de dados Hash que projetamos, existem três atributos principais.

  • totalCount: indica o número total de produtos que participam do pico. Antes do início da atividade de pico, precisamos carregar esse valor no cache do Redis com antecedência.
  • initStatus: projetamos esse valor como um valor booleano. Antes de o pico começar, este valor é 0, o que significa que o pico não começou. Você pode modificar esse valor para 1 por meio de tarefas cronometradas ou operações em segundo plano para indicar que o pico começa.
  • seckillCount: Indica a quantidade de produtos que são seckados.Durante o processo de seckill, o limite superior deste valor é totalCount. Quando este valor atinge totalCount, significa que o seckill do produto foi concluído.

Podemos usar o seguinte snippet de código para armazenar em cache o carregamento de dados do produto que participará do pico na fase de pré-aquecimento do pico.

/**
 * @author binghe
 * @description 秒杀前构建商品缓存代码示例
 */
public class SeckillCacheBuilder{
    
    
    private static final String GOODS_CACHE = "seckill:goodsStock:"; 
    private String getCacheKey(String id) {
    
     
        return  GOODS_CACHE.concat(id);
    } 
    public void prepare(String id, int totalCount) {
    
     
        String key = getCacheKey(id); 
        Map<String, Integer> goods = new HashMap<>(); 
        goods.put("totalCount", totalCount); 
        goods.put("initStatus", 0); 
        goods.put("seckillCount", 0); 
        redisTemplate.opsForHash().putAll(key, goods); 
     }
}

Quando o pico começa, precisamos primeiro determinar no código se o valor seckillCount no cache é menor que o valor totalCount. Se o valor seckillCount for realmente menor que o valor totalCount, podemos bloquear o inventário. Em nosso programa, essas duas etapas não são realmente atômicas. Se, em um ambiente distribuído, utilizarmos várias máquinas para operar o cache do Redis ao mesmo tempo, ocorrerão problemas de sincronização, o que acarretará sérias consequências de "sobrevenda".

No campo do e-commerce, existe um termo profissional denominado "oversold". Como o nome indica: "Oversold" significa que o número de produtos vendidos é maior do que o número de produtos em estoque, o que é um problema muito sério no campo do comércio eletrônico. Então, como podemos resolver o problema do "excesso de vendas"?

O script Lua resolve perfeitamente o problema de sobrevenda

Como resolvemos o problema de sincronização de várias máquinas operando o Redis ao mesmo tempo? Uma solução melhor é usar scripts Lua. Podemos usar scripts Lua para encapsular a operação de dedução de estoque no Redis em uma operação atômica, de modo que a atomicidade da operação possa ser garantida, resolvendo assim o problema de sincronização em um ambiente de alta concorrência.

Por exemplo, podemos escrever o seguinte código de script Lua para realizar a operação de dedução de estoque no Redis.

local resultFlag = "0" 
local n = tonumber(ARGV[1]) 
local key = KEYS[1] 
local goodsInfo = redis.call("HMGET",key,"totalCount","seckillCount") 
local total = tonumber(goodsInfo[1]) 
local alloc = tonumber(goodsInfo[2]) 
if not total then 
    return resultFlag 
end 
if total >= alloc + n  then 
    local ret = redis.call("HINCRBY",key,"seckillCount",n) 
    return tostring(ret) 
end 
return resultFlag

Podemos usar o seguinte código Java para chamar o script Lua acima.

public int secKill(String id, int number) {
    
     
    String key = getCacheKey(id); 
    Object seckillCount =  redisTemplate.execute(script, Arrays.asList(key), String.valueOf(number)); 
    return Integer.valueOf(seckillCount.toString()); 
}

Dessa forma, quando executamos a atividade de pico, podemos garantir a atomicidade da operação, evitando assim efetivamente problemas de sincronização de dados e resolvendo efetivamente o problema de "sobrevenda".

Resumindo

Compilei vários pontos de conhecimento, módulos, documentos e perguntas de entrevistas mais reais de grandes empresas. Amigos necessitados podem clicar no link abaixo para obtê-los gratuitamente

Link: 1103806531 Senha: CSDN

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_48655626/article/details/109223584
Recomendado
Clasificación