【算法】FIFO先来先淘汰算法分析和编码实战

简介: 【算法】FIFO先来先淘汰算法分析和编码实战

背景

  • 在设计一个系统的时候,由于数据库的读取速度远小于内存的读取速度
  • 为加快读取速度,将一部分数据放到内存中称为缓存,但内存容量是有限的,当要缓存的数据超出容量,就需要删除部分数据
  • 这时候需要设计一种淘汰机制,看哪些数据删除,哪些数据保留
  • 常见的有FIFO、LRU、LFU等淘汰算法
  • 什么是FIFO淘汰算法
  • First In First Out,先进先出,淘汰最早被缓存的对象
  • 是一种常用的缓存淘汰算法,它的原理是按照先进先出的原则
  • 当缓存满了之后,先将最早进入缓存的数据淘汰掉,以腾出空间给新的数据
  • 优点
  • 在于实现简单,不需要记录或统计数据的使用次数,只需要记录每个数据进入缓存的时间和每个数据在缓存中的位置即可
  • 缺点
  • 在于它不能有效地淘汰最近最少使用的数据
  • 最近最少使用的数据可能会被淘汰掉,而最近最多使用的数据也可能被淘汰掉,这样就会导致缓存的效率不够高。

95f1669a636b4326a9f8bb7c607fe64f.png

  • 编码实现
public class FIFOCache <K,V>{
    //定义缓存最大容量
    private int maxSize;
    //定义当前缓存容量
    private int curSize;
    //定义用鱼存放缓存的key
    private LinkedList<K> cacheKey;
    //用于存放缓存的value
    private HashMap<K,V> cacheValue;
    //读写锁,保证线程安全性
    private Lock lock = new ReentrantLock();
    //构造函数
    public FIFOCache(int maxSize) {
        this.maxSize = maxSize;
        this.curSize = 0;
        this.cacheKey = new LinkedList<K>();
        this.cacheValue = new HashMap<K, V>();
    }
    //向缓存中插入key-value
    public void put(K key,V value){
        //加锁
        lock.lock();
        try {
            //如果缓存已满,则删除最老的key
            if (maxSize == curSize) {
                K oldKey = cacheKey.removeFirst();
                cacheValue.remove(oldKey);
                curSize--;
            }
            //插入新的key-value
            cacheKey.add(key);
            cacheValue.put(key,value);
            curSize++;
        }finally {
            //解锁
            lock.unlock();
        }
    }
    // 查询指定key的value
    public V get(K key) {
        return cacheValue.get(key);
    }
    public void printKeys() {
        System.out.println(this.cacheKey.toString());
    }
    public static void main(String[] args) {
        FIFOCache<String,String> cache = new FIFOCache<>(5);
        cache.put("A", "任务A");
        cache.put("B", "任务B");
        cache.put("C", "任务C");
        cache.put("D", "任务D");
        cache.put("E", "任务E");
        cache.printKeys();
        cache.put("F", "任务F");
        cache.printKeys();
        System.out.println("G=" + cache.get("G"));
        System.out.println("C=" + cache.get("C"));
    }
}

bf4751957b4843f2b363d810790b81f2.png

相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
114 3
|
19天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
28天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
35 6
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
83 1
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
3月前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
38 1
|
3月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
4月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
81 2
|
3月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。

热门文章

最新文章