多级缓存如何应用
什么是多级缓存
提到多级缓存,很多人第一时间想到通过Guava本地缓存+Redis分布式缓存组成的二级缓存。其实,多级缓存可并不只是这两层,在一些场景中,可能有很多层。
下面以一个电商的秒杀场景举例,说一说一个多级缓存的真实应用场景。
客户端缓存
首先,离用户最近的一定是客户端了,比如我们使用的手机、电脑等,在手机上的APP以及电脑的浏览器 ,都是可以支持做缓存的。秒杀场景中,比较典型的客户端缓存的例子就是秒杀页面的倒计时。当用户第一次访问秒杀页面的时候,会向后端服务器请求查询秒杀开始时间,然后这个时间就可以在客户端进行缓存下来了。然后客户端自己就可以基于这个开始时间做倒计时了。设想一下,如果每一秒钟都要向后端发送请求,那么请求量实在是太大了,所以通过客户端缓存的方式,可以大大降低后端服务器的压力。
CDN缓存
秒杀活动中,有很多商品相关的信息,比如商品的图片信息,这些前端的静态资源其实变化的频率并不是很高,那么其实就可以通过CDN来做缓存。这些静态资源,如图像、HTML、JavaScript 和视频。提前放到CDN中,让用户可以就近的访问到CDN快速的拿到静态资源。
Nginx缓存
在客户端及CDN缓存的基本都一些静态的数据,但是还是有很多数据不适合做缓存的,那么这时候用户请求过来的话就要发送到后端服务器中。而在请求给到服务器之前,会先经过Nginx做负载均衡。为了提升请求的效率,降低对后端服务器的压力,很多时候我们也会在Nginx中做一些缓存。比如一些静态资源,除了放到CDN中,Nginx中也可以缓存一份,当没有CDN的时候,可以优先到Nginx中获取。在秒杀场景中,我们需要做一些用户的鉴权,比如用户是否登录,是否是黄牛用户,用户的IP是否被封禁。这些信息一般是放在Nginx中的,可以在这里面做一些前置的校验,把一些非法的请求就直接都给拒绝掉了。
Web App 缓存
当Nginx请求过滤之后,有些合理请求就需要发送到Web App当中,这时候就会涉及到很多具体的业务逻辑了。但是,应用当中也会经常使用本地缓存来提升查询效率。但是本地缓存我们都知道,可能存在不一致的问题, 所以这里面存储的信息一般是变化没那么频繁的。比如一次秒杀活动的开始和结束时间、比如秒杀的用户的用户等级这些信息,基本都是变化没那么频繁的,就可以放到本地缓存中,可以快速的读取。
分布式缓存
有些数据因为要考虑他的一致性,所以没办法放到本地缓存中,比如商品库存,这种就需要放到分布式缓存中,比如Redis。在秒杀场景中,我们经常使用Redis来做库存扣减,其实这就是利用了Redis来做缓存的一种具体案例。