自从实习以后就没什么时间写文章了,今天再写一篇记录一下,主要是给自己看。
起因是这样的: 以前跟着课程做项目的时候,一直对登录的时候需要增加登录凭证的目的一知半解,一度以为只是为了方便用户,最近因为一次性处理了五千万条数据才猛然醒悟,原来查数据库对性能影响这么大。
因为五千多万条数据量比较大,而且需要处理成的格式比较复杂,所以一次性直接用IO写时间复杂度太高了,而且只要电脑卡死一下就寄了(其实是因为我太菜了,写不明白复杂多线程的IO处理),于是我决定先把这五千万条数据入库,也方便以后使用,然后我把采集到的数据全部封装成了 Map<String, Map<String, List<Long>>> 这种复杂的格式,然后花了一下午把数据入库了,顺便建了索引,然后就开始想怎么取,因为最终需要处理成类似下面这种格式:
也就是每个时间点需要有所有点位(传感器采集到的数据)的数值,而这样点位有两百多个。
我套了好几层循环来处理,一开始我每层循环都查一次数据库,总共可能要查几百万次数据库,写了一个小时还没写完一天的数据,然鹅总共有一百多天的数据,也就是电脑要不间断查五六天才能查完,我完全无法忍受,于是我狠狠优化了一波,大大减少了查数据库的次数,然后奇迹发生了,原本一个小时写不了一天,现在十五分钟写完一百多天,太爽了!有一种便秘几天却突然瞬间通畅的快感。
以前对Redis这种缓存一点也不理解,觉得要查数据库就随便查呗,根本无所谓,为啥非得多此一举搞个缓存,后来,Redis真香!