• LRU在MySQL缓存池的实现


    MySQL的InnoDB引擎设置有索引及数据缓存池,其中用到的LRU算法来维持缓存的命中率

    这里用到了顺序表list来作为缓冲池,每个数据节点称为block

    该算法采用“中点插入法”:当插入一个新block时,移除表尾最近最少使用的block,在中点插入新block。

    这个中点将链表分为两部分:

    1.靠近表头的一部分,为young区,这里的block是最近使用的节点

    2.靠近表尾的一部分,为old区,这里的block是最近少使用的

    该算法通过链表中的block的使用热度来维持各block的位置,其中old区的block为链表满的时候移除的候选区

    具体算法如下:

    1.链表的3/8被设置为old区

    2.中点不是链表的中间点,而是old区的表头节点,即old区与young区的相邻的那个节点

    3.当读取的数据不在缓冲池里的时候,读取到的block需要插入到链表中,插入点为中点,但是插入的新节点为old区的节点,如果此时old区满了得话,移除表尾的block(LRU节点)

    4.当读取old区的block时,该节点将变成“young”节点:此节点移动到young区的表头(young区的头部那里)

    5.在数据库操作中,被访问的节点将移除到young的表头,这样一来,在young区中的未被访问的节点将逐渐往表尾移动,当移动过中点,将变为old区的节点。而old区的节点若被访问到将变为young节点移动到表头,而old区中的为被访问的节点依旧往表尾移动,当表满时,表尾那个block将会被淘汰掉

    这里不涉及到具体代码实现,只是简单讲了下原理,待实现出来后再贴上来

    转载请注明出处:http://www.cnblogs.com/iamsupercp/p/3682659.html 谢谢合作

  • 相关阅读:
    用ant发布项目版本
    11 款用于优化、分析源代码的Java工具 转载
    第四章 数学运算
    jdbc for mysql demo
    第二章 PHP基础
    第七章 自定义函数
    第五章 数组
    jmock2.5基本教程 转载
    jdbc for mssql2005 demo
    oracle实战第三天事务处理与函数
  • 原文地址:https://www.cnblogs.com/iamsupercp/p/3682659.html
Copyright © 2020-2023  润新知