记录一次响应时间过长的处理方案

记录一次响应时间过长的处理方案

分析原因

首先贴上时间耗费较长的部分伪代码

// 遍历数据
for (){
    // 获取id
    Integer id = ....;
    // 根据id判断数据在数据库中是否存在
    if (true) {
    	// 存在则更新数据
    } else {
        // 不存在则新增一条数据
    }
}
复制代码

这是一段非常简单的代码,遍历表中数据,数据存在则更新,数据不存在在插入新的数据。而原因就出在连接数据库这一过程,该段代码会与数据库进行2倍以数据量的连接,当循环的数据偏多时,响应时间就会过长。

添加缓存

在判断数据是否存在这一部分每循环一次都需要访问一次数据库确定数据是否存在,我们可以将每次访问的结果以id为key值存储起来,判断时直接取出缓存中数据,从而降低响应时间。
修改后伪代码如下

// 遍历数据
for (){
    // 获取id
    Integer id = ....;
    if (cache(id)) {
    	// 存在则更新数据
    } else {
        // 不存在则新增一条数据
    }
}
// 缓存方法
boolean cache(Integer id){
	// 根据id判断数据是否存在于缓存当中
	if (true){
		return 缓存的数据;
	}else {
		// 根据id判断数据是否存在于数据库当中
		// 将数据存入缓存当中
		return 数据库返回的数据;
	}
}
复制代码

当然,使用缓存时一定要注意什么时候需要更新缓存数据,当前案例不需要更新缓存数据,如果涉及到数据删除,则需要更新缓存数据。

批量更新和批量插入

我们可以在判断数据是否存在之后,不立即更新或插入数据,而是把需要更新和插入的数据的id分别存储在一个列表当中,当所有id都遍历完之后,借助mybatis的<foreach>标签进行批量处理。
修改后伪代码如下

// 遍历数据
// 需要更新数据的id
List<Integer> updateIdList = new ArrayList<>();
// 需要插入数据的id
List<Integer> insertIdList = new ArrayList<>();
for (){
    // 获取id
    Integer id = ....;
    if (cache(id)) {
    	updateIdList.add(id);
    } else {
        insertIdList.add(id);
    }
}
// 批量更新
// 批量删除
// 缓存方法
boolean cache(Integer id){
	// 根据id判断数据是否存在于缓存当中
	if (true){
		return 缓存的数据;
	}else {
		// 根据id判断数据是否存在于数据库当中
		// 将数据存入缓存当中
		return 数据库返回的数据;
	}
}
复制代码

总结

通过缓存和批量处理成功将接口响应时间从1至2s降低到了100ms。此处理方案仅仅是记录一下个人成长经历,不一定适用于大部分场景,如果各位大佬有更好地处理方案或者代码还有可以优化的地方可以评论区里贴出解决方案。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享