一个简单接口的优化分析与实战
来源:互联网 发布:网络平台赌博游戏代理 编辑:程序博客网 时间: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个小时以上没有查询操作或者时间跨过一天时就清空缓存
- 一个简单接口的优化分析与实战
- node.js与express4.X实战--快速构建一个简单的API接口(翻译)
- python实战(1):简单的数据采集与分析
- SEO优化:如何简单快速的去分析一个网站
- web_custom_request的一个简单实战
- 【典型例题】一个接口与多态的分析笔记
- 一个简单的接口实现
- FFmpeg与libx264接口源代码简单分析
- FFmpeg与libx264接口源代码简单分析
- 一个简单的优化改写
- 一个优化分析的例子
- 一个简单的体育彩票模拟机与分析机
- 实战JBuilder8 + Struts,一个简单的例子
- 实战JBuilder8 + Struts,一个简单的例子
- Retrofit实战(一)一个简单的示例
- 实战分析一个崩溃的bug
- R实战:【实战分析】一个小散户的交易图谱
- 一个简单的HibernateCallback接口的调用
- Git 中对象模型和文件的详细视图
- perl 两个字符串输出相同但是比较失败
- AP 结帐
- vector入门
- 2013 阿里巴巴算法、数据工程师笔试题选解
- 一个简单接口的优化分析与实战
- 每个程序员需掌握的20个代码命名小贴士
- Linux的五个查找命令
- 3D效果-HTML+CSS
- hdu 1267 下沙的沙子有几粒?(卡特兰数 与1134思路相同)
- Binary Tree Level Order Traversal 二叉树按层遍历
- 【ASP】Win7环境下IIS的配置
- [汇文教育]iOS内支付(IAP)研究
- Maximum Depth of Binary Tree 二叉树的最大深度