有1000亿条记录,每条记录由url,ip,时间组成,设计一个系统能够快速查询以下内容
1.给定url和时间段(精确到分钟)统计url的访问次数
2.给定ip和时间段(精确到分钟)统计ip的访问次数
将访问记录拆分成两个数据表,表1是IP地址、时间段、时间和对应访问url在表2的主键和段内序号,表2是url、时间段、时间和对应IP地址在表1的主键和排序, 将两个数据表存储在NoSQL数据中,将一天分成4个时间段以后,每个IP地址按照访问时间在对应的时间段下增加一条时间记录,给该条记录一个序号。同理,表2 也按照时间段分开存储记录,拆分后,进行水平分表,按照IP地址和时间段拆分表1,按照url和时间段拆分表2。进行检索的时候,首先根据查询时间段和表2中 时间段划分,将一条查询分成一条或多条查询,将跨时间大段的查询转换为每个大时间段里面的查询,根据划分后的查询时间,索引到表2中的数据记录, 在该条记录中统计访问次数,最后进行结果相加。给定IP地址和时间段的查询同理。 表1设计为{"ip_id":"111","IP":"x.x.x.x","time_segment":"20170401-1","recorde":[{"time":"20170401052223","ip_order":1,"url":url_id,"url_order":1}]} 表1设计为{"url_id":"2","url":"qq.com","time_segment":"20170401-1","recorde":[{"time":"20170401052223","url_order":1,"ip":ip_id,"ip_order":1}]}
1. //将1000亿条记录分成1000个文件:t1,t2,t3....t1000,每个文件有1亿条记录 //使用多线程技术同时处理1000个文件,构造每个文件所对应的hashtable HT,包含<url,time> //根据url访问HT,判断时间是否在指定范围内,如果在则将访问次数累加
公共的时间段,因为精确到分钟,我们把这每一分钟建成一个小文件,每个小文件肯定会有许多重复的ip,url;
现在统计每个小的文件中url的访问量和ip的访问次数,方法就是建立索引;
(建立索引的目的是为了减少查询次数,但是随着索引级数增多也会造成花更多的时间在建立索引上);
建立url的索引,假如是www.nowcoder.com/question,可以分别给www.nowcoder.com和question建立索引,那么来了一条url,先看一级索引是不是匹配,匹配再看二级索引,相同的话就是我们要的url目标;
ip的索引也是一样,ip分成4段建立索引;
所以这里影响效率的就是在索引建立这块,索引建立好那就是查询的事了的,就会变得非常快。
假定给定了某个时间段,找出url的访问量,那么先找到给定的时间段,对应着刚开始分割的小的文件(每一个分钟)中搜索,通过索引找到相同的url之后,开始统计,直到搜索完所有的给定时间段内的所有的小的文件;
求ip的访问次数也是一样,按照给定的时间段,找到对应的小的文件,通过索引找到相同的ip后统计,直到搜索完了给定时间段内的所有的小的文件。