一个简单接口的优化分析与实战

背景:因为数据量稍大以及查询中含有三个表连接操作,导致查询时间超过6秒,前端发送请求,通过Nginx服务器进行转发,因为查询速度过慢导致Nginx转发失败,返回499错去(Nginx内部机制还是默认配置?),客户端关闭连接,无法得到返回值。


想到的解决方法:

1. Nginx服务扩容(比较low,而且也无法从根本上解决问题)

2. 分析Mysql执行计划,给相应字段添加索引(这是必须的,前期索引没添加属于低级失误),查询速度提高一倍,但3秒还是不够快,Nginx依旧转发失败

3. 代码加入分页功能,比如一次加载20行(还是没能解决问题)

4. 对三次表连接操作进行分拆,单独查询出每个表的值,然后在Java代码中进行分类与归并(对代码改动较大,还未尝试)

5. 利用loadingcache进行内存缓存,来自google guava。样例代码如下:

public static LoadingCache<String, List<GeneralSelfDefineEventDisDomain>> cache = null;
static {
cache = CacheBuilder
.newBuilder()
// 设置大小,条目数
.maximumSize(10000)
// 设置时效时间,最后一次被访问
.expireAfterAccess(2, TimeUnit.HOURS)
// 移除缓存的监听器
.removalListener(
new RemovalListener<String, List<GeneralSelfDefineEventDisDomain>>() {
public void onRemoval(
RemovalNotification<String, List<GeneralSelfDefineEventDisDomain>> notification) {
}
})
// 缓存构建的回调
.build(new CacheLoader<String, List<GeneralSelfDefineEventDisDomain>>() {// 加载缓存
@Override
public List<GeneralSelfDefineEventDisDomain> load(String key)
throws Exception {
List<GeneralSelfDefineEventDisDomain> list = new ArrayList<GeneralSelfDefineEventDisDomain>(
1000);
return list;
}
});
cache.invalidateAll();
}


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentDate = sdf.format(new Date());
// list = generalDayUserDao.querySelfDefineEventDisResult(qe);
if (cache.get(currentDate) != null && cache.get(currentDate).size()>0) {
list = cache.get(currentDate);
} else {
cache.cleanUp();
list = generalDayUserDao.querySelfDefineEventDisResult(qe);
cache.put(currentDate, list);
}


此处以当前日期为key,整个列表为value将值插入缓存,2个小时以上没有查询操作或者时间跨过一天时就清空缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值