开发者学堂课程【企业级互联网分布式系统应用架构学习:应用层缓存提升性能】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/369/detail/4392
应用层缓存提升性能
内容介绍:
一、应用性能瓶颈
二、应用性能瓶颈解决方案
三、缓存应用场景
一、应用性能瓶颈
1、在前面的章节有关于提高应用并发度的方案已经学习到通过应用层的横向扩展来达到资源的补充,这样可以再一定程度上提高应用的并发度。从应用的视角去看,应用性能瓶颈会发生在应用层和数据库层之间。由于业务的复杂度、调用频率以及每次调用的数据量这些因素的问题,往往会导致应用和数据库之间产生一些性能上的瓶颈。
2、所以为了解决这个问题,通常会把一些常用到的信息从数据库中取出,缓存在应用层中,应用在下一次需要这些数据的时候,不需要再从数据库取这些数据,这样就会大大缓解性能瓶颈的问题。
二、应用性能瓶颈解决方案
1、使用应用缓存能够很好的解决数据库无法横向扩展的问题,从下图中可以看出
当使用应用缓存以后,用户发起的第二次请求这些需要的数据,可以从应用缓存中直接获取,而不必从数据库中重新获取。使用应用缓存现在有很多技术手段,通常应用缓存会有这样几个特性,第一个基本上都是基于 KValue,也就是键值存储模式,然后使用高性能分布式的内存缓存服务,可以更好地为动态 Web 应用提供服务,以减轻数据库的负担。第二,通过在内存中的缓存数据来减少数据库读取的次数,这样可以提高数据网站的速度。第三,应用缓存能够支持多种语言来编写,比如现在经常用到的 JAVA、PLP 以及其他的一些语言。第四,使用应用缓存更加适合于动态 Web 网站的热点数据缓存。
2、下面对热点数据做一个解释,比如说在一个电商网站,用户的基本信息是一个热点数据。通常会把用户信息放在数据库的用户表里,当用户登录这个电商网站的时候,该用户对应的数据就会从数据库里面取出。如果没有使用应用缓存,客户每一次在页面上的操作,比如说要浏览某一个产品,或者要将某一个产品放到购物车产生订单或者支付,那每次操作都需要应用从数据库将用户的基本信息取出,并送到应用端。这样就会对数据库造成很大的压力,这些热点数据,因为他不经常变化,所以可以将它从数据库第一次访问的时候取出,放到应用缓存里,后续用户所有的操作只要用到这些数据,都可以从应用缓存中直接取出,这样就可以大大的加速应用的访问速度。
3、此外,应用缓存适用的一些场景就是对数据访问速度要求较高场景,同时,这些数据更新的频率一定要低,更新频率过高的数据不太适合放在应用缓存中,比如说产品的库存,每一个用户购买后库存都要进行扣减,这些数据一个对以追性要求很高,同时它更新频率很快,放在应用缓存里就不是最佳的方案。
三、缓存应用场景
1、场景1:为数据库减负并增加并发度
缓存应用最主要的场景是为数据库减负,这样可以更好地增加应用的并发度。数据库是一个很难横向扩展的平台,最好的数据库可能也只是在实例级别进行扩展,最终数据的存储也都是统一的。为了解决这个问题,就有缓存的场景,如图所示
希望从数据库中取某一个变量的值,在没有应用缓存的时候,每一次应用需要得到这个值的时候,一定要发起一个数据库的查询,然后取到这个变量的值。一旦有缓存以后,应用的逻辑就会发生改变,他会先判断缓存中有没有这个变量,如果有的话就直接取出来,如果没有或这个缓存没有命中,在真正发起数据库的访问,这时候再把这个变量的值取出来,取出来返回应用的同时,这个变量的值也会把它设置到缓存中去,下一次再用到这个变量的时候,直接从缓存中取。
所以通过这样的处理,大量的数据库的查询语句,就可以去掉或者完全不被数据库所接收到。通常都有应用缓存直接将数据返回回去。另外,因为缓存平台是将数据放在内存里的,它的 QPS,也就是每秒钟响应的请求数比数据库支撑的会更高,所以,从应用缓存中取数据,他的响应时间通常比数据库会更快,这样也可以更好的增加应用的并发度。
2、场景2:临时数据存储
下一个场景就是缓存能够临时的对数据进行存储,从下图中可以看到
从负载均衡器,或者是负载均衡服务到后端的弹性计算资源,或者叫应用服务器,他们之间有一个流量分发或者转发的关系。在应用服务器层,通常也会缓存一些信息,在以往的架构里面,通常会把用户的会话信息存放在应用服务器中,也就是经常提到的 HDPP 的 session,把 session 或把会话信息放在应用服务器,可能会有一个问题,就是当这台应用服务器出现故障以后,用户的会话信息可能会丢失掉。导致的结果就是用户可能需要浏览器重新登录,才能做下一次的操作。所以在现在很多的应用设计中,会把类似于 session 或会话信息的这样的临时数据,存放到一个集中的存储中,或者说集中的应用缓存中,这样应用服务器就不用再存储这些临时数据了。
带来的好处就是任何一台应用服务器出现问题,都可以随时移除掉,不会对前端的用户产生任何影响。这个也是缓存应用对应用架构带来的调整,使得整个应用没有和这些会话信息或数据没有任何关系,可以随时增加或减少应用服务器的数量。
对阿里云来讲,目前已经有几款和应用缓存相关的一些产品,举两个例子,第一个就是云数据库 Memcache 版,现在在互联网整个架构设计中,很多架构师都会用到 Memcache。
阿里云就把它作为一个 pass 平台,提供给用户,用户就不需要自己搭建这个平台了。
另外一个产品是云数据库 Redis 版,Redis 现在已经是一个互联网应用架构中间用的非常广泛的一个产品。
通过 Redis 可以做一些数据的缓存,尤其是键值存储,就是通常讲的 KValue 数据架构的存储,都可以用这个产品来实现。
这两个产品在选择过程中需要有一个注意的地方,Memcache 版数据不存储在磁盘中,就是不会把缓存的数据落到磁盘上,Redis 最终会把这些数据存储在磁盘中。这两个产品在使用过程中需要注意他的差别。
这一章节主要学习使用应用缓存来提高应用的并发度,这里面主要介绍了在应用和数据库之间,放入一个应用缓存台,这样一些热点数据可以通过应用缓存直接返回到客户端,避免降低数据库的压力,避免应用长时间在数据库层等待导致客户的响应速度变慢。