- PHASE 01認識 Vibe Coding 和工具
- PHASE 02第一次做出東西
- PHASE 03規劃你的產品
- PHASE 04做出小店預約
- PHASE 05上線前要懂的事
- PHASE 06換成你的點子
- PHASE 07往商用產品前進
- 網頁
- 後台
- App
- API
- 資料庫
- Redis
- 測試收信匣
這一課動到:API、Redis
你現在在這裡:第 4 階段的第七課。上一課店家能自己改服務和營業時間,這一課處理兩個人同時訂同一個時段。
這一課可以先跳過,之後再回來。跳過的人,專案裡就沒有這個保護,第 17 課的自動測試會在「同一個時段不能被訂兩次」這一項失敗;想補上,回來做完這一課就好。
兩個人同時訂同一個時段,會發生什麼事?
兩個人幾乎同時按下送出,網頁都說還有空位,結果兩筆預約都成功,同一個時段被訂了兩次。修法是請 Codex 加上 Redis:誰先送出,就先把這個時段夾住,後到的人會看到「這個時段剛被訂走」。這一課先親手重現一次,再請 Codex 修好。
為什麼會重複預約
想像店裡有兩位店員,同時接到兩通電話,兩位客人都要訂週二下午兩點。兩位店員各自翻預約本,都看到兩點空著,就各自寫了上去。電腦也會這樣:兩筆預約同時送到,後端各自去資料庫(第 08 課的預約本)查,都看到空著,就各自存了進去。一個人測試時碰不到,客人一多才會出事。
Redis:櫃台先把時段夾住的夾子
Redis 像櫃台上的夾子:有人要訂兩點,先拿夾子把預約本上兩點那一格夾住,再慢慢寫進去;別人來訂同一格,看到上面有夾子,就知道已經有人在訂了。夾子過一會兒會自動鬆開,萬一前一位客人沒訂完,這個時段也不會一直卡住。Redis 的正式名稱是記憶體資料庫,速度很快,常拿來做這種幾秒鐘的保留。官方說明 ↗
Redis 不取代資料庫:預約還是記在資料庫裡,Redis 只負責送出的那幾秒。你不用學 Redis 的指令,設定和程式都交給 Codex。
練習用的慢動作
真的同時送出,前後只差零點幾秒,用手按很難剛好碰上。所以這一課先請 Codex 開一個練習用的慢動作:送出預約時,檢查完時段空著,先等 5 秒才存進去。這 5 秒內你按下另一個視窗的送出,就能親眼看到重複預約。確認修好後,再請 Codex 拿掉。
成果預覽:修好前兩個都成功,修好後只有一個


你的畫面和提示文字不會和這裡一模一樣。後到的人被擋下、知道要換時段,就是做對了。
上課前:準備好這三樣
- 上一課的專案
- 第 12 課做好的 shop-booking 資料夾。還沒做出來的話,先回第 12 課做完。
- Codex
- ChatGPT 桌面 App,在 shop-booking 資料夾裡開一個新對話。
- 瀏覽器
- 客人網頁 http://localhost:3000 和店家後台 http://localhost:3001 都打得開。打不開的話,先看下面步驟 1。
這兩步要你自己按
開 Docker、擺好兩個視窗,都要你自己來。
步驟 1打開 Docker Desktop,確認服務都在跑
- 從「應用程式」打開 Docker Desktop,等它顯示正在執行。
- 在 Docker Desktop 的容器列表裡,找到 shop-booking。

做完應看到:shop-booking 的服務都顯示執行中,瀏覽器打得開 http://localhost:3000。
如果服務是停止的:請 Codex「幫我把 shop-booking 的服務都啟動,啟動後告訴我網址」。
步驟 2開兩個瀏覽器視窗,左右擺好
- 在瀏覽器打開 http://localhost:3000,再按 ⌘N 開第二個視窗,也打開 http://localhost:3000。
- 把兩個視窗拖開,一個放左邊、一個放右邊,兩邊的「送出」按鈕都看得到。

