redis 优惠券秒杀逐步优化
根據redis set nx實現分布式鎖,防止同一用戶多次請求引起的多個線程同時下單,同時保證分布式系統下也不能同時下單,根據用戶創建唯一key,然后進行加鎖,設置鎖過期時間,防止運行過程中出現意外錯誤導致的死鎖問題,釋放鎖的時候也添加的判斷邏輯,判斷是否釋放的是當前線程加的鎖,只有當前線程添加的鎖才會被釋放,由于判斷從redis中獲取判斷結果和在java當前線程下判斷結果的非原子性,使用lua腳本解決釋放鎖的時候出現的并發安全問題,保證原子性。
同時redis集群能夠保證改鎖的高可用性和高并發性。
基于樂觀鎖解決庫存超賣問題。
setnx不可重入,不能重試(獲取鎖只嘗試一次),超時釋放(如果執行時間過長也會釋放),主從一致性問題
redission Redis的基礎上實現的Java駐內存數據網格, 提供了分布式服務
可重入鎖利用hash結構記錄線程id和重入次數
利用watchdog監控線程,每隔一段時間重置超時等待時間
重試利用信號量等待喚醒,獲取鎖失敗進入等待,當有其他線程釋放鎖的時候再喚醒
(在這里可以關聯java并發編程)。
多個獨立節點必須都獲得鎖才算成功。
把庫存預先存入redis,通過lua腳本進行秒殺操作的同時保證操作原子性,并且記錄用戶id信息,通過消息隊列將訂單信息,庫存異步存入數據庫,削峰。
,使用
壓測1000個線程同時訪問等待時間變為原來2/5,從507-216,吞吐量1.4倍
使用stream消息隊列110 1577
阻塞隊列BlockingQueue,解除耦合
內存溢出阻塞隊列內存限制,數據安全問題,丟失任務
List消息隊列,持久化,利用Redis存儲,不是用jvm內存,不直接,解決不了消息丟失問題,只支持單消費者
pubsub可以被多個消費者消費,不支持數據持久化,消息堆積有上限,緩存在消費者,jvm內存溢出
XREAD存在漏讀風險,單消費者模式
基于Stream消費者組,讀一個消息確認一個消息,從pendinglist中能獲取到為確認的消息,支持多消費者,
消息確認機制消息回溯
Stream 不能保證萬無一失,不支持生產者發送消息,消息的事務機制
總結
以上是生活随笔為你收集整理的redis 优惠券秒杀逐步优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++基础:模板,函数模板和类模板
- 下一篇: JDBC与ODBC的区别与应用