gpt4 book ai didi

database - 设计数据库/后端来解决这种高负载需求场景?

转载 作者:搜寻专家 更新时间:2023-10-30 20:27:39 27 4
gpt4 key购买 nike

我在面试中被问到这个问题。问题陈述是这样的

You have a website which handles load of millions of users. You have got a shared database across various load balancing web servers which has got details of coupons in a table. Every person who logs in will get a random coupon id from the table.

问题是您将如何设计您的系统来满足这么多用户的需求?

In my opinion every time a user logs in, we will have to run a select query to fetch a coupon id and delete it from the table using a delete query to ensure that it does not get assigned to other user.

但是我不知道它将如何扩展到数百万用户?在我的设计中,直到删除第一个用户之前,我无法招待任何其他用户。这就是为什么很多从数据库服务器和主数据库服务器都无济于事的原因。因为master的删除必须同步到slave,才不会出现重复。

我如何解决这个问题来扩展我的后端?另外,如果应该在这里使用缓存,我的方法应该是什么?

最佳答案

问题陈述没有说明要向每个用户分发哪个优惠券。我认为任何都可以。

您当前的设计无法扩展,因为它有一个争论点:获取第一优惠券。

取而代之的是,只需从 table 上拿走任何优惠券。在存储优惠券的表中添加一个随机数列。它的取值范围应该是 [0, 1000000)。

当必须抽取优惠券时,取取刚刚抽取的数字以上随机数最小的优惠券:

SELECT TOP 1 *
FROM Coupons
WHERE RandomNumber >= RAND(0, 1000000)
ORDER BY RandomNumber

这消除了所有争用,因为写入发生在表中的随机点。以下是编写的查询:

DELETE x FROM
(
SELECT TOP 1 *
FROM Coupons
WHERE RandomNumber >= RAND(0, 1000000)
ORDER BY RandomNumber
) x

这有适当的锁定语义确保原子性。

关于database - 设计数据库/后端来解决这种高负载需求场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com