文章目录

  • 前言
  • 一、FIFO算法是什么?
  • 二、使用步骤
    • 1.先写一个接口类
    • 2.简单的Cache实现类
    • 3.FIFO算法实现
    • 3.运行效果
  • 总结

前言

我们都知道为了减轻数据库的访问压力,有一个很好的办法就是添加本地缓存或者分布式缓存,那么大家了解缓存都有哪几种算法吗?我为大家介绍其中的一种算法——FIFO先进先出算法!

一、FIFO算法是什么?

FIFO先进先出算法其原理是,当缓存容器满了的时候想要插入一条新的对象,那么我们不得不删除最前面的那个对象,循环罔替。我们先来看是怎么实现的,最后我来告诉大家这种算法的不足之处!

二、使用步骤

1.先写一个接口类

在写FIFO(先进先出)缓存算法之前,我们先来拿个先案例简单实现一下缓存Cache。

代码如下(示例):

public interface Cache{
void putObject(Object key,Object value);
Object getObjec(key,value);
Object removeObjec(key,value);
void clear();
int size();
}

2.简单的Cache实现类

代码如下(示例):

/*** 简易Cache实现* 1)存储结构:散列表(基于JAVA中的hashmap存储)* 2)淘汰算法:没有(直到到内存溢出)* 3)线程安全:否* 4)缓存对对象的引用?强引用* 5)对象获取:浅拷贝(获取对象地址)*/
public class perpetualCache implements Cache(){private HashMap<Object,Object> cache=new HashMap<>();@Overridepublic void putObject(Object key, Object value) {cache.put(key, value);}@Overridepublic Object getObject(Object key) {return cache.get(key);}@Overridepublic Object removeObject(Object key) {return cache.remove(key);}@Overridepublic void clear() {cache.clear();}@Overridepublic int size() {return cache.size();}@Overridepublic String toString() {return "PerpetualCache{" +"cache=" + cache.toString() +'}';}
}

下面我们把这个类作为基础去拓展FIFO算法,代码如下:

3.FIFO算法实现

/*** 构建先进先出Cache对象:缓存满了以后要优先淘汰最早放入的对象* 1)存储数据:基于hashmap* 2)淘汰算法:FIFO(关键点在于如何记录key的添加顺序)**/
public class FifoCache implements Cache{
/**关联Cache对象-找到可以存储数据的基层对象*/private Cache cache;/**定义Cache的最大容量*/private int maxCap;/**通过队列记录key的添加顺序,Deque是JAVA中的双端队列*/private Deque<Object> keyOrders;public FifoCache(Cache cache, int maxCap) {this.cache = cache;this.maxCap = maxCap;this.keyOrders=new LinkedList<>();}@Overridepublic void putObject(Object key, Object value) {//1.记录key的顺序(添加在队列的尾部)keyOrders.addLast(key);//2.判断容器是否已满,满了则移除if(keyOrders.size()>maxCap){Object firstKey = keyOrders.removeFirst();//从cache中清除指定key对应的对象cache.removeObject(firstKey);}//3.向cache添加数据cache.putObject(key, value);}@Overridepublic Object getObject(Object key) {return cache.getObject(key);}@Overridepublic Object removeObject(Object key) {//1.从Cache中移除对象Object object = cache.removeObject(key);//2.从队列移除keykeyOrders.remove(key);return object;}@Overridepublic void clear() {cache.clear();keyOrders.clear();}@Overridepublic int size() {return cache.size();}@Overridepublic String toString() {return "FifoCache{" +"cache=" + cache.toString() +", maxCap=" + maxCap +", keyOrders=" + keyOrders +'}';}public static void main(String[] args) {Cache cache=new FifoCache(//负责添加算法new PerpetualCache(),//负责存数据3);//如上语句其实是一种装饰模式的实现(思考:new BufferedReader(new FileReader(file)))cache.putObject("A", 100);cache.putObject("B", 200);cache.putObject("C", 300);cache.putObject("D", 400);cache.putObject("E", 500);System.out.println(cache);}
}

4. 运行效果

可以看出,最后就只剩C,D,E,A和B都被删除掉了!


总结

这种算法的缺点在于:FIFO算法对于一些内存中访问频率比较高,但是放入的时间又比较早的对象而言,命中率会比较率。所以这种算法使用的越来越少了,近些年比较流行的缓存算法为Lru算法,等我完全吃透Lru算法再来为大家讲解哦!

手写缓存之FIFO算法相关推荐

