我想通过Laravel概述我的独特访客(有点像cloudflare)。
我已经拥有的东西:
我有一个数据库,但我不认为这是好的:
我想尽可能多地将数据存储到我的数据库中,但不是存储地点,浏览器等......
我希望能够每天查看所有访问者(唯一的,一天内不是两次相同的IP),因此请计算IP地址,以及整整一个月。
例如:
4月需要在我的视图中显示如下:
['1/04', 5],
['2/04', 58],
['3/04', 496],
['4/04', 654],
['5/04', 854],
['6/04', 756],
['7/04', 254],
['8/04', 887],
['9/04', 452],
['10/04', 985],
['11/04', 745],
['12/04', 120],
['13/04', 985],
['14/04', 745],
['15/04', 321],
['16/04', 852],
['17/04', 753],
['18/04', 951],
['19/04', 791],
['20/04', 167],
['21/04', 761],
['22/04', 349],
['23/04', 741],
['24/04', 258],
['25/04', 963],
['26/04', 317],
['27/04', 482],
['28/04', 341],
['29/04', 654],
['30/04', 751]
因此,每天必须计算知识产权的数量,而且一个月内,这将取决于当月。
输出看起来与此类似:
如果可能的话,我想收到一个控制器,视图和数据库。 我已经搜索了整个互联网,但没有找到任何东西...... 如果有人能帮助我,我会非常高兴!
最诚挚的问候,
罗宾
答案 0 :(得分:5)
如果我理解你的目标,这就是我解决问题的方法。
对您的数据库进行以下更改:
1) Remove the hits field.
2) Store dates in a YYYY-MM-DD format.
然后检查数据库中的现有记录,或者在新用户登录或请求页面时创建一个新记录(您应该在数据库中缓存此减少命中):
$visitor = Visit::firstOrCreate(['date'=>$current_date,'ip'=>$ip_address);
然后,当您需要检索视图的数据时,您可以致电:
$visits = Visit::selectRaw('date count(date) as hits'))->groupBy('date')->whereRaw("`date` between $begin and $end")->get();
这应该可以帮到你,但你必须自己解决这些问题。
答案 1 :(得分:2)
这种架构的主要问题是MySql不擅长聚合。您需要的是时间序列内的汇总数据。为此,您可以使用Cassandra
时间序列或MongoDb
方法。
在执行嵌套插入后,在db中插入新的唯一ip:
例如,在2015-06-14 23:11:23在MongoDb策略中记录新的点击时间:
{
_id : MongoId(),
year : 2015,
hits : ++,
months : {
6 : {
hits : ++,
days : {
14 : {
hits : ++,
hours : {
23 : {
hits : ++,
minutes : {
11 : {
hits : ++
}
}
}
}
}
}
}
}
}
使用此策略,您可以查询受分钟限制的日期范围,并且时间复杂度很高。
如果您只需要最近的数据(例如仅上个月),您也可以使用Redis
。然后,您increment
网站点击current_month
,day_14_of_current_month
,hour_23_of_current_day
,minute_23_of_current_hour
作为您的汇总密钥。 Redis使用O(1)
检索具有O(n)
复杂度的单个密钥和多个密钥(例如,当前第0天到第5天)。
我使用Redis
方法为在Laravel 5中编写的documentation网站提供统计信息,每次请求发布带有请求IP数据的Rabbitmq消息,多个工作程序同时弹出作业,并将聚合数据插入redis,因此统计数据几乎是实时的。