如何使用数据库记录请求计数,将每个用户每天最多网站请求限制为10个?

时间:2011-06-16 00:12:09

标签: php database

我有一个人的用户名,每天可以提出10个请求。每天请求返回0,不需要旧数据。

这样做的最佳方式是什么?

这是我想到的方式,但我不确定这是否是最好的方式 (两个字段,today_date,request_count):

  1. 在数据库中查询上次请求和请求计数的日期。
  2. 获取结果并检查是否是今天。
  3. 如果今天检查请求计数,如果小于10,请将查询数据库更新为++count
  4. 如果不是今天,请使用今天的日期和count = 1更新数据库。
  5. 是否有另一种方法可以减少数据库查询?

4 个答案:

答案 0 :(得分:2)

我认为你的解决方案很好。也可以每天重置计数。这将允许您跳过一列,但您确实需要运行一个cron作业。如果有许多用户根本没有任何请求,则无需每天重置他们的计数。

但无论您选择哪种方案,这两种解决方案在性能,数据大小和开发时间/复杂性方面都非常相似。

答案 1 :(得分:1)

只有一列request_count。然后查询此列并进行更新。据我所知,使用存储过程可以在一个查询中实现。即使不是,它也只是两个。然后创建一个调用脚本的cron作业,该脚本每天在00:00将列重置为0

答案 2 :(得分:1)

为了免除对数据库定义的一些要求

  1. 每天允许的最大请求数。
  2. 申请的第一天(日期抵消)。
  3. 然后向每个用户的数据库添加一个requestcount字段。

    在第一个请求中从db获取计数。

    计数始终是当天的天数乘以每天最多+ 1次请求加上该用户的实际请求:

       day * (max + 1) + n
    

    因此,如果在第一次请求时,db的计数实际上高于允许值,则阻止。

    否则,如果它低于当前日基数,则重置为当前日基数(在PHP变量中)

    数数。将此值存储到数据库中。

    这是一个读取操作,如果请求仍然有效,则每个请求对DB进行一次写操作。

    无需运行cron作业来清理它。

    这实际上与您在问题中提出的相同,但日期信息是计数器值的一部分。因此,您可以同时使用一个值执行更多操作,而每个请求计数+1仍然适用于该块。

答案 3 :(得分:0)

您必须考虑到每个用户可能与您的服务器位于不同的时区,因此您不能只存储计数或“day * max”技巧。尝试获取时间偏移,然后用户日的开始可以存储在“配额”数据库中。在mySQL中,它看起来像:

`start_day`=ADDTIME(CURDATE()+INTERVAL 0 SECOND,'$offsetClientServer')

然后在下次检查配额时查看此时间。配额检查都可以在一个查询中完成。