今天面試了 一家非常高大上的公司,問了我關於redis的實用性問題,但是答的不是很好,所以下午通過再次學習 redis,實現相關實用性功能的一種。
對於搶購功能,難點在於 搶購時 由於高併發請求,導致乙個使用者搶購多件商品,庫存量小於訂單量的情況。
如下通過redis的hash和list型別實現相關功能。
思路:hash:主要用來儲存使用者搶購成功的資訊,因其自身的特性,如果hash的key,val重複,會返回0,從而判斷乙個使用者只能搶購乙個商品。
list:主要用來存放商品,在每個請求進來時,從list中pop乙個商品,這樣做到針對redis(貨物)做到單執行緒(無論併發多少個請求)。
整體思路:利用hash的不可重複特性和list, 在請求進來時從list中pop乙個商品,然後新增到hash中,如果新增失敗,就再次push乙個商品到list中。
from flask import通過postman測試: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 =
(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)
先執行 商家發布商品 介面,傳送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 會...