  1. 手写字体的fisher算法识别

    代表了一些投影的方法 最佳W值的确定: 最佳w值的确定实际上就是对Fisher准则函数求取其达极大值时的. 对于这个问题可以采用拉格朗日乘子算法解决,保持分母为一非零常数c的条件下,求其分子项的极大值 ...

  2. python识别数字程序_python实现识别手写数字 python图像识别算法

    写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更 ...

  3. svm手写数字识别_KNN 算法实战篇如何识别手写数字

    上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...

  4. python手写数字识别实验报告_python实现识别手写数字 python图像识别算法

    写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更 ...

  5. 手写数字识别——KNN算法的应用

    项目说明 训练之后,即可识别手写数字图片如下(我用windows自带的画板画的,可能有点丑,见谅): 等等 数据集下载 链接:https://pan.baidu.com/s/1wWAuZxWUUhlC ...

  6. 我手写了个SLAM算法!

    1.前言 前一段时间看过我文章的都知道,我打算写一个SLAM源码阅读的文章,然后,我就去读了Gmapping的源码,感受良多,不足的地方是源码太乱了,阅读起来真的不香.于是就有了这篇文章,在我仔细阅读 ...

  7. 手写系列之手写LM(Levenberg–Marquardt)算法(基于eigen)

    紧接上次的手写高斯牛顿,今天顺便将LM算法也进行了手写实现,并且自己基于eigen的高斯牛顿进行了对比,可以很明显的看到,LM的算法收敛更快,精度也略胜一筹,这次高博的书不够用了,参考网上伪代码进行实 ...

  8. 【算法入门】用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐心看 ...

  9. 用Python手写五大经典排序算法,看完这篇终于懂了!

    算法作为程序员的必修课,是每位程序员必须掌握的基础.作为Python忠实爱好者,本篇东哥将通过Python来手撕5大经典排序算法,结合例图剖析内部实现逻辑,对比每种算法各自的优缺点和应用点.相信我,耐 ...

最新文章

  1. php实现中英文网站插件,多语言网站方案
  2. Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网
  3. 软件技术专业-就业提示(三、Java工程师必备技能)
  4. activeMQ相关配置与相关知识
  5. 大学物理实验长度的测量实验报告_大学物理实验教案长度和质量的测量两篇
  6. 诗与远方:无题(三十六)- 素质低下
  7. Jenkins打卡Day19-Jenkins重启关闭服务
  8. 易智瑞大赛——地图故事组参赛经验
  9. 单片机通信接口:UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB
  10. dw计算机代码,DW-滚动文字代码.doc
  11. 大一新生计算机掌握情况word,2021年大一计算机学习心得word版
  12. Centernet 生成高斯热图
  13. 解决“你的许可证不是正版,并且你可能是盗版软件的受害者。使用正版Office,避免干扰并保护你的文件安全。”
  14. 基于CNN卷积神经网络的商品识别(毕设)
  15. ARM SMMU介绍
  16. ACL中的permit/deny与traffic policy中behavior的permit/deny之间是什么关系?
  17. 用友投资一亿现金成立医疗软件公司
  18. Windows在cmd命令行环境下运行c程序
  19. filebeat7.7.0相关详细配置预览- processors - timestamp
  20. synchronized 字节码层原理解析及锁升级

热门文章

  1. Vue2基础篇教程合集
  2. 远程连接别人电脑教程,超详细(命令行方式)
  3. 图片压缩到200k以内怎么操作?图片压缩指定大小工具推荐
  4. vc判断指定进程或程序名是否存在和进程为64或者32位
  5. Android 5 Emulator root 模拟器 root
  6. 为什么我的Windows 10 便签不支持更改字体?
  7. 教你如何寻找优质的淘宝达人
  8. 飞控教程基于模型的开发(across)
  9. 别再逼三星了,它在起死回生的路上挣扎很久了...
  10. sqlyog如何查看mysql的版本_【转】烂泥:查看MySql版本号命令