测试环境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版:实现双十一秒杀,防止超限相关推荐

  1. 【python初学者日记】selenium初体验——“秒杀商品”、“清空购物车”技能养成记(一)

    [python初学者日记]selenium初体验--"秒杀商品"."清空购物车"技能养成记(一) 用python解决"清空购物车".&quo ...

  2. python+selenium+chrome实现淘宝购物车秒杀自动结算

    python+selenium+chrome实现淘宝购物车秒杀自动结算 一.所需环境 二.安装 三.代码 最后run()一把就ok了!! 之前总是想要买aj,但是淘宝店铺每次发售手动抢的时候一般都会被 ...

  3. 淘集集双十一秒杀活动寄样的问题?

    淘集集的双十一秒杀活动,双十一快到了,各大电商平台的双十一都有活动,而淘集集这个新的平台也不例外,双十一秒杀活动在前期的要求不是很高,相对于新手和入驻不久的商家来说,是获取流量和销量好机会,这个时机是 ...

  4. 双十一秒杀架构模型设计实践!

    -     前言     - 秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮 ...

  5. 双十一秒杀架构模型设计

    公众号回复'架构'获取架构师电子书及视频课程 秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题 ...

  6. python实现秒杀系统_如何设计一个秒杀系统

    前言 最近在部门内部分享了原来在电商业务做秒杀活动的整体思路,大家对这次分享反馈还不错,所以我就简单整理了一下,分享给大家参考参考. 业务介绍 什么是秒杀?通俗一点讲就是网络商家为促销等目的组织的网上 ...

  7. python+selenium实现淘宝双十一自动下单

    python+selenium实现淘宝双十一自动下单 思路/工具参考我的另一篇文章python+selenium实现京东秒杀脚本 1. 扫码登录版 # !/usr/bin/env python # 2 ...

  8. 打造千万级流量秒杀系统第一课 功能需求:秒杀业务背景及前端需求是怎么产生的?

    你好,我是易乐天,到 2020 年,我在软件行业已经 10 年了. 我曾经做过 Linux 系统编程相关的工作,积累了许多性能优化方面的经验.后来,我开始做分布式系统的架构设计和实现,特别是项目当中涉 ...

  9. 秒杀限制人群,如何设计秒杀服务的限流策略?

    对于秒杀业务,大家应该比较熟悉了.比如,"某商品原价 1299 元, 双十一整点秒杀价仅 500 元,限量 100 件,先到先得" 等等.通过这段文案我们能够发现,参与秒杀活动商品 ...

最新文章

  1. Request对象的主要方法有哪些?
  2. android显示服务器端文件夹,Android上传文件到服务端并显示进度条
  3. 【论文解读】多视图多示例多标签的协同矩阵分解
  4. 怎样用c语言写超市管理程序,C语言超市收银管理系统实现程序.doc
  5. 使用SAP open connector调用第三方系统的API
  6. 【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp
  7. C++ 高级篇(二)—— 名空间 (Namespaces)
  8. vue-cli webpack 引入jquery
  9. LeetCode 594. Longest Harmonious Subsequence
  10. c++ n次方函数_高一数学必修一函数知识点总结
  11. Dubbo源码解读:appendAnnotation [01]
  12. jQuery中使用data()方法读取HTML5自定义属性data-*实例
  13. 防止被偷窥和修改 Office文档保护秘笈
  14. 图解机器学习:人人都能懂的算法原理
  15. 简述er图的作用_用例图、ER图、功能结构图
  16. DIY个性家装心得家用电动工具选择
  17. c语言实现二阶行列式计算,新手作品:行列式计算C语言版
  18. java8-stream示例
  19. 如何快速的将PDF文件转换成word?
  20. SCS【13】单细胞转录组之识别细胞对“基因集”的响应 (AUCell)

热门文章

  1. 十三届蓝桥杯单片机组省赛真题程序解析
  2. 释放百万IOPS性能!阿里云数据库下一代存储介质ESSD云盘来了!
  3. 万能适配器BRVAH
  4. hphmon05.exe
  5. 哪些股票值得持有10年?
  6. Python绘制可爱的万圣节南瓜怪,不给糖果就捣乱,
  7. kaldi中的深度神经网络
  8. Python数据可视化 Pyecharts 制作 Line3D 3D折线图
  9. 利用计算机技术网络技术,计算机技术和网络技术在机房管理中的应用研究
  10. 中国高铁-国家标准(TB标准)