测试环境

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

转载于:https://juejin.im/post/5be174b8f265da614c4c44e3

Python版:实现双十一秒杀,防止超限相关推荐

  1. Python版中秋佳节月饼抢购脚本

    文章目录 申明 前言 原理 安装 Selenium 方式1 方式2 安装浏览器驱动 下载 配置环境变量 代码开发 测试 注意 申明 本博客不提供任何服务器端程序,也不提供任何收费抢购软件. 该博客仅用 ...

  2. 【Leetcode】刷题之路3(python版)

    回溯专题 1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度. 2.回溯算法三部曲 确定参数和返回值 回溯函数终止条件 单层循环 3.回溯法思路 回溯法是一种算法思想,而递归是一种 ...

  3. 统计学习圣经!经典教材《统计学习导论》Python版

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 编辑:张倩,来源:机器之心 <统计学习导论>很经典,但习题用 ...

  4. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

  5. 经典教材《统计学习导论》现在有了Python版

    来源:机器之心 本文约1000字,建议阅读5分钟 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实现. 斯坦福经典教材<The Element o ...

  6. 赞!经典教材《统计学习导论》终于有Python版了

    <统计学习导论>是数据科学家中最受欢迎的书籍之一,旨在介绍机器学习算法背后的概念,但这本书的习题都是用R语言实现的,这对于主要使用 Python 语言的机器学习研究者来说不太友好. 为了解 ...

  7. Manning大神牵头,斯坦福开源Python版NLP库Stanza:涵盖66种语言

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自:机器之心 对于斯坦福 NLP 库,我们一定不会陌生,但是这一库主要基于 Java ...

  8. 【重磅】Python版《统计学习导论》来啦!附代码链接!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要5分钟 Follow小博主,每天更新前沿干货 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实 ...

  9. 【重磅来袭】斯坦福开源Python版NLP库Stanza:涵盖66种语言!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 对于斯坦福 NLP 库,我们一定不会陌生,但是这一库主要基于 Java.近日,Ch ...

  10. 火星坐标、百度坐标、WGS84坐标转换代码(JS、python版)

    火星坐标.百度坐标.WGS84坐标转换代码(JS.python版) 一.JS版本源码 github:https://github.com/wandergis/coordTransform /*** C ...

最新文章

  1. 高手教你PHP上传多张图片
  2. Python 常用 PEP8 编码规范和建议
  3. ASP.Net MVC——使用 ITextSharp 完美解决HTML转PDF(中文也可以)
  4. Go语言字符串和正则表达式
  5. 白色裤子为什么会沾上蓝色_什么是蓝色的,为什么它可以在Mac上运行?
  6. 搭建基于.NetFrameWork的私有nuget服务端及打包项目发布上传
  7. plot画分段函数_python画图函数大全
  8. 嵌入式 IOT 汽车 航空 AI 领域从IP到片上系统SOC信息检索网站 DR
  9. 与c++ 进行最简单的进程通信
  10. 统计文件中以某个字母开头的单词的数目
  11. python数字保留两位_Python 鲜为人知的数值格式化
  12. C++ string , int 之间相互转换
  13. 无线网络中终端设备接入过程
  14. Xgboost和lightgbm的区别
  15. cisco 交换机 获取 转发表_看完这份1113页的TCP/IP协议+路由与交换机,成功上岸字节跳动...
  16. 直接选择排序算法时间 / 空间复杂度
  17. Java读取文件的四种方式
  18. AABB包围盒和OBB包围盒区别
  19. 10 QT - 自定义信号和槽
  20. P2123皇后游戏+P1080国王游戏

热门文章

  1. Atitit 设计模式之道 艾提拉著 sbb 目录 1. 一、设计模式的分类 1 1.1. 总体来说设计模式分为三大类: 1 1.2. 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建
  2. Atitit  Persistence API持久性标准化法总结 目录 1. 持久性对于大多数企业应用程序都非常要害 1 2. 持久化api内容 2 2.1. 一种声明式地执行O-R映射的方式。 2
  3. Atitit 短信验证的漏洞 目录 1.1. APP读取短信 1 1.2. 手机上访问的业务来说,短信验证码就没那么独立了 1 1.3. 短信保管箱” 1 1.4. 自动把短信备份到云端的功能。 2
  4. Atitit 技术成果有哪些 1. 技术成果 1 2. 技术成果分类 2 2.1. 职务技术成果和非职务技术成果 2 2.2. 专利技术成果和非专利技术成果 2 3. 范例代码项目 与代码片段 2
  5. Atitit q2016 q4 doc list on home ntpc.docx
  6. Atitit 软件与互联网理论 attilax总结
  7. Atitit js canvas的图像处理类库attilax总结与事业
  8. Atitit sift匹配度计算 图片连线 oepncv sift java匹配
  9. atitit  opencv apiattilax总结 约500个函数 .xlsx
  10. ClickHouse:A股分钟数据的查询速度的测试[下]