python 秒杀 app_Python版:实现双十一秒杀,防止超限
测试环境ubuntu 16.04
python 3.6.6
redis 3.0.6
简单描述
抢购、秒杀是一个很常见的应用场景,主要需要解决的问题有两个:1 高并发
2 如何解决库存的正确减少("超卖"问题)
redis 命令说明
exists
返回key是否存在
# 原型
EXISTS key [key ...]
# 示例
EXISTS key1
incrby
将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0
# 原型
INCRBY key increment
# 示例
INCRBY mykey 5
setnx
将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写。
# 原型
SETNX key value
# 示例
SETNX mykey "Hello"
流程图
流程要点说明:这里要使用setnx初始化数据,这样可以避免key值遇到并发时被多次set
incrby后才判断是否超限,注意如果amount最大为100, 这里incrby后可能会大于100, 但不影响判断
python代码实现app.py
import logging
from logging import handlers
import redis
from flask import Flask
# 为了方便查看添加日志
rf_handler = handlers.TimedRotatingFileHandler(
'redis.log', when='midnight', interval=1, backupCount=7)
rf_handler.setFormatter(
logging.Formatter(
"%(asctime)s %(filename)s line:%(lineno)d [%(levelname)s] %(message)s")
)
logging.getLogger().setLevel(logging.INFO)
logging.getLogger().addHandler(rf_handler)
app = Flask(__name__)
# connect redis
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
def limit_handler():
"""
return True: 允许; False: 拒绝
"""
amount_limit = 100 # 限制数量
keyname = 'limit' # redis key name
incr_amount = 1 # 每次增加数量
# 判断key是否存在
if not r.exists(keyname):
# 为了方便测试,这里设置默认初始值为95
# setnx可以防止并发时多次设置key
r.setnx(keyname, 95)
# 数据插入后再判断是否大于限制数
if r.incrby(keyname, incr_amount) <= amount_limit:
return True
return False
@app.route("/limit")
def v2():
if limit_handler():
logging.info("successful")
else:
logging.info("failed")
return 'limit'
if __name__ == '__main__':
app.run(debug=True)
简单测试
测试工具 ab安装
sudo apt install apache2-utils测试命令
ab -c 100 -n 200 http://127.0.0.1:5000/limit
# -c表示并发数, -n表示请求数
测试结果通过日志可以看到最多只有5个successful
部署测试
方案: supervisor + gunicorn + gevent安装依赖
apt-get install supervisor
pip install gevent
pip install gunicorn
2.生成配置
echo_supervisord_conf > supervisord.conf
3.修改配置, 在supervisord.conf最后添加
[program:redis-limit]
directory = /home/dong/projects/py ; 程序的启动目录
command = gunicorn -k gevent -w 4 -b 0.0.0.0:5000 app:app ; 启动命令, 使用gevent, 开启4个进程
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
stdout_logfile = /home/dong/projects/py/limit_stdout.log
4.启动supervisor服务
supervisord -c ./supervisord.conf
5.查看supervisor应用
# 如果没有启动可以手动start redis-limit
supervisorctl -c ./supervisord.conf
6.测试
ab -c 100 -n 200 http://127.0.0.1:5000/limit
python 秒杀 app_Python版:实现双十一秒杀,防止超限相关推荐
- 【python初学者日记】selenium初体验——“秒杀商品”、“清空购物车”技能养成记(一)
[python初学者日记]selenium初体验--"秒杀商品"."清空购物车"技能养成记(一) 用python解决"清空购物车".&quo ...
- python+selenium+chrome实现淘宝购物车秒杀自动结算
python+selenium+chrome实现淘宝购物车秒杀自动结算 一.所需环境 二.安装 三.代码 最后run()一把就ok了!! 之前总是想要买aj,但是淘宝店铺每次发售手动抢的时候一般都会被 ...
- 淘集集双十一秒杀活动寄样的问题?
淘集集的双十一秒杀活动,双十一快到了,各大电商平台的双十一都有活动,而淘集集这个新的平台也不例外,双十一秒杀活动在前期的要求不是很高,相对于新手和入驻不久的商家来说,是获取流量和销量好机会,这个时机是 ...
- 双十一秒杀架构模型设计实践!
- 前言 - 秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮 ...
- 双十一秒杀架构模型设计
公众号回复'架构'获取架构师电子书及视频课程 秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题 ...
- python实现秒杀系统_如何设计一个秒杀系统
前言 最近在部门内部分享了原来在电商业务做秒杀活动的整体思路,大家对这次分享反馈还不错,所以我就简单整理了一下,分享给大家参考参考. 业务介绍 什么是秒杀?通俗一点讲就是网络商家为促销等目的组织的网上 ...
- python+selenium实现淘宝双十一自动下单
python+selenium实现淘宝双十一自动下单 思路/工具参考我的另一篇文章python+selenium实现京东秒杀脚本 1. 扫码登录版 # !/usr/bin/env python # 2 ...
- 打造千万级流量秒杀系统第一课 功能需求:秒杀业务背景及前端需求是怎么产生的?
你好,我是易乐天,到 2020 年,我在软件行业已经 10 年了. 我曾经做过 Linux 系统编程相关的工作,积累了许多性能优化方面的经验.后来,我开始做分布式系统的架构设计和实现,特别是项目当中涉 ...
- 秒杀限制人群,如何设计秒杀服务的限流策略?
对于秒杀业务,大家应该比较熟悉了.比如,"某商品原价 1299 元, 双十一整点秒杀价仅 500 元,限量 100 件,先到先得" 等等.通过这段文案我们能够发现,参与秒杀活动商品 ...
最新文章
- Request对象的主要方法有哪些?
- android显示服务器端文件夹,Android上传文件到服务端并显示进度条
- 【论文解读】多视图多示例多标签的协同矩阵分解
- 怎样用c语言写超市管理程序,C语言超市收银管理系统实现程序.doc
- 使用SAP open connector调用第三方系统的API
- 【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp
- C++ 高级篇(二)—— 名空间 (Namespaces)
- vue-cli webpack 引入jquery
- LeetCode 594. Longest Harmonious Subsequence
- c++ n次方函数_高一数学必修一函数知识点总结
- Dubbo源码解读:appendAnnotation [01]
- jQuery中使用data()方法读取HTML5自定义属性data-*实例
- 防止被偷窥和修改 Office文档保护秘笈
- 图解机器学习:人人都能懂的算法原理
- 简述er图的作用_用例图、ER图、功能结构图
- DIY个性家装心得家用电动工具选择
- c语言实现二阶行列式计算,新手作品:行列式计算C语言版
- java8-stream示例
- 如何快速的将PDF文件转换成word?
- SCS【13】单细胞转录组之识别细胞对“基因集”的响应 (AUCell)