我有一个人的用户名,每天可以提出10个请求。每天请求返回0,不需要旧数据。
这样做的最佳方式是什么?
这是我想到的方式,但我不确定这是否是最好的方式 (两个字段,today_date,request_count):
++count
。count = 1
更新数据库。是否有另一种方法可以减少数据库查询?
答案 0 :(得分:2)
我认为你的解决方案很好。也可以每天重置计数。这将允许您跳过一列,但您确实需要运行一个cron作业。如果有许多用户根本没有任何请求,则无需每天重置他们的计数。
但无论您选择哪种方案,这两种解决方案在性能,数据大小和开发时间/复杂性方面都非常相似。
答案 1 :(得分:1)
只有一列request_count
。然后查询此列并进行更新。据我所知,使用存储过程可以在一个查询中实现。即使不是,它也只是两个。然后创建一个调用脚本的cron作业,该脚本每天在00:00将列重置为0
。
答案 2 :(得分:1)
为了免除对数据库定义的一些要求
然后向每个用户的数据库添加一个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')
然后在下次检查配额时查看此时间。配额检查都可以在一个查询中完成。