gpt4 book ai didi

mysql - 实现配额系统以限制基于 Web 的应用程序中的请求

转载 作者:可可西里 更新时间:2023-11-01 11:18:09 25 4
gpt4 key购买 nike

我想将我的用户限制为每小时/每天 25k/请求/随便什么。

我的第一个想法是简单地使用 mysql 并在用户表中有一列,我将在其中存储请求,并且每次用户发出请求时我都会递增此计数器。这种方法的问题在于,有时您最终会同时在列中进行写入,并且会遇到来自 mysql 的死锁,所以这并不是解决此问题的好方法,对吗?

另一种方法是,不增加列的计数器,而是在单独的表中插入日志记录,然后计算给定时间跨度内的这些记录,但这样你很容易得到百万记录表和查询可能太慢了。

当使用 RDBMS 时,另一个需要考虑的方面是,在每次请求时,您都必须计算数据库中的用户配额,这可能会花费一些时间,具体取决于上述任一方法。

我的第二个想法,我想使用像 redis/memcached 这样的东西(不确定替代品或其中哪个更快)并将请求计数器存储在那里。这将足够快来查询和递增计数器,肯定比 RDBMS 快,但我还没有用大量数据尝试过它,所以我不确定它会如何执行。

我的第三个想法,我会将配额数据保存在内存中的映射中,类似于 map[int]int,其中键是 user_id,值是配额使用情况,我'使用互斥锁保护 map 访问。这将是所有解决方案中最快的,但是如果由于某种原因您的应用程序崩溃,您会丢失与特定用户所做的请求数量相关的所有数据,您会怎么做。一种方法是在崩溃时捕获应用程序并循环遍历 map 并更新数据库。这可行吗?

不确定以上任何一种方法是否正确,但我愿意接受建议。

最佳答案

当您尝试同时更新一行时,我不确定您所说的“从 mysql 获取死锁”是什么意思。但是一个简单的 update rate_limit set count = count + 1 where user_id = ? 应该做你想做的事。

就我个人而言,我在使用 Redis 进行速率限制方面取得了巨大的成功。有很多资源可以帮助您了解适合您的用例的方法。这是我刚刚看过的一个,似乎可以正确处理事情:https://www.binpress.com/tutorial/introduction-to-rate-limiting-with-redis/155 .使用管道 (MULTI) 或 Lua 脚本可能会让事情变得更好。

关于mysql - 实现配额系统以限制基于 Web 的应用程序中的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912252/

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