在當今快節奏的數位世界中,無縫且可擴展的預訂系統至關重要,尤其是當多個用戶嘗試同時預訂同一時段時。本部落格概述了使用Redis進行分散式鎖定的插槽預訂系統的底層設計,這確保用戶可以在不遇到競爭條件的情況下預訂插槽。透過利用 Redis,我們可以管理並發性和可擴展性,確保我們的預訂系統在高需求下有效運作。
系統的關鍵組件
在深入探討技術方面之前,我們先來分解核心組件:
- 使用者:代表使用系統預約時段的個人。
- Slot:表示使用者可以預約的有時限的單元(例如會議室、活動)。
- Redis 分散式鎖定:確保兩個使用者不能同時預約同一個時段的關鍵功能。
- MongoDB:儲存使用者和插槽資訊。
- Redis:充當鎖定管理器來處理競爭條件。
預訂系統的挑戰
當多個用戶嘗試同時預訂同一時段時,預訂系統很容易陷入重複預訂或競爭條件等問題。如果沒有適當的並發控制,兩個用戶可能會無意中預訂同一個時段,導致沮喪和衝突。
這就是Redis分散式鎖發揮作用的地方。使用鎖定可確保在任何給定時間只有一個用戶可以預訂時段。
1. 模型:定義使用者和插槽
首先,我們需要為使用者和槽設計資料模型。這些模型將儲存在 MongoDB 中,其結構簡單但有效。
一個。 使用者模型
每個使用者都有基本屬性,如姓名、電子郵件和用於驗證的雜湊密碼:
const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('User', UserSchema);
b. 老虎機模型
每個時段都有開始和結束時間,並追蹤是否已被預訂以及由誰預訂:
const mongoose = require('mongoose'); const SlotSchema = new mongoose.Schema({ startTime: { type: Date, required: true }, endTime: { type: Date, required: true }, isBooked: { type: Boolean, default: false }, bookedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', default: null } }); module.exports = mongoose.model('Slot', SlotSchema);
2. API端點:使用者如何與系統交互
API是使用者和系統之間的橋樑。以下是所需的關鍵端點:
一個。 用戶註冊
允許新用戶註冊:
- 端點:POST /api/users/register
- 請求:使用者詳細資料(姓名、電子郵件、密碼)
- 回覆:用戶註冊確認
b. 使用者登入
對使用者進行身份驗證並提供 JWT 令牌:
- 端點:POST /api/users/login
- 請求:使用者憑證(電子郵件、密碼)
- 回應:用於身份驗證的 JWT 令牌
c. 建立插槽
允許管理員或授權使用者建立槽:
- 端點:POST /api/slots/create
- 請求:時段開始與結束時間
- 回應:確認插槽建立
d. 書位
允許用戶預訂可用時段:
- 端點:POST /api/slots/book/:id
- 請求:標頭中的 JWT 令牌,URL 中的插槽 ID
- 回應:時段預訂確認或錯誤(例如,如果時段已預訂)
3.Redis分散式鎖的工作原理
併發是預訂系統面臨的最大挑戰。當多個用戶嘗試同時預訂同一個時段時,Redis 會以其分散式鎖定功能來救援。
使用Redis鎖定的預約流程
-
鎖定取得:
- 當使用者嘗試預訂插槽時,系統會嘗試使用 SET lock_key NX EX 10 指令在 Redis 中取得鎖定。
- NX(如果不存在則設定)確保僅在鎖尚不存在時建立鎖,而 EX 10 確保鎖定在 10 秒後過期(防止死鎖)。
- 如果已經取得了鎖,系統會返回 423 Locked 狀態,通知用戶該插槽已被其他人預訂。
-
插槽可用性檢查:
- 如果成功取得鎖定,則會查詢 MongoDB 以檢查該插槽是否仍然可用(即未預訂)。
- 如果空位可用,系統會將空位的狀態更新為已預訂,並將 bookingBy 欄位設定為目前使用者的 ID。
-
鎖定釋放:
- 一旦預訂程序完成,或發生錯誤,系統會透過使用 DEL lock_key 指令刪除 Redis 金鑰來釋放鎖定。
使用 Redis 鎖預訂插槽的範例程式碼:
const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('User', UserSchema);
4. 預訂系統中的錯誤處理
優雅地處理錯誤是任何健壯系統的重要組成部分。以下是系統處理的一些錯誤:
- 400 Bad Request:當輸入資料無效時。
- 404 Not Found:當未找到要求的插槽或使用者。
- 423 已鎖定:當某個時段目前被其他使用者預訂時。
- 500 內部伺服器錯誤:任何意外錯誤,例如資料庫或 Redis 故障。
5. 保護系統安全
安全至關重要,尤其是當用戶預訂資源時。以下是系統確保安全的方式:
- JWT 驗證:每個插槽預訂請求都需要有效的 JWT 令牌,確保只有經過驗證的使用者才能存取系統。
- 資料驗證:每一步都會驗證輸入數據,以防止處理無效或惡意資料。
- 鎖定過期:Redis 鎖有一個內建的過期時間(10 秒),以防止預訂過程中途失敗時發生死鎖。
6. 可擴展性考量因素
系統在建置時考慮到了可擴展性。隨著需求的增加,以下策略可確保順利營運:
- 用於並發的 Redis:Redis 鎖定確保即使應用程式的多個實例正在運行,也可以避免競爭條件。
- Redis Clustering:如果系統顯著成長,可以使用Redis Clustering將負載分佈到多個Redis節點上,從而提高效能。
結論
建立可擴展且可靠的老虎機預訂系統需要仔細考慮並發性、資料完整性和安全性。透過使用Redis分散式鎖定,我們可以確保沒有兩個用戶同時預訂同一個時段,從而消除競爭條件。此外,透過利用MongoDB進行資料持久化和JWT進行身份驗證,該系統是安全、可擴展且高效的。
無論您是為會議室、活動或任何其他有時間限制的資源設計預訂系統,此架構都為在重負載下可靠地管理預訂提供了堅實的基礎。
以上是使用 Redis 分散式鎖建立可擴展的插槽預訂系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

將矩陣電影特效帶入你的網頁!這是一個基於著名電影《黑客帝國》的酷炫jQuery插件。該插件模擬了電影中經典的綠色字符特效,只需選擇一張圖片,插件就會將其轉換為充滿數字字符的矩陣風格畫面。快來試試吧,非常有趣! 工作原理 插件將圖片加載到畫布上,讀取像素和顏色值: data = ctx.getImageData(x, y, settings.grainSize, settings.grainSize).data 插件巧妙地讀取圖片的矩形區域,並利用jQuery計算每個區域的平均顏色。然後,使用

本文將引導您使用jQuery庫創建一個簡單的圖片輪播。我們將使用bxSlider庫,它基於jQuery構建,並提供許多配置選項來設置輪播。 如今,圖片輪播已成為網站必備功能——一圖胜千言! 決定使用圖片輪播後,下一個問題是如何創建它。首先,您需要收集高質量、高分辨率的圖片。 接下來,您需要使用HTML和一些JavaScript代碼來創建圖片輪播。網絡上有很多庫可以幫助您以不同的方式創建輪播。我們將使用開源的bxSlider庫。 bxSlider庫支持響應式設計,因此使用此庫構建的輪播可以適應任何

數據集對於構建API模型和各種業務流程至關重要。這就是為什麼導入和導出CSV是經常需要的功能。在本教程中,您將學習如何在Angular中下載和導入CSV文件


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),