做完應看到:兩個視窗都是客人的預約網頁,不用切換就能各按一下。
Windows:Docker Desktop 的鯨魚圖示在右下角的系統匣。開新視窗按 Ctrl + N;把視窗拖到螢幕左邊緣或右邊緣,會自動各佔半個螢幕。
操作步驟:先搶一次,修好,再搶一次
步驟 1請 Codex 開練習用的慢動作
- 在 Codex 貼上下面這段,送出。
這一課要練習「兩個人同時預約同一個時段」。 請在後端加一個只在本機練習用的慢動作:客人送出預約時,檢查完時段還空著之後,先等 5 秒,再存進資料庫。 先不要加任何防止重複預約的保護。做好後重新啟動服務,告訴我慢動作已經開著,並存一個版本。

做完應看到:Codex 回報慢動作開著。在客人網頁送出一筆預約試試,會等幾秒才出現成功畫面。
步驟 2兩個視窗搶同一個時段
- 兩個視窗都選「剪髮」、同一天、同一個時段,例如最近一個營業日的 14:00(週一公休)。
- 左邊填「王小明」,右邊填「陳小美」,Email 隨便填兩個不同的假信箱,例如 a@example.com、b@example.com。先不要按送出。
- 按左邊的送出,5 秒內再按右邊的送出。
- 等兩邊都有結果後,打開店家後台 http://localhost:3001,找到那一天的預約。

做完應看到:兩邊都說預約成功,後台同一個時段有兩筆。這就是重複預約。
如果只有一邊成功:可能右邊按得太晚,超過 5 秒。換一個還空著的時段再搶一次;還是只有一邊成功,看下面「卡住時怎麼辦」。
步驟 3請 Codex 用 Redis 修好
- 在 Codex 貼上下面這段,送出。
剛剛兩個人同時訂同一個時段,兩筆都成功了,重複預約。請用 Redis 修好: 1. 客人送出預約時,先用 Redis 把這個時段夾住,夾住的人才能存進資料庫。 2. 沒夾到的人,網頁顯示「這個時段剛被訂走,請選別的時段」。 3. 夾子最多夾 30 秒,萬一沒訂完會自動放開。 4. 服務時間比較長的(例如染髮 120 分鐘),它佔到的每一格都要夾住。 Docker 裡如果還沒有 Redis,請幫我加上。慢動作先保留,我要再搶一次確認。 改完重新啟動服務,你自己先用兩個同時送出的預約試一次,告訴我結果和改了哪些檔案。

做完應看到:Codex 回報修好了,它自己試的結果是只有一筆成功。
步驟 4用同樣的步驟再搶一次
- 兩個視窗都重新整理(⌘R)。
- 照步驟 2 再搶一次,但換一個還空著的時段,例如同一天的 15:00。
- 打開店家後台,看那一天 15:00 有幾筆。

做完應看到:只有一邊成功,另一邊看到時段被訂走的提示;後台 15:00 只有一筆。
剛剛 14:00 重複的那兩筆:到店家後台取消其中一筆就好。
步驟 5拿掉慢動作,看改了哪些檔案,存一個版本
- 在 Codex 貼上下面這段,送出。
- 用 VS Code 打開 shop-booking 資料夾,對照 Codex 說的檔案,看這一課改了哪些地方。
確認修好了。請把練習用的慢動作拿掉,重新啟動服務。 再用白話告訴我,這一課你改了哪些檔案、各改了什麼,然後存一個版本,說明寫「防止重複預約」。

