后端用什么方法实现限制用户访问资源数量比较好?

2022-02-26 00:04:51 +08:00
 LeeReamond

需求:数据库内共有 10 万个资源,限制每用户每小时最多访问其中 100 个。

目前的思路:redis 里针对每个用户生成一个数组储存该用户已访问过的资源的 id ,每次请求时判断 ID 是否在数组中。

另外因为需求是限制访问资源种类而不是资源数量(比如实际上允许用户多次请求同一资源,只要不是不同资源就不会加以限制),且访问是与用户挂钩,所以似乎不太适合在业务前实现。

问题:

1 、感觉这种方式效率比较低,不是很优雅。

2 、限制有 1 小时时限,如何在数据超过期限后自动从数组中清除也是没啥太好办法。

这种需求有什么通用方案吗?

1962 次点击
所在节点    程序员
2 条回复
Livid
2022-02-26 08:52:36 +08:00
可以给每个用户一个 sorted set ,sorted set 本身也可以带有 expire 属性( 1 小时):

https://redis.io/commands#sorted-set
dayeye2006199
2022-02-26 13:15:37 +08:00
实现一个令牌桶算法怎么样?一小时发 100 个令牌,每次请求一个新的资源类型需要消耗一个令牌

https://www.cnblogs.com/bossma/p/how-to-implement-token-bucket-algorithm-using-redis.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836509

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX