flask+redis实现抢购(秒杀)功能
生活随笔
收集整理的這篇文章主要介紹了
flask+redis实现抢购(秒杀)功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天面試了 一家非常高大上的公司,問了我關于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, request from 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 StrictRedis import 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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的flask+redis实现抢购(秒杀)功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我理解消化后的浮点数存储
- 下一篇: 阿里云容器Kubernetes监控(七)