缓存淘汰算法 —— LFU-Aging(Java实现)

2023-11-17

Java实现,用HashMap保存关系{key值 : 命中次数与上次命中时间},当需要淘汰某个key值时,调用map.remove(key)。

import java.util.*;
 
public class LFUAgingMap<K, V> extends HashMap<K, V> {
    private static final int DEFAULT_MAX_SIZE = 3;
    private int maxSize = DEFAULT_MAX_SIZE;
    Map<K, HitRate> km = new HashMap<K, HitRate>();
 
    public LFUAgingMap() {
        this(DEFAULT_MAX_SIZE);
    }
 
    public LFUAgingMap(int maxSize) {
        super(maxSize);
        this.maxSize = maxSize;
    }
 
    @Override
    public V get(Object key) {
        V v = super.get(key);
        if (v != null) {
            HitRate hitRate = km.get(key);
            hitRate.hitCount += 1;
            hitRate.atime = System.nanoTime();
        }
        return v;
    }
 
    @Override
    public V put(K key, V value) {
        while (km.size() >= maxSize) {
            K k = getLFUAging();
            km.remove(k);
            this.remove(k);
        }
        V v = super.put(key, value);
        km.put(key, new HitRate(key, 1, System.nanoTime()));
        return v;
    }
 
    private K getLFUAging() {
        HitRate min = Collections.min(km.values());
        return min.key;
    }
 
    class HitRate implements Comparable<HitRate> {
        K key;
        Integer hitCount; // 命中次数
        Long atime; // 上次命中时间
 
        public HitRate(K key, Integer hitCount, Long atime) {
            this.key = key;
            this.hitCount = hitCount;
            this.atime = atime;
        }
 
        @Override
        public int compareTo(HitRate o) {
            int hr = hitCount.compareTo(o.hitCount);
            return hr != 0 ? hr : atime.compareTo(o.atime);
        }
    }
    public static void main(String[] as) throws Exception {
        LFUAgingMap<String, String> cache = new LFUAgingMap<String, String>();
        cache.put("a", "a");
        cache.put("b", "b");
        cache.put("c", "c");
 
        cache.get("a");
        cache.get("a");
 
        cache.put("d", "d");
        cache.get("d");
        cache.get("c");
        cache.put("e", "e");
 
        for (String key : cache.keySet()) {
            System.out.println(key);
        }
    }
}

 

 

