flask redis實現搶購(秒殺)功能

2022-05-05 15:09:14 字數 2644 閱讀 1817

今天面試了 一家非常高大上的公司,問了我關於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

methodview

)redis_conf =

'redis_conf

': redis_conf})

from redis import

strictredis

import

random

redis = strictredis(**redis_conf)

class

getgoods(methodview):

defpost(self):

uid = random.randint(1, 10)

if redis.lpop('

goods_list'):

if redis.hset('

user_list

', uid, 1):

print(f'

success,')

return f'

success,

'else

:

#不可重複搶(每人限領乙個)

print(f'

push ,')

redis.lpush(

'goods_list

', 1)

return f'

create a user

'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 =

print

(result_dict)

return

'success!

'class

sendgoods(methodview):

defpost(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

', view_func=getgoods.as_view('

goods

'), methods=['

post'])

#商家檢視商品搶購結果

/goods

', view_func=getgoods.as_view('

get_goods

'), methods=['

get'])#

商家發布商品

/send/goods

', view_func=sendgoods.as_view('

send_goods

'), methods=['

post'])

127.0.0.1

', port=8000, threaded=10, debug=true)

通過postman測試:

先執行  商家發布商品 介面,傳送100個商品。

然後併發壓力測試  商家檢視商品搶購結果 介面。

然後執行 商家檢視商品搶購結果 介面得到如下結果:

發布100個商品,只有10個人搶購1000此,結果做到了每人乙個商品,剩下90個商品。

php結合redis實現高併發下的搶購 秒殺功能

搶購 秒殺是如今很常見的乙個應用場景,主要需要解決的問題有兩個 1 高併發對資料庫產生的壓力 2 競爭狀態下如何解決庫存的正確減少 超賣 問題 對於第乙個問題,已經很容易想到用快取來處理搶購,避免直接運算元據庫,例如使用redis。重點在於第二個問題 優化方案1 將庫存欄位number欄位設為uns...

js 搶購倒計時,豪秒級變動

上面是效果圖,時 間 差 需要計算出時間差 使用setinterval重複計算,每100毫秒變動一次 function endtime new date settings.endtime el settings.el instanceof htmlelement settings.el docume...

搶購功能的實現 PHP MySQL

搶購功能的實現 php mysql 鄧強 本文 業務背景 某公司開展活動,4個實體店,每天限量發放10個優惠券,供人們搶購。技術分析 一旦涉及搶購,必然會引起併發問題,而且還盡量保證程式的併發性,這就要求或者在程式中做同步,或者在資料庫層次做同步。一般來說,在程式端做同步 synchronize 會...