记一次线上接口优化[7S --->0.3s以内]

前几天自己开发的一个系统。上线接入pinpoint 监控。发现每天网上0.30和2.0两个时间段。有几个接口响应非常慢大概是7S

结论: 通过Mybatis二级缓存进行优化

通过pinpoint平台。按个接口主要的时间是消耗在执行一个select查询
我第一反应就是:一个优化查询的机会到了
然后用explain一通操作。发现因为有一个查询 like了""字符串。那肯定是全表扫描。然后将语句改了。将空过滤掉了。优化后上线。发现晚上还是有查询需要5S钟
嘿嘿,看起来那个优化有效果。实际上,,确实有一点效果(完全是误打误撞)。但是原因根本就找错了。因为其实是全表查询,我那个表一共才几千条数据。也不慢的
EXPLAIN 分析查询执行计划
后面第二次分析:结合pinpoint平台。我发现慢查询所在的时间段TPS相对较高。然后我分析应该是因为表锁的原因。因为系统里面有个存储文章的表是用的MyISAM存储引擎,然后这个存储引擎只有表锁。那说明只要有在试图更新某一行的时候。会将整个表锁住。这就会导致我其他的查询语句也变慢。然后我就想到了利用mybatis的缓存进行优化。
原理:当有个请求是进行更新操作的时候,会锁住整张表,导致我的查询只能先等待。但是如果我使用缓存,直接从缓存取数据,不进行数据库查询。响应时间及会变短

这里又有个知识点:当进行更新。删除,新增操作的时候,是写入操作完成之后(就是事务结束),再清空缓存。所以我的优化是有效的。当你再写入过程中,我的查询直接从缓存取数据 这里存在:写入操作是在我的查询之前进行。但是我查询的缓存数据是写入完成之前的数据。因为我这里是资讯系统。即使有些微数据不一致。完全不影响

Mybatis一级缓存是默认开启的。但是一级缓存对我的场景来说没什么用处,一级缓存是SQLSession级别的。我不同请求的SqlSession是不一样的。两个SqlSession互相读取不到对方的缓存
我这里需要使用二级缓存,其实我就在XXXMapper.xml里面加了一个配置解决了问题:

<!--开启二级缓存-->
    <!--缓存 采用先进先出的方式,每120S刷新一次,最多存储256个引用,缓存只读 -->
    <cache eviction="FIFO" flushInterval="120000" size="256" readOnly="true"/>

二级缓存是mapper级别的。不同的SqlSession是可以共享缓存。

后序通过pinpoint监测,响应时间普遍在0.3s之内

总结经验:

  • 线上环境监控平台是必要的。不然有问题自己发现不了,出发等到用户报障
  • 要准确分析到问题所在,才进行优化。瞎猜是没用的
  • 平时积累各种知识点。这样在出了问题时候才能更快的定位到问题。不至于盲目,心慌
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值