Frasco + Redis + mq logran alta concurrencia

Prueba independiente de frascos, realizar redis + MQ spike business, evitar desbordamientos

Breve descripcion

La compra de pánico y el pico son escenarios de aplicación muy comunes en los negocios de centros comerciales. Las principales necesidades se resuelven: 

1. Alta concurrencia 

2. Cómo resolver la reducción correcta de inventario (problema de "sobreventa")

La descripción del comando Redis existe> setnx> incrby

# (1) Establezca algunos parámetros 
    # Limite el número total de inventario de bienes 
    amount_limit = 1000 
    # Establezca el nombre de la clave de caché en redis keyname 
    = 'limit' 
    # incrby Configuramos automáticamente el número de cada aumento a 1 
    incr_amount = 1 
    # (2) Juez redis Si tenemos nuestro nombre de clave, es decir, la construcción de bienes de inventario a 
    través de r.exists () 
  

  # Probar que establecemos el valor inicial de la cantidad de inventario en 0 
  # setnx >>> puede evitar establecer la clave varias veces durante la concurrencia 
  r.setnx (keyname, 0) # Valor inicial 0 
  # Juicio del número de aumento automático y el número de inventario 
  incr_num = r.incrby (keyname, incr_amount)

 Código de prueba

de importación matraz Flask 
registro de importación 
de los manipuladores de importación de registro 
importar redis 

#添加日志

rf_handler = handlers.TimedRotatingFileHandler ( 
    'redis.log', cuando = 'medianoche', intervalo = 1, 
    backupCount = 7) 
rf_handler.setFormatter ( 
    logging.Formatter ( 
        " % (asctime) s% (filename) s línea:% (lineno) d [% (levelname) s]% (message) s ") 
) 

logging.getLogger (). setLevel (logging.INFO) 
logging.getLogger (). addHandler (rf_handler) 

app = Flask (__ name__) 

# red 我们 的 redis connect redis 
pool = redis.ConnectionPool (host = 'localhost', port = 6379, 
                            decode_responses = True) 
r = redis.Redis (connection_pool = pool)


# Opere el método para leer el inventario del producto 
# redis.get (store_shop) 
# Para un ejercicio simple, definimos nuestro propio parámetro personalizado 

def limit_handler (): 
    "" " 
    : return True: permitido; False: rechazado 

    " "" 
    # (1) Establezca algunos parámetros 
    # Limite el número total de productos en stock 
    amount_limit = 1000 
    # Establezca el nombre de la clave de caché en redis keyname 
    = 'limit' 
    # incrby Aumentamos automáticamente el número de cada vez que establecemos en 1 
    incr_amount = 1 
    # (2) Determine si existe el nuestro en redis el nombre de la clave es la construcción de 

    artículos en existencia si no existe r.existe (nombre clave): 
        "" " 
        # Probar que establecemos el valor inicial del inventario en 0 
        # setnx >>> puede evitar que la clave   

        " "" 
        r.setnx ( nombre clave0) # Valor inicial 0 

        # Después de que los datos se insertan en redis, se juzga si es mayor que el número límite 
    # Juicio del número de aumento automático y el número de inventario
    incr_num = r.incrby (keyname, incr_amount) 
         intente:

    if incr_num <= amount_limit: 


        "" " Guardar en 
        caché la información del producto para volver a redistribuir: user_id order_id price 
        Crear el número de pedido del producto 
        def post (self, request, * args, ** kwargs): 
        # 1) Obtenga la información de recepción: producto , Precio, método de pago 
        request_data = request.data 
        subject = request_data.get ('subject') 
        total_amount = request_data.get ('total_amount') 
        pay_type = request_data.get ('pay_type') 
        si no (subject y total_amount y pay_type): 
            return APIResponse (2, 'Datos incorrectos') 
        # 2) Generar orden (número de orden, registro de orden en forma de orden) 
        out_trade_no = str (time.time ())
            user_obj = models.Order.objects.create (subject = subject, total_amount = total_amount, pay_type = pay_type, 
            notify_url = settings.NOTIFY_URL 
        ) 
        order_url = pay_url + order_string
                                        out_trade_no = out_trade_no, user = user) 
            print (user_obj, 'order999') 
         excepto: 
            return APIResponse (1, '订单 生成 失败') 
        # 3) 生成 支付 链接 , 并 返回
        order_string = alipay.api_alipay_trade_page_pay ( 
            out_trade_no = 
            out_trade_ = total_amount, 
            subject = subject, 
            return_url = settings.RETURN_URL, 
        return APIResponse (order_url = order_url) 
        "" " 
        # out_trade_no 
        # 条件 有限
        import time 
        out_trade_no = str (time.time ())
        return True # Normalmente el pedido se genera >>> guardar información del producto >>> llame a alipay para ir a la página >> "》 MQ escribir cola para escribir datos 
    return False 


@ app.route ('/ home') 
def Iniciar sesión ( ): 
    devuelve 'ok' 


@ app.route ('/ kill') 
def hot (): 

    if limit_handler (): 

        logging.info ("exitoso") 
        devuelve ' 
        Envío de pedido exitoso' 
    más: logging.info ("falló") 

        devolver "Producto agotado" 


si __name__ == '__main__': 
    app.run (debug = True)

  

Supongo que te gusta

Origin www.cnblogs.com/mofujin/p/12735545.html
Recomendado
Clasificación