加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

程序员都不知道的缓存秘密,看完,秒懂缓存

发布时间:2019-07-12 23:30:46 所属栏目:MySql教程 来源:IT技术研习社
导读:副标题#e# 只要是干程序的都知道缓存是什么,甚至是跟IT相关行业各种人员都时不时冒出一句,系统慢可以加缓存呀,比如测试组的小姐姐,运营组的小妹妹,产品组的小哥哥。但缓存真的这么这么简单,人人都会用吗? 大家都知道的一点是,缓存可以让原本打开很慢
副标题[/!--empirenews.page--]

只要是干程序的都知道"缓存"是什么,甚至是跟IT相关行业各种人员都时不时冒出一句,系统慢可以加"缓存"呀,比如测试组的小姐姐,运营组的小妹妹,产品组的小哥哥。但缓存真的这么这么简单,人人都会用吗?

大家都知道的一点是,缓存可以让原本打开很慢的页面,变得能"秒开"。你平时访问的APP、网站几乎都有涉及到缓存的运用。

那么,缓存除了能加速数据的访问之外,还有什么作用呢?

另外,任何事物都有两面性,我们如何才能将缓存的优点发挥得淋淋尽致,同时避免掉到它的弊端中呢?

文章从如下几方面探讨缓存

1. 缓存能做什么?

2. 什么地方可以加缓存?

3. 缓存是Silver bullet吗?

1、缓存能做什么?

正如前面所说,大家最普遍的理解就是当我们遇到某个页面打开很慢的时候,会想到引入缓存,这样页面打开就快了。

其实快和慢都是相对的,从技术角度来说,缓存之所以快是因为缓存是基于内存去建立的,而内存的读写速度比硬盘快X倍,所以用内存来代替硬盘作为读写的介质自然能大大提高访问数据的速度。

这个过程大致是这样的,通过在内存中存储访被问过的数据供后续访问时使用,以此来达到提速的效果。

程序员都不知道的缓存秘密,看完,秒懂缓存

其实除此之外,缓存还有另外2个重要的使用方式,预读取 和 延迟写。

预读取

预读取就是预先读取将要载入的数据,也可以称作「缓存预热」。就是在系统对外提供服务之前,先将硬盘中的一部分数据加载到内存中,然后再对外提供服务。

程序员都不知道的缓存秘密,看完,秒懂缓存

这样做的原因是因为有些系统一旦启动就要面临上千上万的请求进来,如果直接让这些请求打到数据库上,非常大的可能是数据库压力暴增,直接被干趴,无法正常响应。

为了缓解这个问题,需要通过 预读取 来解决。

可能你会问,哪怕用了缓存还是扛不住呢?那就需要做横向扩展+负载均衡了。

如果说 预读取 是在 数据出口 加了一道前置的缓冲区的话,那么顾名思义,下面要说的 延迟写 就是在 数据入口 后面加了一道后置的缓冲区。

延迟写

大家都知道,数据库的写入速度是慢于读取速度的,因为写入的时候有一系列的保证数据准确性的机制。

所以,如果想提升写入速度的话,要么做分库分表,要么就是通过缓存来进行一道缓冲,再一次性批量写到磁盘,以此来提速。

由于分库分表对跨表操作以及多条件组合查询的副作用巨大,所以引入它的复杂度远大于引入缓存,我们应当优先考虑引入缓存的方案。

那么,通过缓存机制来加速"写"的过程就可以称作 延迟写。就是预先将需要写入到磁盘或者数据库的数据,先暂时写入到内存,然后就返回成功。再定时将内存中的数据批量写入到磁盘。

程序员都不知道的缓存秘密,看完,秒懂缓存

可能你会想,写到内存就认为成功,万一中途出现意外、断电、停机等导致程序异常终止的情况,数据不就丢了吗?

是的。所以,延迟写 一般仅用于对数据完整性要求不是那么苛刻的场景。比如点赞数啊、参与用户数啊等等,可以大大缓解对数据库频繁修改所带来的压力。

其实在我们熟知的分布式缓存Redis中,其默认运用的持久化机制——RDB,也是这样的思路。

在一个成熟的系统中,能够运用到缓存的地方其实并不是一处。下面Z哥就来帮你梳理一下我们在哪些地方可以"加缓存"。

哪里可以加 缓存 ?

首先搞清楚一个事情,我们要缓存什么?也就是符合什么特点的数据才需要加缓存?毕竟加缓存是一个额外的成本投入,得物有所值。

一般来说你可以用这两个标准来判断:热点数据,即被高频访问,如几十次/秒以上、静态数据,即很少变化,读远大于写,如几天变更一次。

接下去就可以替它们找到合适的地方加缓存了。

缓存的本质是一个"防御性"的机制,而系统之间的数据流转是一个有序的过程。所以,选择在哪里加缓存就相当于选择在一条马路的哪个位置设路障。在这个路障之后的道路都能受到保护,不被车流碾压。

那么在以终端用户为起点,系统所用的数据库为终点的这条道路上可以作为缓存设立点的位置大致有以下这些。

程序员都不知道的缓存秘密,看完,秒懂缓存

每个设立点可以挡掉一些流量,最终形成一个漏斗状的拦截效果,以此保护最后面的系统以及最终的数据库。

程序员都不知道的缓存秘密,看完,秒懂缓存

下面小划帽简要描述下每一个的运用场景以及需要注意的点。

浏览器缓存

这是离用户最近的可以作为缓存的地方,而且借助的是用户的"资源"(缓存的数据在用户的终端设备上),性价比可谓最好,让用户帮你分担压力。

程序员都不知道的缓存秘密,看完,秒懂缓存

当你打开浏览器的开发者工具,看到from cache或者from memory cache、from disk cache的时候,就意味着这些数据已经被缓存在了用户的终端设备上了(没网的时候也能访问到一部分内容就是这个原因)。

这个过程是浏览器替我们完成的,一般用于缓存图片、js、css这些。我们可以通过Http消息头中的Cache-Control来控制它,具体细节这里就不展开了。

js里的全局变量、以及cookie等运用也属于该范畴。

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

CDN缓存

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

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

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

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

网关(代理)缓存

(编辑:PHP编程网 - 黄冈站长网)

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

热点阅读