https://blog.csdn.net/definite_things/article/details/45705307

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缓存淘汰算法 —— LFU-Aging(Java实现) 的相关文章

  • Unity中AnimatorController的配置

    AnimatorController 动画控制器 的配置编辑是在Unity的Animator视图中完成的 通过在Animator视图中创建动画状态 以及设置过渡条件 构建动画状态机 以可视化地控制动画的播放 下面介绍一些配置动画控制器的要点
  • ord(readfn(1)) TypeError: ord() expected a character, but string of length 0 found --记录

    背景 从git clone 下来一个 Django 1 1项目 而本地安装是 Django 3 3 而且 使用了whoosh 出现如下问题 File usr local lib python3 7 site packages whoosh
  • Mysql error 1045的解决

    网上千篇一律给的答案是改配置文件 百度第一页都是 其实改的那项配置是让MySQL按安全模式启动 该模式不用输入密码 看似解决了问题 其实不是问题的原因 搜一下官方文档可以很容易发现 1045的含义是 用户名或密码错误 所以 再遇到1045
  • Doris编译

    使用Doris 官方不提供编译好的jar包 需要自己编译 最方便的方式是通过Docker编译 避免了安装各种环境的繁琐 一 准备服务器 用虚拟机 云服务器都可以编译 不过编译所需要的内存以16G为佳 如果你的机器没有这么多内存 速度会比较慢
  • fatal: unable to access ‘https://github.com/xxx‘: Failed to connect to github.com

    执行这两行命令 端口号改成自己代理服务器的端口 我的是7890 git config global https proxy 127 0 0 1 7890 git config global http proxy 127 0 0 1 7890
  • Bash中各种括号的使用

    Bash中有各种括号 包括单小括号 双小括号 单中括号 双中括号 单大括号 而且它们之间很容易混淆 所以很有必要总结一下它们的用法 1 的用法 单个小括号用来创建一个子shell 例如 pwd home xfeng cd tmp pwd t
  • VMware虚拟网络编辑器配置

    一 NAT模式网络设置 把下面的ip 子网掩码 网关记住 切换到network scripts 目录下 cd etc sysconfig network scripts 修改ifcfg ens33 这个文件 下图圈2的IPADDR设置一个在
  • 洛谷 P1046 陶陶摘苹果

    该问题涉及数组的输入和输出问题 以及数据的换行输入问题 较为简单 题目描述 陶陶家的院子里有一棵苹果树 每到秋天树上就会结出 1010 个苹果 苹果成熟的时候 陶陶就会跑去摘苹果 陶陶有个 3030 厘米高的板凳 当她不能直接用手摘到苹果的
  • sqlilabs—less8

    文章目录 Sqlilabs less8 1 判断注入点 2 爆字段 3 判断数据库 1 判断数据库名长度 2 判断数据库名称 4 判断表 1 有几个表 2 分别判断表长度 3 分别判断表名称 5 判断列 1 判断表中有几个字段 有几列 2
  • Mysql数据库delete操作没报错,却删除不了数据

    1 在操作页面执行删除操作 但没有删除成功 删除过程无报错 以下为删除操作的控制台日志 2 在数据库执行删除操作 表数据 执行删除语句删除staffId为3的数据 结果却没有删除成功 3 原因 staffId为3的数据的flag为Null
  • ImageMagick批量压缩图片

    2019独角兽企业重金招聘Python工程师标准 gt gt gt bin sh for img in find image name jpg do newimg basename img convert quality 75 img ok
  • dolphinscheduler配置之 master.properties/worker.properties及常见问题学习

    master properties master execute thread num master exec threads 50 master execute task number in parallel master exec ta
  • c#读取csv到数组_如何读取CSV文件并将值存储到C#中的数组中?

    CSV文件是逗号分隔的文件 用于以有组织的方式存储数据 它通常以表格形式存储数据 大多数企业组织将其数据存储在CSV文件中 CSV文件是逗号分隔的文件 用于以有组织的方式存储数据 它通常以表格形式存储数据 大多数企业组织将其数据存储在CSV
  • The server time zone value ‘Öйú±ê׼ʱ¼ä‘ is unrecognized or represents more than one time zone

    The server time zone value is unrecognized or represents more than one time zone You must configure either the server or

