先说一下场景,日志文件中有大约三千万行数据,大小为1.2G,格式为IP,TIME,现在要针对IP字段进行数量统计重复的次数,以便制定规则来控制用户的恶意注册。
关于如何读取,并统计这三千万的数据,有三个思路:
第一个:使用JAVA的BufferedReader,分批读取数据,然后再利用map统计结果。
第二个:使用JAVA的BufferedReader,分批读取数据,然后把结果直接存入到redis的sorted set中。
第三个:多线程环境下,结合第二个思路。
第一个思路,执行不到三分钟,内存已经溢出。
第二个思路,一秒钟大约能存入到redis中1667条数据,速度还不错,一小时能统计600万左右,但要统计完成,大约需要5个小时,考虑到数据越多,读写Redis的速度就越慢,估计要6个小时左右。
第三个思路,由于redis是单线程工作,此次又全部是写入的工作,所以多线程对性能提高的能力有限,如果是有读有写,可利用Redis的主从模式,写主库,读从库&#x