需求描述:标签化活动之后,需要导出参与活动的用户的书架书籍和所有标签的详情,导出为Excel。
涉及到的存储: mysql数据库(参与的所有用户,所有的标签数据) redis(每个标签的点赞数和踩数) 还有一部分数据需要调用taf服务(比较耗时)
数据量级: 用户数在16万(书架每个人不等) 标签数在140万左右
实现方案: 线程池开启多个线程,每个线程处理一页数据,先从mysql查出,遍历再从redis补全信息,封装到list中,最后导出为Excel。
出现问题:
1. redis连接的释放问题
2. mysql的连接释放问题
3. list的作用域,设置为成员变量,导致多线程造成并发问题
4. 程序运行一段时间导致内存溢出,运行失败,由于list构造太大,一直循环占用,不能释放。
复制代码
最终解决方案:
由于书架书籍量级无法预估,故而不做导出,以后注意要提前预估数据的量级。
采用单线程直接写到日志文件中,然后在从TXT导出为Excel。
复制代码
收获:
要注意细节问题
在涉及到资源释放的时候,要做好封装,防止犯错
要考虑到一个程序的内存使用和时间效率问题,评估之后才会制定最优方案
要减少taf服务的调用,尽量采取批量复制代码