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

来源:互联网 发布:网络平台赌博游戏代理 编辑:程序博客网 时间:2024/04/29 20:53

背景:因为数据量稍大以及查询中含有三个表连接操作,导致查询时间超过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
原创粉丝点击