cache is king
在IT领域当两个部件速度上衔接不好时就会使用缓存,比如
- 硬盘和内存之间的加了固态硬盘,
- 在内存和CPU之前加了一级、二级、三级缓存
- 在负载均衡和web集群之间加缓存varnish
- 在web集群和数据库之间加memcache或是redis
- 客户端和网站之间加了CDN
缓存的根本原理:
缓存是根据什么来提升网站的速度的呢?任何缓存的本质其实都差不多,都是根据数据的局部性来进行预加载,使得客户端请求在缓存上就实现命中,无需再向后端请求。
程序运行具有局部性特性:
-
时间局部性:一个数据被访问之后,可能会很快被再次访问。
-
空间局部性:一个数据被访问时,其周边的数据也有可能被访问到。
加上缓存之后能立刻提升网站的速度吗?
缓存不会立刻提升访问速度,因为我们无法预判断用户会访问哪些热点数据,通常只有当用户访问了一段时间之后,缓存算法加载一些页面到缓存,缓存的页面被不断命中之后,网站的访问速度再来有所提升。为了能够让缓存上线后能立刻能够使用,有时候需要“缓存热身”,就是用压力测试先压一下,让缓冲当中有数据,再开放到用户访问。
缓存中的数据会一直生效吗?
有两种情况下缓存会失效,如下:
- 当缓存空间快要用光的时候,这个时候会触发一个缓存的清理算法(LRU最近最少访问访问算法)
- 缓存也是有时效性的,时效是我们自己设置的,就像是DHCP当中的ACK报文当中的时效类似,这种失效是有必要的,比如我们后端的源数据有了变化,要保证用户访问的数据是最新的,如果前端缓存一直不失效,那用词岂不是一直无法访问到最新的页面。
如何评价缓存的有效性呢?
-
页面命中率,也就是命中页面的数量,当时是越多越好。
-
字节命中率,字节命中率就是命中的字节,当然是命中的字节越多越好。
公有缓存和私有缓存?
公有缓存就是所有的用户都可以使用的,而私有缓存就是用户私人的。
我们做为运维人员管理缓存时的一个重要任务就是区别哪些是公有缓存,哪些是私有缓存,如果有些明明是公有缓存的内容却被私有访问了,那我们就要移除其私有标识,将其更改为公有缓存。
缓存仅仅只是缓存吗?
http协议的缓存要先是一个代理,其次才是一个缓存,典型代表就是nginx和varnish。
还又另一种缓存,就仅仅是缓存,并不充当代理,典型代表就是memcache和reis。
缓存的部署方式:
-
代理缓存,收到请求之后,如果没命中,缓存自己先去找后端服务器,找到结果之后再通过缓存返回到客户端。
-
旁挂缓存,命中缓存就返加,没命中的话让客户端自己去找,客户端决定是否缓存,要求智能客户端,好的产品要把用户当傻瓜的,所以不推荐这种部署方式。
varnish是什么?是用来做什么的?
varnish可以实现负载均、代理、缓存,最厉害的还是缓存,通常varnish都是和nginx配合起来使用。
使用nginx专门来做负载均衡和web,使用varnish专门用来做缓存。
中型企业典型架构:
如果负载均衡是nginx的话,最好使用一致性
hash uil
,以免缓存服务器变动导致雪崩效应。
有同学问我说,怎么缓存还要连接动态集群呢?是因为“静态图片”那组服务器只是存储图片,像是css、js这种文件,不会存放到“静态图片”组服务器上,也需要http缓存当代理去动态WEB集群上去取,然后才能做缓存的。