加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

缓存有那么多种,分别是干什么的?

发布时间:2019-07-16 17:00:51 所属栏目:建站 来源:张
导读:只要是位正儿八经的程序员应该都知道缓存是什么,甚至我司的很多做运营的小姐姐现在和程序员小哥哥交流中都时不时冒出缓存这个词,让人压力山大。 当然,这里讨论的是指软件层面的缓存。大家都知道的一点是,缓存可以让原本打开很慢的页面,变得能秒开。你

这个过程是浏览器替我们完成的,一般用于缓存图片、js 与 css 这些资源,我们可以通过 Http 消息头中的 Cache-Control 来控制它,具体细节这里就不展开了。此外,js 里的全局变量、cookie 等运用也属于该范畴。

浏览器缓存是在于用户侧的缓存点,所以我们对它的掌控力会比较差,在没有发起新请求的情况下,你无法主动去更新数据。

CDN 缓存

提供 CDN 服务的服务商,在全国甚至是全球部署着大量的服务器节点(可以叫做“边缘服务器”)。

那么将数据分发到这些遍布各地服务器上作为缓存,让用户访问就近的服务器上的缓存数据,就可以起到压力分摊和加速效果。这在 toC 类型的系统上运用,效果格外显著。

但是需要注意的是,由于节点众多,更新缓存数据比较缓慢,一般至少是分钟级别,所以一般仅适用于不经常变动的静态数据。

  • 题外话:解决方式也是有的,就是在 url 后面带个自增数或者唯一标示,如 ?v=1001。因为不同的 url 会被视作“新”的数据和文件,被重新 create 出来。

网关(代理)缓存

到这里做缓存就是在你自己的地盘了。很多时候我们会在源站前面架一层网关(或者说反向代理、正向代理),为的是做一些安全机制或者作为统一分流策略的入口。

缓存有那么多种,分别是干什么的?

同时这里也是做缓存的一个好场所,毕竟网关是“业务无关性”的,它能够拦下来请求,对背后的源站也有很大的受益,减少了大量的 CPU 运算。

常用的网关(代理)缓存有 Varnish、Squid 与 Ngnix。一般情况下,简单的缓存运用场景,用 Nginx 即可,因为大部分时候我们会用它来做负载均衡,能少引入一个技术就少一份复杂度。如果是大量的小文件可以使用 Varnish,而 Squid 则相对大而全,运用成本也更高一些。

进程内缓存

可能我们大多数程序员第一次刻意使用缓存的场景就是这个时候。

一个请求能走到这里说明它是“业务相关”的,需要经过业务逻辑的运算。

也正因为如此,从这里开始对缓存的引入成本比前面 3 种大大增加,因为对缓存与数据库之间的“数据一致性”要求更高了。

进程外缓存

这个大家也熟悉,就是 Redis 与 Memcached 之类,甚至也可以自己单独写一个程序来专门存放缓存数据,供其它程序远程调用。

这里先多说几句关于 Redis 和 Memcached 该怎么选择的思路。

对资源(cpu、内存等)利用率格外重视的话可以使用 Memcached,但程序在使用的时候需要容忍可能发生的数据丢失,因为是纯内存的机制。如果无法容忍这点,并且对资源利用率也比较豪放的话可以使用 Redis。而且 Redis 的数据库结构更多,Memcached 只有 key-value,更像是一个 NoSQL 存储。

数据库缓存

数据库本身是自带缓存模块的,否则也不会叫它内存杀手,基本上你给多少内存就能吃多少。数据库缓存是数据库的内部机制,一般都会给出设置缓存空间大小的配置来让你进行干预。

最后,其实磁盘本身也有缓存。所以你会发现,为了让数据能够平稳地写到物理磁盘中真的是一波三折,不知道什么时候可以有“快”到不需要程序来考虑缓存的磁盘出现来拯救我们程序员呢。

缓存是银弹吗?

可能你会想缓存那么好,那么应该多多益善,只要慢就上缓存来解决?

一个事物看上去再好,也有它负面的一面,缓存也有一系列的副作用需要考虑。除了前面提到的“缓存更新”和“缓存与数据的一致性”问题,还有诸如下边的这些问题:

  1. 缓存雪崩。在大量的请求并发进入时,由于某些原因未起到预期的缓冲效果,哪怕只是很短的一段时间,导致请求全部流转到数据库,造成数据库压力过重。解决它可以通过“加锁排队”或者“缓存时间增加随机值”。
  2. 缓存穿透。和“缓存雪崩”比较类似,区别是这会持续更长的时间,因为每次“cache miss”后依然无法从数据源加载数据到缓存,导致持续产生“cache miss”。解决它可以通过“布隆过滤器”或者“缓存空对象”。
  3. 缓存并发。一个缓存 Key 下的数据被同时 set,怎么保证业务的准确性?再加上数据库的话呢?进程内缓存、进程外缓存与数据库三者皆用的情况下呢?用一句话来概括建议的方案是:使用“先 DB 再缓存”的方式,并且缓存操作用 delete 而不是 set。
  4. 缓存无底洞。虽然分布式缓存是可以无限横向扩展的,但是,集群下的节点真的是越多越好吗?当然不是,缓存也是符合“边际效应递减”规律的。
  5. 缓存淘汰。内存总是有限的,如果数据量很大,那么根据具体的场景定制合理的淘汰策略是必不可少的,如 LRU、LFU 与 FIFO 等等。

所以缓存不是银弹,对缓存的使用也需要先考虑各种问题。总结一下,本文先向你介绍了运用缓存的三种思路,然后梳理了在一个完整的系统中可以设立缓存的几个位置,并且分享了关于浏览器、CDN 与网关(代理)等缓存的一些使用经验,没有具体展开来讲细节,只是希望你对缓存有一个更加体系化的认识,希望能让你看得更加全面。

作者介绍

张帆(Zachary),7 年电商行业经验,5 年开发团队管理经验,4 年互联网架构经验,目前任职某垂直电商技术总监。专注大型系统架构与分布式系统,坚持用心打磨每一篇原创。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读