博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
flask+redis实现抢购(秒杀)功能
阅读量:6988 次
发布时间:2019-06-27

本文共 2439 字,大约阅读时间需要 8 分钟。

今天面试了 一家非常高大上的公司,问了我关于redis的实用性问题,但是答的不是很好,所以下午通过再次学习 redis,实现相关实用性功能的一种。

 

对于抢购功能,难点在于 抢购时 由于高并发请求,导致一个用户抢购多件商品,库存量小于订单量的情况。

如下通过redis的hash和list类型实现相关功能。

思路:

hash:主要用来存储用户抢购成功的信息,因其自身的特性,如果hash的key,val重复,会返回0,从而判断一个用户只能抢购一个商品。

list:主要用来存放商品,在每个请求进来时,从list中pop一个商品,这样做到针对redis(货物)做到单线程(无论并发多少个请求)。

整体思路:利用hash的不可重复特性和list, 在请求进来时从list中pop一个商品,然后添加到hash中,如果添加失败,就再次push一个商品到list中。

 

from flask import Flask, requestfrom flask.views import MethodViewapp = Flask(__name__)REDIS_CONF = {    'host': '127.0.0.1',    'port': 6379,    'db': 1}app.config.update({
'REDIS_CONF': REDIS_CONF})from redis import StrictRedisimport randomREDIS = StrictRedis(**REDIS_CONF)class GetGoods(MethodView): def post(self): uid = random.randint(1, 10) if REDIS.lpop('goods_list'): if REDIS.hset('user_list', uid, 1): print(f'Success,{uid}') return f'Success,{uid}' else: # 不可重复抢(每人限领一个) print(f'push ,{uid}') REDIS.lpush('goods_list', 1) return f'create a user {uid}' else: # 已抢完 print('Finsh!') return 'Finsh!' def get(self): user_list = REDIS.hgetall('user_list') user_list_len = REDIS.hlen('user_list') goods_list = REDIS.llen('goods_list') result_dict = {
"user_list": user_list, "user_list_len": user_list_len, 'goods_list': goods_list} print(result_dict) return 'success!'class SendGoods(MethodView): def post(self): count = request.form.get('count') if REDIS.exists('goods_list'): print('delet exists goods') REDIS.delete('goods_list') for item in range(int(count)): REDIS.lpush('goods_list', 1) REDIS.delete('user_list') goods_list = REDIS.lrange('goods_list', 0, count) return f'send goods success! {goods_list}'# 用户抢购接口app.add_url_rule('/goods', view_func=GetGoods.as_view('goods'), methods=['POST'])# 商家查看商品抢购结果app.add_url_rule('/goods', view_func=GetGoods.as_view('get_goods'), methods=['GET'])# 商家发布商品app.add_url_rule('/send/goods', view_func=SendGoods.as_view('send_goods'), methods=['POST'])app.run(host='127.0.0.1', port=8000, threaded=10, debug=True)

 

通过postman测试:

先执行  商家发布商品 接口,发送100个商品。

然后并发压力测试  商家查看商品抢购结果 接口。

然后执行 商家查看商品抢购结果 接口得到如下结果:

发布100个商品,只有10个人抢购1000此,结果做到了每人一个商品,剩下90个商品。

 

转载于:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_836days.html

你可能感兴趣的文章
React 概要
查看>>
Centos 7 系统安装完毕修改网卡名为eth0
查看>>
centos7配置mysql的主从复制
查看>>
Oracle数据库日常维护
查看>>
安卓显示添加图片后运行报错
查看>>
如何解决linux下apache启动时httpd: apr_sockaddr_info_get() failed for 报错
查看>>
Scala入门第一天
查看>>
js 利用iframe和location.hash跨域解决办法,java图片上传回调JS函数跨域
查看>>
在CentOS 6 上安装Zabbix2.0.5
查看>>
GRUB应用
查看>>
数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
查看>>
绝密:三步教你轻松窃取VMware虚拟机及其数据
查看>>
OpenResty(nginx扩展)实现防cc***
查看>>
Vim Buffer缓冲区:多文件编辑方案
查看>>
Elasticsearch + Kibana 起步
查看>>
如何在 Laravel 中 “规范” 的开发验证码发送功能【社交系统ThinkSNS研发日记十一】...
查看>>
北航 2012 秋季 现代软件工程 两人结对 作业要求
查看>>
Linux基本命令
查看>>
MySQL 使用lvm 快照备份
查看>>
我的友情链接
查看>>