1. 对于预读机制以及全表扫描加载进来的一大堆缓存页

在经过优化的LRU链表方案下,预读机制以及全表扫描加载进来的一大堆缓存页,都会被放在LRU链表的冷数据区域的前面。

假设这个时候热数据区域已经有很多被频繁访问的缓存页了,就会发现热数据区域还是存放被频繁访问的缓存页的,只要热数据区域有缓存页被访问,它还是会被移动到热数据区域的链表头部去。

而预读机制和全表扫描加载进来的一大堆缓存页,此时都在冷数据区域里,跟热数据区域里的频繁访问的缓存页,是没关系的。

mysql冷热表 mysql冷热数据分离_java

 2. 预读机制和全表扫描加载进来的缓存页,能进入热数据区域?

对于预读机制和全表扫描机制加载进来的缓存页。

如果只是一个全表扫描的查询,并且是在1s内就把一大堆缓存页加载进来,然后就访问了这些缓存页一下,通常这些操作1s内就结束了。这种情况下,那些缓存页是不会从冷数据区域转移到热数据区域的。

如果在冷数据区域里的缓存页,在1s之后还被人访问了,那就回被判断为未来可能会被频繁访问的缓存页,然后被移动到热数据区域的链表头部去。

3.当缓存页不够用了,怎么去淘汰一些缓存

当缓存页不够用了,此时就需要淘汰一些缓存页。此时会找到LRU链表中的冷数据区域的尾部的缓存页,这些都是被加载进来后1s后没有被人访问过的,都是冷数据。

所以此时会直接淘汰掉冷数据区域的尾部的缓存页,刷入磁盘,从而实现缓存页淘汰来空出可以用的。

4. 总结

基于LRU链表冷热数据分离的一套机制。刚加载数据的缓存页都是放冷数据区域的头部,1s过后被访问了才会放热数据区域的头部,热数据区域的缓存页被访问了,就会自动放到头部去。

这样的话,实际上冷数据区域放到都是加载进来的缓存页,最多在 1s 内被访问过,之后再也没被访问过的冷数据缓存页。

如上所述,在LRU链表中就实现了冷热数据的隔离。

这样的话,在淘汰缓存的时候,也一定是优先淘汰冷数据区域几乎不怎么被访问的缓存页的。