原因:
在项目中,有个实时数据碰撞的功能,用户使用此功能时需要等待结果响应。
碰撞结果包括:统计各对象碰撞次数的统计结果(使用单个key进行缓存),各对象碰撞的详细信息(由于详细信息会很多,且碰撞详细信息会根据对象进行查询,所以根据个对象生成不同的key进行缓存)
解决方案:
使用arthas trace对请求进行跟踪分析发现,将碰撞数据结果缓存到redis时耗时过长(7s+),分析应该是各对象碰撞的详细信息按对象生成不同的key进行缓存,每个key需要调用一次redis存储方法(即一次redis请求)导致。
由于各对象碰撞的详细信息会很多(比较大,10M-100M),如果使用单个key缓存到redis,查询时可能会导致redis阻塞,所以考虑使用文件进行存储。
各对象碰撞的详细信息存储文件时,保持同一对象的详细信息连续、且按照时间降序排序(业务需求)进行存储,读取的时候逐行遍历查找待查询的对象详细信息。
性能:
数据量 | 操作 | 耗时(毫秒) |
30万 | 读文件末尾对象记录,141条结果 | 800+ |
30万 | 写文件 | 500+ |