随机推荐

  • ThreadPoolTaskScheduler轻量级多线程定时任务框架

    ThreadPoolTaskScheduler轻量级多线程定时任务框架 前言 一 ThreadPoolTaskScheduler是什么 二 上干货 1 ThreadPoolTaskScheduler常用的api介绍 2 springboot
  • 华为OD机试 - Linux发行版的数量(Java)

    题目描述 Linux操作系统有多个发行版 distrowatch com提供了各个发行版的资料 这些发行版互相存在关联 例如Ubuntu基于Debian开发 而Mint又基于Ubuntu开发 那么我们认为Mint同Debian也存在关联 发
  • 深度研究:回归模型评价指标R2_score

    回归模型的性能的评价指标主要有 RMSE 平方根误差 MAE 平均绝对误差 MSE 平均平方误差 R2 score 但是当量纲不同时 RMSE MAE MSE难以衡量模型效果好坏 这就需要用到R2 score 实际使用时 会遇到许多问题 今
  • (附源码)springboot考研规划系统 毕业设计 541230

    摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促进
  • 懂的都懂,那些好用的“WEB安全”网站

    加密解密 解码编码 MD5 https www cmd5 com 凯撒 https www qqxiuzi cn bianma kaisamima php 摩斯密码 https www jb51 net tools morse htm ht
  • pytorch:数据增广批量化(Batch Augmentation)

    数据增强通常是随机批量生产的 一般使用组合形式 即同时随机裁剪 翻转 旋转等 import torchvision transforms as transforms from PIL import Image import matplotl
  • java中int[] arr和int arr[]有什么区别

    答 是一样的 跟在变量名后面或者跟在类型后面都可以 int arr 这么写不对的 推荐 int arr 写法
  • nodejs第一个程序

    第一个nodejs程序 1 首先创建一个js文件 命名index js 可随意 然后在文件里面输入 console log Hello World 2 使用 Git Bash Here 打开index js文件 输入指令 node inde
  • Linux--信号量共享内存

    1 基础知识 1 共享内存是最快的IPC形式 一旦这样的内存映射到共享它的进程的地址空间 这些进程间的数据传递不再涉及内核 即进程不再通过执行进入内核的系统调用来传递彼此的数据 2 共享内存的生命周期随内核 3 注意 共享内存未提供任何保护
  • 如何通过代码技巧提升内存使用效率?(内存调优)

    代码层面 IO对象或者数据库的连接对象 使用好后 需要close或clear掉 try 使用Connection或IO等对象 catch Exception 异常处理 finally 关闭对象 当我们使用好对象时 应该把它设为null 这样
  • Kafka——javaAPI

    文章目录 Kafka的JavaAPI 1 未整合版的Kafka的API 1 1 Producer 消息发送端代码 1 2 Consumer 消息消费端代码 2 Spring Boot整合Kafka 2 1 发送者代码 Producer 2
  • Eclipse进行debug

    目录 基本步骤 三种执行方式 键盘快捷键 variables面板 移除debug过的项目 通过eclipse调用具有软件界面的项目进行debug 各个variable颜色具有的意义 基本步骤 点击eclipse右上角debug按钮 调出de
  • Xilinx实习一年总结

    从去年7月4号来到上海xilinx 转眼间已经一年 这一年学了很多知识 也长了很多见识 去年七月一到公司 立即投入到摄像头 DDR HDMI图像通路的研发中 就是在ZEDboard板卡上 通过外置摄像头采集图像 在PL部分将采集的像素数据进
  • 计算机符号链接是什么意思,Windows或Linux上的符号链接(符号链接)完整指南

    想要轻松地从不同的文件夹访问文件夹和文件 而不保留重复的副本 以下是如何使用Symbolic Links链接Windows 10 8 7 Vista XP和Ubuntu中的任何内容 那么什么是符号链接呢 符号链接 也称为符号链接 基本上是高
  • Python开发环境配置

    安装Anaconda Anaconda是Python的一个科学计算发行版 内置了数百个Python经常会使用的库 也包括做机器学习或数据挖掘的库 如Scikit learn NumPy SciPy和Pandas等 其中可能有一些是Tenso
  • YOLOv5行人检测

    YOLOv5行人检测 1 数据准备 1 下载数据集 2 整理出jpg和xml 2 进行YOLOV5的部署训练 1 划分数据集 2 生成yolo的txt文件 3 配置自己数据集的文件 4 聚类找anchors 5 配置模型文件 6 训练模型
  • 如何修复引导/错误代码0xc000000f

    现象 安装完系统后启动时报文件丢失 文件 okldr mbr 或者 scldr mbr 等错误 状态 0xc000000f 处理办法 1 用U盘做一个PE启动盘 可以用 U大侠 小白一键重装等 2 bios启动选项选择U盘启动 3 重启电脑
  • Mysql实战45讲 - 学习笔记

    Sql流程 一条查询语句的执行过程一般是经过连接器 分析器 优化器 执行器等功能模块 最后到达存储引擎 大体来说 MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器 查询缓存 分析器 优化器 执行器等 涵盖
  • SSM框架整合layui之实现登录功能

    SSM框架整合layui之实现登录功能 代码 UserService接口 UserServiceImpl实现类 SUserMapper接口 SUserMapper xml SystemController login jsp 代码 User
  • 缓存淘汰算法 —— LFU-Aging(Java实现)

    Java实现 用HashMap保存关系 key值 命中次数与上次命中时间 当需要淘汰某个key值时 调用map remove key import java util public class LFUAgingMap