现在的企业招人只要是高级以上基本上就会有一个要求就是熟悉分布式,缓存,消息的机制。这里的缓存我推测是nosql数据库redis等,但是这也看出缓存这个概念是多么流行。其实缓存远在几十年前就出现了,就是内存,我说这个也是一种缓存应该没什么错,因为它是把常用的程序放在了速度的设备中,用来替代缓慢的硬盘。但是从cpu控制内存到cpu要通过数据总线,跨设备传输,这个时间需要几十时钟周期,有没有更快的方法,那就是使用更快的设备,减小到cpu的距离,这就是一级缓存,cpu的缓存做到现在至少可以有四级缓存,常见的是三级缓存,缓存大小从小到大,离cpu的距离也越来越大。为什么要创建这么多缓存呢,因为cpu很精密,要在cpu内部加缓存很难,而且缓存是用晶管做的,晶管是很珍贵的东西,需要节省使用。如果所有缓存只有一层,那么一层的搜索时间必定也变大了,因为搜索的范围更大了,而且根据我们的经验,常被使用的数据不会被改变,那么第一层的数据也就可以起到比它大小更大的作用,也就是说一层的缓存命中率很高。
另外还有一个问题那就是伪共享,它被传的神乎其神,我第一次看还看不懂,直到现在我才发现这是懂cpu运行原理的人太少。所谓伪共享就是看似命中了缓存,其实并没有,而是访问了内存,为什么会使用不到呢。那是因为缓存的运行原理和我们常见的插入取出不同。在插入时会把和内存挨得近的数据也插入,并且以固定大小插入,插入的数据叫缓存行,cpu缓存由缓存行组成,如果你要改动缓存中的某个值,那么就会影响到它相近的数据一起被更新,也就说取数据要到内存中取了,也就慢了。避免这个问题的方法就是让内存数据值的大小等于缓存行的大小,那么也就互相不影响了,这个原理肯定还有细微之处没有知道,但是原理就是抽象的,不需要知道具体细节,要知道细节可以看源码,看硬件,但是我看不到啊。