• Mybatis(七)-- LRU LFU 算法


    这篇博客主要介绍LRU LFU 算法,因为在Mybatis的缓存中会用到,所以放到这个系列中了。此外,这是我翻译的一篇文章,觉得原文已经写的很好了,所以就直接翻译一下,留作知识整理。

    英文原文出处如下:

    https://xuri.me/2016/08/13/lru-and-lfu-cache-algorithms.html

    鼓励大家多读读英文的资料。好处不多说。自己体会。

    在此声明,文章只是翻译了一个大体意思,有些词汇翻译的不准确,不要砸我。

    最少最近使用(LRU)

    丢弃掉最近期间最少使用的项目。当想要丢弃掉最近期间最少使用的项目时,算法要求必须追踪哪些是使用了的。这种技术的广义上的实施,要求为每个cache-line保存寿命信息,并且在寿命信息的基础上,追踪最近期间最少使用的cache-line。在这样的功能实现中,每次使用一个cache-line,并改变其他cache-line的寿命信息。

    P.S. 每一列可以看做是一个cache-line。

    最近期间内经常使用(LFU)

     最近期间内经常使用是一种用计算机管理内存的算法。关于这种方法的标准的特征是,系统追踪在内存中,block被引用的次数。当内存满了,需要等多的空间时,系统会去除掉最少使用次数的项目。

    使用LFU算法,最简单的方法是,为每个导入内存中的block安排计数器。每一次block被引用一次,计数器就会自动加一。当内存达到容量并且有新的block被插入时,系统将会查找使用次数最少的项目,将它从内存中除去。

    LRU 和 LFU 的不同之处如下:

    比如,内存容量是3,数据操作的序列如下,

    set(2,2), set(1,1), get(2), get(1), get(2), set(3,3), set(4,4)

    set(4,4)时,LFU算法will会清除掉(3,3), LRU会清除掉(1,1).

    P.S.东西很简单,自己动手在纸上画画,就明白了。

    接下来,写一个简单的demo,用java来实现LRU算法。

     1 public class Demo01 {
     2 
     3     LinkedHashMap<Integer, String> cache;
     4     public void sddd() {
     5         
    // 构造函数中的三个参数分别是:
    // param1: 初始化容器大小
    // param2:负载因子(当容器大小到达这个比例时,就会扩容)
    // param3:true 按照使用的顺序将数据排序
    false 按照插入容器的顺序将数据排序
    // LinkedHashMap 是有序的 6 cache = new LinkedHashMap<Integer,String>(4, (float) 0.75, true){ 7 private static final long serialVersionUID = 1;
             // 当容器大小超过100时,会将超过的entity删除
    8 @Override 9 public boolean removeEldestEntry(@SuppressWarnings("rawtypes") Map.Entry eldest) { 10 return size() > 100; 11 } 12 }; 13 } 14 }
  • 相关阅读:
    一种安全云存储方案设计(上)——基于二次加密的存储策略与加密图文混合检索
    lamda表达式导致运行时VerifyError
    编译原理:语法分析概述
    语音识别与 RNN-Transducer 概述
    通信原理基本概念
    追光捉影的自动机:2021 卓工实训小作文
    【实战】jsfinder+jsinfo-scan结合改造
    js基础记录
    qq、微信二次分享
    收藏链接
  • 原文地址:https://www.cnblogs.com/lihao007/p/7501662.html
Copyright © 2020-2023  润新知