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)