前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flask+redis实现抢购(秒杀)功能

flask+redis实现抢购(秒杀)功能

作者头像
用户1558882
发布2018-11-22 11:41:50
1.8K0
发布2018-11-22 11:41:50
举报
文章被收录于专栏:RgcRgc

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

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

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

思路:

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

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

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

代码语言:javascript
复制
from flask import Flask, request
from flask.views import MethodView

app = 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 random

REDIS = 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个商品。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档