在我的数据库中实现这种使用的最佳方法是什么



我有一个包含数百万ID的中央数据库。我有一群用户(50-100个用户(,他们都可以请求从这个大数据库中提取ID。

我所做的是,当用户发送GET请求时,我选择100个id,然后用USED标志更新它们,并返回100。问题是,如果我同时收到太多请求,多个用户将收到相同的ID(因为我在选择然后更新时不会锁定数据库(

如果我锁定数据库,我的问题就会得到解决,但速度也会变慢。

我还有其他选择吗?

谢谢!

展望未来。。。如果一个";用户";得到100排,然后倒下死了。你有办法释放这100个给别人做吗?

你需要一张额外的桌子来处理";"结账";以及";签入";。此外,使用该表来跟踪";下一个";100分配给用户。

当用户签出100时,该100的记录连同时间戳和"0"一起存储在表中;谁";检查了一下。如果他们不";在一个小时内将它们签回,然后将100分配给另一个用户。

回到更平凡的事情上。。。如何挑选100。如果有一个没有间隙的auto_increment id,那么使用简单的数学方法来填充列表。如果有很多间隙,那么使用SELECT id FROM tbl WHERE id > $leftoff ORDER BY id LIMIT 100, 1来获得下一个100的末尾。

如果每个用户都有自己的密钥,您可以从他们的密钥*10000开始的数百万个ID中提取。例如,用户#9将首先获得ID#90000到#90099,然后下次获得ID#90100到#90199。

您可以将ID设置为";使用";因此,一个用户多次请求ID将永远不会得到重复的ID。这不需要为其他用户锁定数据库。

如果在数据库更新之前,他们请求密钥的次数不超过100次,这应该可以避免冲突。您可能需要添加逻辑,以允许经常请求的用户不要用完,例如通过拥有一个可以重新填充其供应的ID池,但这取决于原始问题中不清楚的细节。

相关内容

最新更新