1,首先mysql会将LRU链表设计成冷热数据的情况,初始化默认是37%的冷数据。当一个数据页进来时候,会现房到LRU冷数据链的头部,在一秒内重新访问的情况下就会把这个冷缓存页放到LRU数据链去。这样就可以防止直接预读的数据被放到高优先级上。
    2,redis也是有冷热数据缓存的做法的,对于经常访问的商品就是热数据,不经常被访问的就是冷数据,所以一般这里会经常考虑热数据的缓存预加载。比如一天中访问最多的商品,在晚上时候,系统启动一个定时job,把这些热门商品数据预加载到redis里,那么第二天热门商品就都走的是缓存了。
    3,因为LRU链表的热数据会经常被访问,所以针对热数据的链表的一直来回移动不是什么好事,也是对性能不友好,所以LRU链表对热数据区域的访问规则也有优化,即你只有在热数据区域的后3/4部分的缓存页被访问,才会移动到链表头部去。如果是后面的1/4的数据被访问 会移到热数据的头部。
    image.png