浏览器缓存
这是离用户最近的可以作为缓存的地方,而且借助的是用户的“资源”(缓存的数据在用户的终端设备上),性价比可谓最好,让用户帮你分担压力!
当你打开浏览器的开发者工具,看到from cache或者from memory cache、from disk cache的时候,就意味着这些数据已经被缓存在了用户的终端设备上了(没网的时候也能访问到一部分内容就是这个原因)。
这个过程是浏览器替我们完成的,一般用于缓存图片、js、css这些。我们可以通过Http消息头中的Cache-Control来控制它,具体细节这里就不展开了。
js里的全局变量、以及cookie等运用也属于该范畴。
浏览器缓存是在于用户侧的缓存点,所以我们对其的掌控力就差很多,在没有发起新请求的情况下,你无法主动去更新数据。
CDN缓存
提供CDN服务的服务商,在全国甚至是全球部署着大量的服务器节点(可以叫做「边缘服务器」)。
那么将数据分发到这些遍布各地服务器上作为缓存,让用户访问就近的服务器上的缓存数据,就可以起到分摊和假宿效果。
但是需要注意,由于节点众多,更新缓存数据比较缓慢,一般至少是分钟级别。所以一般仅适用于不经常变动的静态数据。
解决方式也是有的,就是在url后面带个自增数或者唯一标示,如?v=1001。因为不同的url会被视作“新”的数据和文件,被重新create出来。
网关(代理)缓存
到这里做缓存就是在你自己的地盘.很多时候我们会在源站前面架一层网关(或者说反向代理,正向代理),为的是做一些安全机制或者统一分流策略的入口.
同时这里也是做缓存的一个好场所。毕竟网关是“业务无关性”的,它能够拦下来的请求,对背后的源站也是很大的受益,减少了大量的CPU运算。
常用的网关(代理)缓存有Varnish,Squid,Ngnix。一般情况下,简单的缓存运用场景,用nginx即可,因为大部分时候我们会用它来做负载均衡,能少引入一个技术就少一份复杂度嘛。如果是大量的小文件可以使用Varnish,而Squid则相对大而全,运用成本也更高一些。
进程内缓存
一个请求能走到这里说明他是和"业务相关"的,需要经过业务逻辑运算.
也正因为如此,从这里开始对缓存的引入成本比前面三种大大增加.因为对缓存与数据库之间的"数据一致性"要求更高.
进程外缓存
技术redis之类的,甚至也可以自己单独写一个程序来专门存放缓存数据,供其他程序远程调用.
数据库缓存
数据库本身自带缓存模块的,基本上你给多少内存它就吃多少内存.