购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.7 性能调优技术

1.7.1 缓存调优

在这个互联网高速发展的时代,为了缩短用户访问请求的响应时间,缓存的使用已经成为很多大型系统或者电商网站使用的一个关键技术。缓存的合理设计至关重要,它直接关系到一个系统或者网站的并发访问能力和用户体验。

1.缓存分类

缓存按照存放地点的不同,可以分为用户端缓存和服务端缓存,如图1-7-1所示。

图1-7-1

(1)用户端缓存:一般指的是个人计算机(PC)的浏览器缓存以及移动端手机APP的本地缓存等。例如,一些静态页面,除非重新部署否则平时一般不发生变更,那这种就可以设计到缓存中,而且一般静态页面如果每次访问的时候都需要去加载,那么在用户网络状况不佳时,会造成用户页面加载很慢,用户体验非常差。因此,所以我们一般看到的手机APP基本上都使用了大量的用户数据缓存。

(2)服务端缓存:可以包括Web中间件(比如Nginx或者Apache)的缓存、应用数据的缓存(比如Redis或者Memcached等内存数据库)。Web中间件的缓存主要用于存储一些前端的静态资源文件。应用数据缓存是指为了提高查询效率,避免每次查询相同的数据都需要去查询数据库,从而将数据缓存在内存数据库中。

应用数据缓存和数据库之间的交互一般如图1-7-2所示。从图中可以看到,应用程序服务器先查询缓存,如果缓存有数据,则直接返回;如果缓存中没有数据,则直接查询数据库,并将数据写入缓存中,以便下次直接访问缓存。

图1-7-2

注意,Redis是由C语言实现的一个内存数据库,相关的知识可以参考Redis官方网站:https://redis.io/。Memcached也是由C语言实现的一个内存数据库,相关的知识可以参考Memcached官方网站:http://memcached.org/。

2.缓存设计和调优的关键点

(1)如何让缓存的命中率更高?

· 缓存适合“读多写少”的业务场景。

· 根据实际业务设计最合适的缓存粒度,粒度过细则内存资源的成本会过高,粒度过粗则又会影响命中率。

· 设计最合适业务场景的缓存更新策略,如果缓存更新过慢,那势必会影响缓存的命中率,从而加大数据库的查询压力。

(2)如何防止缓存穿透?

缓存穿透是指用户查询时,总是存在大量的查询直接绕过缓存数据库而直接去查询底层数据库。要防止缓存穿透,可以参考以下几点:

· 数据空值缓存:将数据库中查询结果为空的缓存键也存储到缓存中,避免空值时重复查询数据库。

· 对于不存在的数据,也设置缓存:建议可以设置一个较短的过期时间,从而减轻数据库的查询压力,因为数据是否存在只有查询了数据库才能确定,如果提前就在缓存中设置了,那查询不存在的数据时,就可以在缓存层过滤掉。

· 避免大量的缓存数据同时失效或过期:如果大量的缓存数据同时失效或过期,就会导致大量请求直接查询数据库。

(3)如何控制好缓存的失效时间和失效策略?

由于缓存数据库一般都是将数据存储在内存中,但是内存一般都是有大小限制的,因此现实中需要根据实际的业务场景,选择最适合的缓存失效策略。常见的缓存失效策略说明如下:

· FIFO(先进先出):在数据超出缓存数据库的最大容量时,优先清理最早进入缓存的数据。

· LIFO(后进后出):与FIFO刚好相反,这个策略会优先清理最后进入缓存的数据,这种策略一般用得很少,只有存在特殊的业务场景才使用。

· LRU(最久不被使用):在数据超出缓存数据库的最大容量时,优先清理最久时间未被访问的数据。

· MRU(最近使用):与LRU刚好相反,MRU会清理最近被使用的数据。

· LFU(最不常用):在数据超出缓存数据库的最大容量时,优先清理总访问次数最少的数据。

(4)如何做好缓存的监控分析?

可以通过慢日志(Slow Log)分析、连接数监控、内存使用监控等多种方式,做好缓存的监控分析。比如,通过慢日志可以看到在查询哪条数据时,查询时间最久;通过监控内存的使用,可以看到哪些数据经常被访问,哪些数据不经常被访问,以及哪些数据正在从缓存中失效而被移出缓存。

(5)如何防止缓存雪崩?

缓存雪崩指的是服务器在出现断电等极端异常情况后,缓存中的数据全部丢失,导致大量的请求需要从数据库中直接获取数据,使数据库压力过大从而造成数据库崩溃。防止缓存雪崩需要注意:

· 要处理好缓存数据全部丢失后,如何能快速地把数据重新加载到缓存中。

· 缓存数据的分布式冗余备份,当出现数据丢失时,可以迅速切换使用备份数据。

· 设置多级缓存机制,从而避免某级缓存雪崩后,所有的请求直接去查询数据库。 CZHhPIP1CuQ70FIvGrQIPuwcgtt5A/FlcRKbrXq1QshgkAbNjIRY85t3xZGRjH5R

点击中间区域
呼出菜单
上一章
目录
下一章
×