缓存是性能优化常用的一种方法,通过存储之前操作的结果,以便后续请求可以使用这个存储的值,而不需花时间和资源重新计算该值。通常情况下,缓存可以消除不必要的到数据库或其他服务的往返通信,让结果返回得更快。如果使用得当,它可以带来巨大的性能好处。HTTP在处理大量请求时,伸缩性能如此良好的原因就是内置了缓存的概念。
对一个单体web应用来说,你可以选择在不同的地方使用多种不同的方式进行缓存。在微服务架构下,每个服务都有自己的数据源和行为,对于在何处以及如何缓存,我们有更多的选择。对于一个分布式系统,通常认为缓存可以放在客户端或服务端。
缓存三大类:
- 客户端缓存
- 代理服务器缓存
- 服务器端缓存
客户端缓存:
使用客户端缓存的话,客户端会存储缓存的结果。由客户端决定何时以及是否获取最新副本。理想情况下,下游服务将提供相应的提示,以帮助客户端了解如何处理响应,因此客户端知道何时以及是否需要发送一个新请求。
客户端缓存可以大大减少网络调用的次数,并且是减少下游服务负载的最快方法之一。但是使用由客户端负责缓存这种方式,如果你想改变缓存的方式,让大批消费者全都变化是很困难的。让过时的数据失效也比较棘手,尽管也有一些应对机制。
代理服务器缓存:
代理服务器缓存是将一个代理服务器放在客户端和服务器之间。反向代理或CDN是很好的使用代理服务器缓存的例子。
使用代理服务器缓存时,一切对客户端和服务器都是不透明的。这通常是增加缓存到现有系统的一个非常简单的方法。如果代理服务器被设计成对通用的流量进行缓存,它也可以缓存多个服务。一个常见的例子是,反向代理Squid或Varnish,它们可以缓存任何HTTP通信。在客户端和服务器间加入代理服务器,会引入额外的跳数,不过缓存本身带来的性能优化已经超过了其他额外的网络开销。
服务器端缓存:
服务器端缓存是由服务器来负责处理缓存,可能会使用像Redis或Memcached这样的系统。
使用服务器缓存,一切对客户端都是不透明的,它们不需要关心任何事情。缓存在服务器端,很容易了解一些类似数据是否失效这样的事情,还可以跟踪和优化缓存命中率。在你有多种类型客户端的情况下,服务器缓存可能是提高性能的最快方式。
很多面向大众的网站,都是混合使用这三种方法