位置:编程技术网 > 数据库 > 正文 >

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

2019年07月20日 10:29来源:未知手机版

圣淘沙,黄葛树,陈冠希有舔阿娇阴部

只要是位正儿八经的程序员应该都知道“缓存”是什么,当然,这里讨论的是指软件层面的缓存。

大家都知道的一点是,缓存可以让原本打开很慢的页面,变得能“秒开”。你平时访问的 APP 与网站几乎都有涉及到缓存的运用。那么,缓存除了能加速数据的访问之外,还有什么作用呢?

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

本文接下来就给大家分享一下如何理解缓存,以及它的运用思路,希望对你有所启发。

缓存能做什么?

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

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

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

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

预读取

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

为什么要这样做呢?因为有些系统一旦启动就要面临上千上万的请求进来(在一些 toC 的项目尤其如此),如果直接让这些请求打到数据库上,非常大的可能是数据库压力暴增,直接被干趴,无法正常响应。

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

可能你会问,哪怕用了缓存还是扛不住呢?那就是做横向扩展+负载均衡的时候到了,这不是本文讨论的内容,有机会再专门分享吧。

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

延迟写

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

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

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

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

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

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

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

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

哪里可以加缓存?

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

本文地址:http://www.reviewcode.cn/shujuku/58726.html 转载请注明出处!

今日热点资讯