一、需求

优化接口查询响应速度,尽量让尽可能多的数据从缓存中查询出来,减少db的读表操作。

二、待优化点

(1)优化缓存连接池配置

说明:因为频繁创建与销毁连接非常的消耗性能(创建Connection开销),使用连接池就能很好的解决连接创建频繁的问题,优化缓存连接池的配置参数,提高缓存查询效率。

blockWhenExhausted:设置连接池获取连接是否阻塞等待

maxWaitMillis:最大等待时间

maxTotal:最大连接数

连接池状态是否等待(blockWhenExhausted)获取连接最大时间
连接池已满无空闲连接True/FalsemaxWaitMillis/0
连接池未满无空闲连接True/FalseconnectionTimeout+maxWaitMillis/maxWaitMillis
连接池未满有空闲连接True/False0/0

解决方法:

合理的设置maxWaitMillis,不要让线程长时间阻塞,导致整个缓存不可用

合理的设置maxTotal的值,maxTotal不可设置为-1

上述配置参数都需要通过具体的压力测试来进行调整,根据测试日志来分析出一个最优值

(2)缓存连接释放

使用缓存操作类发现连接池不够用情况,排查发现操作类没有及时释放连接

解决方案:封装连接释放方法,在使用完之后及时调用,在catch finally中加上连接释放方法

(3) 防止缓存雪崩

说明:缓存雪崩是指在设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,导致所有的查询都落在数据库上,造成了缓存雪崩。

解决方案:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀,可通过在失效时间基础上增加一个时间范围值(全局可配置),通过随机取时间范围值中的一个时间长度累加到原来的失效时间上

(4)防止缓存穿透

说明:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞

解决方案:如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟

(5)使用管道批量查询

缓存批量查询对于client而言,就是一次批量的连续的write、read请求,client把请求一次性发送给server方,server方处理完成一次性返回给client

解决方案:

根据不同类型封装批量查询方法

批量查询代码如下:

(6)缓存热点数据

说明:缓存需设置失效时间,接口调用频繁的数据需保持在缓存中,尽可能做到接口查询能在缓存中全部查询出来,避免过多的db查询

解决方法:根据不同业务设置不同的失效时间,可通过业务key配置失效时间,当缓存数据被查询到时,需缓存key重置失效时间,保证热点数据常驻缓存

优化流程图:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注