做完應看到:改動集中在預約相關的地方,例如 backend/app/routers/bookings.py、客人網頁顯示提示的地方,可能還有 docker-compose.yml。送出預約不用再等 5 秒。
如果和預約無關的檔案也被改了:請 Codex 說明為什麼要改;說不出理由,請它改回去。
Windows:重新整理按 Ctrl + R,其他步驟都一樣。
成果檢查
成功的樣子:
- 修好前,兩個視窗搶同一個時段,兩邊都成功,後台同一個時段有兩筆。
- 修好後,用同樣的步驟再搶一次,只有一邊成功,另一邊看到時段被訂走的提示。
- 後台那個時段只有一筆預約。
- 慢動作已經拿掉,平常送出預約不用等。
還沒成功的樣子:修好後兩邊還是都成功、兩邊都失敗,或送出後一直轉圈沒有結果。照下面「卡住時怎麼辦」處理。
每個人的畫面不同是正常的:提示文字不必一字不差,只要後到的人被擋下、知道要換時段就對了。
卡住時怎麼辦
修好前就只有一邊成功
先確認右邊是在 5 秒內按的。還是只有一邊成功,可能慢動作沒開,或專案原本就有保護。把這段貼給 Codex:
我用兩個視窗在 5 秒內送出同一個時段,只有一筆成功,看不到重複預約。請檢查練習用的慢動作有沒有開著,專案是不是原本就有防止重複的保護,告訴我原因。
修好後兩邊還是都成功
修好後我用兩個視窗再搶一次同一個時段,兩邊還是都成功,後台有兩筆。請檢查 Redis 有沒有啟動、送出預約時有沒有真的先夾住時段,修好後你自己先用兩個同時送出的預約試一次,再告訴我結果。
兩邊都失敗,或一直轉圈
多半是 Redis 沒啟動或連不上。把這段貼給 Codex:
現在送出預約兩邊都失敗(或一直沒有結果)。請檢查 Docker 裡的服務和 Redis 是不是都在跑、後端連不連得上 Redis,修好後告訴我原因。
客人網頁打不開
先確認 Docker Desktop 開著、shop-booking 的服務在跑。還是打不開,回到第 07 課的「卡住時怎麼辦」。
練習:時間重疊的兩個服務
染髮要 120 分鐘:有人訂了 14:00 的染髮,14:00 到 16:00 都被佔住。這時另一個人訂 15:00 的剪髮,也應該被擋下。請 Codex 替你試一次:
請你自己用兩個同時送出的預約試一次:一筆是染髮 14:00(120 分鐘),一筆是剪髮 15:00(60 分鐘),同一天。兩段時間重疊,只能有一筆成功。告訴我結果;沒通過就修好,並存一個版本。
Codex 回報後,到店家後台看那一天,確認沒有兩筆時間重疊的預約。
常見問題
這一課可以跳過嗎?
可以先跳過,之後再回來。跳過的人,專案裡就沒有防重複預約,第 17 課的自動測試會在這一項失敗;有空再回來親手搶一次,就補上了。
真的會有兩個人同時訂同一個時段嗎?
客人少的時候很少遇到,但熱門時段、剛開放預約或做活動時就可能發生。一旦發生,兩位客人都以為訂到了,到店才發現撞期,比沒訂到更傷。
Redis 和資料庫有什麼不同?
資料庫像預約本,長久記下每一筆預約;Redis 像櫃台的夾子,只在送出的那幾秒把時段夾住,確認沒人搶走再寫進預約本。兩個一起用,不是互相取代。
我需要學 Redis 的指令嗎?
不用。你只要知道它在這個產品裡負責夾住時段;設定和程式都請 Codex 做,你用兩個瀏覽器視窗確認結果。
為什麼要先開慢動作?
真的同時送出,前後只差零點幾秒,用手按很難剛好碰上。慢動作把中間拉長成幾秒,你就能親眼看到問題;確認修好後,再請 Codex 拿掉。
來源與版本
官方資料查閱日:2026-09-29。Docker Desktop 與 Codex 的畫面可能隨版本改變。獨立教學,非 Redis、Docker、OpenAI 的官方課程。
