缓存策略基本框架:
1.客户端缓存
a.页面缓存
页面缓存:一是指页面自身对某些元素或全部元素的缓存,二是指服务端将静态页面或动态页面的元素进行缓存。一般是指页面自身的缓存或离线应用缓存。即将之前渲染的页面保存为文件,当用户再次请求时可以避免网络访问,从未减少负载,提升性能及用户体验。
HTML5支持了离线缓存和本地存储,使得网页可以离线使用。
b.浏览器缓存
浏览器缓存工作规则:检查以确保副本是最新的,通常只需要一次会话。浏览器会在硬盘上专门开辟一个空间来存储资源副本作为缓存。
首次加载:
再次加载:
c.app缓存
APP可以将内容缓存在内存,文件或本地数据库。
使用数据库缓存的方式是:在下载完数据文件之后,把文件的相关的信息,如URL/路径/下载时间/过期时间等存放到数据库,下次下载的时候根据URL先从数据库中查询。
使用文件缓存的方式是:使用文件操作的相关API得到文件的最后修改时间,与当前时间判断是否过期,从而实现缓存效果。
2.网络中的缓存
a.web代理缓存
HTTP代理分为正向代理、反向代理和透明代理;
正向代理:服务器代理客户端去访问其他的服务器,这个服务器是存在于客户端和源始服务器之间,客户端隐藏于代理服务器的后面充当幕后主使。源始服务器所看到的是它在代理服务器服务器进行交互,而不知道客户端的存在。一般用在web缓存技术中。
举个例子:
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告 诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
反向代理:与正向代理相反,此时是源始服务器藏在代理服务器后面,客户端看到的是自己在与代理服务器交互,而不知道源始服务器的存在。可以隐藏保护源始服务器资源。在负载均衡中使用反向代理技术来减小服务器压力。在CDN(分布式集群管理)的核心技术中也用到了反向代理。
(1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击
大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。
(2)负载均衡,通过反向代理服务器来优化网站的负载
透明代理:客户端根本不需要知道有代理服务器的存在它改变你的request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。当用户服务器提交请求的时候,透明代理设备根据自身策略拦截并修改用户的报文,并作为实际的请求方,向服务器送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户。
b.边缘缓存
即反向代理缓存。
3.服务端缓存
a.数据库缓存
mysql的查询缓存:Query cache
b.平台级缓存
使用那些带有缓存特性的应用框架,如Ehcache,JBoss Cache,或者可用于缓存的专用库。
c.应用级缓存
主要指面向Redis的缓存应用。
4.缓存基本概念
a.命中与回源
当用户发起一个请求,我们的应用接受这个请求,并且如果是在第一次检查缓存的时候,需要去数据库读取产品信息。如果在缓存中,一个条目通过一个标记被找到了,这个条目就会被使用、我们就叫它缓存命中。
如果没有命中缓存,就需要从原始地址获取,这个步骤叫做“回源”。回源的代价是高昂的,只有尽可能减少回源才能更好的发挥缓存的作用,但受限于缓存设备的成本,不能仅仅增加缓存容量,只能在成本和回源率之间寻求一个平衡点。
b.缓存未命中(Cache Miss)
如果还有缓存的空间,那么,没有命中的对象会被存储到缓存中来。
如果缓存满了,而又没有命中缓存,那么就会按照某一种策略,把缓存中的旧对象踢出,而把新的对象加入缓存池。而这些策略统称为替代策略(缓存算法),这些策略会决定到底应该踢出哪些对象。
c.存储成本
当没有命中时,我们会从数据库取出数据,然后放入缓存。而把这个数据放入缓存所需要的时间和空间,就是存储成本。
d.失效
当存在缓存中的数据需要更新时,就意味着缓存中的这个数据失效了。
5 缓存算法
a.LFU(Least Frequently Used)
根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。
b.LRU(LeastRecently User)根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
c.FIFO(First inFirst out)
最先进入的数据,最先被淘汰。一个很简单的算法。只要使用队列数据结构即可实现。那么FIFO淘汰算法基于的思想是”最近刚访问的,将来访问的可能性比较大”