cache同步机制之读写

1.概念解析

cache :这里的cache可以指L1,L2,L3这种CPU缓存,也可以是内存,也可以是磁盘缓存,区别在于处于什么场景下。
内存 :对于cache的后端存储,总之是在cache之后。或是持久或是非持久的存储。
cache hit :当从cache中读取数据时,恰好命中,读到数据,又称缓存命中
cache miss: 对应cache hit ,在缓存中没有读到数据,需要到后端存储读取。
对应还有write miss , write hit , read miss ,read hit.

2.写同步

现在的CPU是由L1,L2,L3,内存,物理存储五级存储方式,访问速度是越来越慢,那么对于数据传递过程该如何定义呢?

2.1) write through cache :
每次刷新cache时,同时同步的将数据刷新到内存中。优点:简单,缺点:相比较来说慢一些。

2.2) write back cache
刷新数据到cache中,但是不立刻同步数据到内存,但标志这些数据在内存中是脏数据,等到这些数据要会清理出缓存的时候(例如LRU算法),再将数据刷新到内存中,因为很多场景下有些数据只是一些中间数据,并不是最终数据。优点:CPU效率高,但是实现复杂。还需要承担在cache中数据未刷新到内存中的风险。

以上两种方式是在走两个极端,一个极端是有数据就立刻同步,另一个极端就是等有需要删除数据时就同步数据(这个也是memcached服务端的实现策略)。那么有没有一种介于这两者之间的传递数据方式呢?那就是post write 。

2.3) post write:cpu更新缓存时,把更新的数据写入到一个更新缓存器中,在合适的时候更新数据到内存中,这个时机需要根据具体的业务场景来分析,可以是定时,也可以是某种触发机制下,例如更新缓存器中数据达到多少的比例。简单的话就是异步的方式同步数据。这种方式也面临的问题就是写数据在缓存中丢失的问题都需要去考虑容灾。

3.读同步
在第一个节点已经介绍可cache hit && cache miss .那么在cache miss的情况下如何处理呢?有两种:
读取数据有两种,一种是从后端存储中读到数据后直接放到CPU,这种称之为:read through,另一种就是读取数据后,先放到cache中,再从cache中读取数据。

cache hit && cache miss 的资料写入
我们在cache中读到数据,需要重写回去,那么就上面提到的三种写策略

但是是针对写入过程中原来数据已经不存在了的情况有以下两种处理方式:
1.Write allocate:将写入数据从内存中读入缓存,然后采用write-hit(缓存命中写入)操作。写缺失操作与读缺失操作类似。
2.No-write allocate:方式并不将写入位置读入缓存,而是直接将数据写入存储。这种方式下,只有读操作会被缓存,因为不会有新数据写入缓存,都直接写内存了。

同步以上的分析,我们大致知道了CPU是如何处理L1和内存之间的数据同步的,那么我们在自己做缓存设计的时候也可以参考。
以上内容是自己摘取分析的成果,若有问题,欢迎指出!

作者: inter12

在这苦短的人生中,追求点自己的简单快乐

发表评论

电子邮件地址不会被公开。 必填项已用*标注