java 记录一次实时数据碰撞结果缓存redis耗时过长(7s+)的解决方案

原因:

    在项目中,有个实时数据碰撞的功能,用户使用此功能时需要等待结果响应。
    碰撞结果包括:统计各对象碰撞次数的统计结果(使用单个key进行缓存),各对象碰撞的详细信息(由于详细信息会很多,且碰撞详细信息会根据对象进行查询,所以根据个对象生成不同的key进行缓存)

解决方案:

    使用arthas trace对请求进行跟踪分析发现,将碰撞数据结果缓存到redis时耗时过长(7s+),分析应该是各对象碰撞的详细信息按对象生成不同的key进行缓存,每个key需要调用一次redis存储方法(即一次redis请求)导致。

    由于各对象碰撞的详细信息会很多(比较大,10M-100M),如果使用单个key缓存到redis,查询时可能会导致redis阻塞,所以考虑使用文件进行存储。

    各对象碰撞的详细信息存储文件时,保持同一对象的详细信息连续、且按照时间降序排序(业务需求)进行存储,读取的时候逐行遍历查找待查询的对象详细信息。

性能:  

数据量操作耗时(毫秒)
30万读文件末尾对象记录,141条结果

800+

30万写文件500+

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值