缓存的概念(二)

缓存是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些。

一、缓存的概念

许多人认为,“缓存”是内存的一部分,许多技术文章都是这样教授的,但是还是有很多人不知道缓存在什么地方,缓存是做什么用的。

其实,缓存是CPU的一部分,它存在于CPU中,CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大。

缓存是为了解决CPU速度和内存速度的速度差异问题,内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多。

  • 缓存、内存都是RAM,一级缓存是静态RAM,二级缓存是高速动态RAM,内存是常规动态RAM.

这里要特别指出的是:
1.因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速度就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。

2.因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的。

二,一级缓存和二级缓存

RAM:随机存取存储器(Random Access Memory),也叫主存,RAM是掉电以后,信息会消失

ROM:只读内存(Read-Only Memory),在掉电以后信息也不会消失那一种。

RAM又分两种:

一种是静态RAM,SRAM;一种是动态RAM,DRAM。静态RAM的存储速度要比动态快得多,我们现在使用的内存一般都是动态RAM。

有的菜鸟就说了,为了增加系统的速度,把缓存扩大不就行了吗,扩大的越大,缓存的数据越多,系统不就越快了吗

缓存通常都是静态RAM,速度是非常的快,但是静态RAM集成度低(存储相同的数据,静态RAM的体积是动态RAM的6倍),价格高(同容量的静态RAM是动态RAM的四倍),由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为,但是为了提高系统的性能和速度,我们必须要扩大缓存,这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存,这些高速动态RAM速度要比常规动态RAM快,但比原来的静态RAM缓存慢,我们把原来的静态ram缓存叫一级缓存,而把后来增加的动态RAM叫二级缓存。

一级缓存和二级缓存中的内容都是内存中访问频率高的数据的复制品(映射),它们的存在都是为了减少高速CPU对慢速内存的访问。
通常CPU找数据或指令的顺序是:先到一级缓存中找,找不到再到二级缓存中找,如果还找不到就只有到内存中找了

 

三、缓存的几个基本术语

  • 缓存命中(Cache hit),缓存未命中(Cache miss)

  • 命中率

当客户发起一个请求(我们说他想要查看一个产品信息),我们的应用接受这个请求,并且如果是在第一次检查缓存的时候,缓存中没有这个数据,那么就需要去数据库读取产品信息,这个称为缓存命中。命中率,就是100次访问请求100条数据,在缓存中可以得到的有80条数据,那么这个时候缓存命中率就是80%。

  • 缓存算法

如果还有缓存的空间,那么,没有命中的对象会被存储到缓存中来。如果缓存满了,而又没有命中缓存,那么就会按照某一种策略,把缓存中的旧对象剔除,而把新的对象加入缓存池。而这些策略统称为替代策略(也就是缓存算法),这些策略(缓存算法)会决定到底应该剔除哪些对象。

  • 存储成本

当没有命中时,我们会从数据库中取出数据,然后放入缓存。而把这个数据放入缓存所需要的时间和空间,就是存储成本。

  • 失效

当存在缓存中的数据需要更新时,就意味着缓存中的这个数据失效了。

四、缓存的种类或者类型

1. LocalCache(独立式): 例如Ehcache、BigMemory Go

(1) 缓存和应用在一个JVM中。

(2) 缓存间是不通信的,独立的。

(3) 弱一致性。

2. Standalone(单机): 

(1) 缓存和应用是独立部署的。

(2) 缓存可以是单台。(例如memcache/redis单机等等)

(3) 强一致性

(4) 无高可用、无分布式。

(5) 跨进程、跨网络

3. Distributed(分布式):例如Redis-Cluster, memcache集群等等

(1) 缓存和应用是独立部署的。

(2) 多个实例。(例如memcache/redis等等)

(3) 强一致性或者最终一致性

(4) 支持Scale Out、高可用。

(5) 跨进程、跨网络

4. Replicated(复制式): 缓存数据时同时存放在多个应用节点的,数据复制和失效的事件以同步或者异步的形式在各个集群节点间传播。(也是弱一致性)

这种用的不太多。

五、数据层访问速度:(作为开发人员要记住这些量级)

参考:https://blog.csdn.net/ssh4412/article/details/79497392

        

猜你喜欢

转载自blog.csdn.net/weixin_42724467/article/details/88717205