我有一個包含數百萬個 ID 的中央資料庫。我有一組用戶(50-100 個用戶),他們都可以請求從這個大資料庫中提取 ID。
Atm 我所做的是當用戶發送 GET 請求時,我選擇 100 個 ID,然后使用標志 USED 更新它們并回傳 100。問題是,如果我同時收到太多請求,多個用戶將收到相同的ids(因為我在選擇然后更新時不鎖定資料庫)
如果我鎖定資料庫,我的問題將得到解決,但它也會變慢。
我還有什么其他選擇?
謝謝!
uj5u.com熱心網友回復:
再向前看一步......如果“用戶”獲得 100 行,然后就死了怎么辦。你有辦法釋放這 100 個讓其他人作業嗎?
您需要一個額外的表格來處理“簽出”和“簽入”。此外,使用該表來跟蹤要分配給用戶的“下一個”100。
當用戶簽出 100 個時,表中會存盤一條記錄,以及時間戳和“誰”簽出它們。如果他們沒有“在一個小時內重新簽到,那么您將這 100 個分配給另一個用戶。
回到更平凡的事情......如何選擇100。如果有一個沒有間隙的auto_increment id,那么使用簡單的數學來分塊串列。如果有很多空白,則使用SELECT id FROM tbl WHERE id > $leftoff ORDER BY id LIMIT 100, 1獲取下一個 100 的結尾。
uj5u.com熱心網友回復:
如果每個用戶都有自己的密鑰,您可以從他們的密鑰*10000 開始從數百萬個 ID 中提取。例如,用戶 #9 將首先獲得 ID #90000 到 #90099,然后是 #90100 到 #90199。
您可以在將 ID 發回之前將其設定為“已使用”,因此多次請求 ID 的用戶將永遠不會得到重復。這不需要為其他用戶鎖定資料庫。
如果他們在資料庫更新之前請求密鑰的次數不超過 100 次,這應該可以避免沖突。您可能需要添加邏輯以允許經常請求不要用完的用戶,例如通過擁有一個可以重新填充其供應的 ID 池,但這取決于原始問題中不清楚的細節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/504043.html
標籤:mysql sql 数据库 phpmyadmin
下一篇:匹配值并創建熊貓資料框
