当前位置: 首页 > news >正文

Java实现LFU缓存策略实战

  • LFU算法原理
  • 在Java中示例实现
  • 集成Caffeine的W-TinyLFU策略缓存实战
  • 总结

LFU与LRU稍有不同,LFU是根据数据被访问的频率来决定去留。尽管它考虑了数据的近期使用,但它不会区分数据的首次访问和后续访问,淘汰那些访问次数最少的数据。

这种缓存策略主要用来处理以下场景:

  • 数据访问模式多样化:当系统的数据访问模式差异较大,有些数据访问频率很高,而有些数据访问频率很低时,LFU算法能够有效地根据访问频率来淘汰数据,保证频繁访问的数据能够留在缓存中。
  • 长时高频数据访问:对于某些数据,虽然它们不是最近被访问的,但是它们在过去的一段时间内被访问的次数很多,这种情况下,LFU算法能够保证这些数据不会被错误地淘汰。
  • 缓存空间原则:当缓存空间非常有限,需要精确控制哪些数据应该被保留时,LFU算法可以提供基于频率的淘汰策略,以确保最重要的数据被保留在缓存中。
  • 对于缓存数据更新频繁:LFU算法优先淘汰访问频率低的数据,因此它适合那些数据更新频繁的场景,可以确保最新的数据更容易被缓存保留。
  • 缓存时长较短:LFU算法适合那些对数据持久性要求不是特别高的场景,因为一旦数据被淘汰出缓存,就有可能丢失。

LFU算法原理

利用hash表和双向链表实现,并在hash表中存储了node节点后形成一个双向链表,这样既提高了查询效率也提高了操作效率。
内存淘汰原则:

  • 快速找到同一频率的节点,并同时淘汰掉最久未被使用过的数据;
  • 利用hash表存储每个频率相对应的节点信息;
  • 每个节点之间组成一个双向链表;

hash表中的key表示访问次数,value表示一个双向链表,链表中所有节点都是被访问过相同次数的数据节点。另外链表第三个元素freq被访问次数,这与hash表中的key值一样。当根据key找到其中一个节点时,进而知晓其访问次数和相关其它节点状态。
在这里插入图片描述
根据上图结构还缺少点什么,即如何根据key获取value。当然我们也可以通过hash表来存储key与节点之间的对应关系来查找。如下LFU算法的数据结构:
在这里插入图片描述

在Java中示例实现

创建链表缓存节点

package com.eyinfo.springlfu.lfu;import java.io.Serializable;public class LFUNode<K, V> implements Serializable {K key;V value;int frequency;public LFUNode(K key, V value) {this.key = key;this.value = value;this.frequency = 0;}
}

创建LFU缓存类(具体说明已在代码中标出)

package com.eyinfo.springlfu.lfu;import lombok.Getter;import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;public class LFUCache<K, V> {private final int capacity;@Getterprivate Map<K, LFUNode<K, V>> cache;//用于跟踪每个键的频率private Map<K, Integer> frequencies;public LFUCache(int capacity) {this.capacity = capacity;//利用LinkedHashMap构建LFU缓存对象this.cache = new LinkedHashMap<K, LFUNode<K, V>>(capacity, 0.75f, true) {protected boolean removeEldestEntry(Map.Entry<K, LFUNode<K, V>> eldest) {return size() > LFUCache.this.capacity;}};this.frequencies = new HashMap<>();}public void put(K key, V value) {if (cache.containsKey(key)) {

相关文章:

Java实现LFU缓存策略实战

LFU算法原理在Java中示例实现集成Caffeine的W-TinyLFU策略缓存实战总结LFU与LRU稍有不同,LFU是根据数据被访问的频率来决定去留。尽管它考虑了数据的近期使用,但它不会区分数据的首次访问和后续访问,淘汰那些访问次数最少的数据。 这种缓存策略主要用来处理以下场景: 数据…...

物业系统改革引领行业智能化管理与提升服务质量的新征程

内容概要 在当今迅速变化的社会中&#xff0c;物业系统改革正在悄然推动行业的智能化管理进程。物业管理作为一个古老而传统的领域&#xff0c;面临着诸多挑战&#xff0c;包括效率低下、业主需求难以满足等。数字化转型为这一现象注入了新活力&#xff0c;帮助物业公司通过先…...

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 导入需要的类# Important: # 你需要通过以下指令把 form.ui转为ui…...

动手学图神经网络(4):利用图神经网络进行图分类

利用图神经网络进行图分类:从理论到实践 引言 在之前的学习中,大家了解了如何使用图神经网络(GNNs)进行节点分类。本次教程将深入探讨如何运用 GNNs 解决图分类问题。图分类是指在给定一个图数据集的情况下,根据图的一些结构属性对整个图进行分类,而不是对图中的节点进…...

【Block总结】PConv,部分卷积|即插即用

论文信息 标题: Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文链接: https://arxiv.org/pdf/2303.03667 GitHub链接: https://github.com/JierunChen/FasterNet 创新点 该论文的核心创新在于提出了一种新的运算符——部分卷积&#xff08;PCo…...

接口使用实例(1)

大家好&#xff0c;今天我们来看看接口的一些实例&#xff0c;关于如何定义和实现接口&#xff0c;相信通过这些例子&#xff0c;我们能有一些清晰的认知。 先定义一个学生类&#xff1a; 再给定一个学生数组&#xff0c;对这个对象数组中的元素进行排序&#xff08;按分数排&…...

动态规划DP 最长上升子序列模型 总览

最长上升子序列模型 1. 最长上升子序列 1.1 怪盗基德的滑翔伞 1.1.1 登山 1.1.2 合唱队形 1.2 友好城市 1.3 最长上升子序列和 1.4 导弹拦截...

网络工程师 (7)进程管理

一、进程相关的概念 &#xff08;一&#xff09;定义 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;也是操作系统结构的基础。进程是程序的一次执行实例&#xff0c;具有动…...

登录授权流程

发起一个网络请求需要&#xff1a;1.请求地址 2.请求方式 3.请求参数 在检查中找到request method&#xff0c;在postman中设置同样的请求方式将登录的url接口复制到postman中&#xff08;json类型数据&#xff09;在payload中选择view parsed&#xff0c;将其填入Body-raw中 …...

Flutter_学习记录_导航和其他

Flutter 的导航页面跳转&#xff0c;是通过组件Navigator 和 组件MaterialPageRoute来实现的&#xff0c;Navigator提供了很多个方法&#xff0c;但是目前&#xff0c;我只记录我学习过程中接触到的方法&#xff1a; Navigator.push(), 跳转下一个页面Navigator.pop(), 返回上一…...

二叉树-堆(补充)

二叉树-堆 1.二叉树的基本特性2.堆2.1.堆的基本概念2.2.堆的实现2.2.1.基本结构2.2.2.堆的初始化2.2.3.堆的销毁2.2.4.堆的插入2.2.5.取出堆顶的数据2.2.6.堆的删除2.2.7.堆的判空2.2.8.堆的数据个数2.2.9.交换2.2.10.打印堆数据2.2.11.堆的创建2.2.12.堆排序2.2.13.完整代码 3…...

Big Bird:适用于更长序列的Transformer模型

摘要 基于Transformer的模型&#xff0c;如BERT&#xff0c;已成为自然语言处理&#xff08;NLP&#xff09;中最成功的深度学习模型之一。然而&#xff0c;它们的一个核心限制是由于其全注意力机制&#xff0c;对序列长度的二次依赖&#xff08;主要是在内存方面&#xff09;…...

doris:MySQL Load

Doris 兼容 MySQL 协议&#xff0c;可以使用 MySQL 标准的 LOAD DATA 语法导入本地文件。MySQL Load 是一种同步导入方式&#xff0c;执行导入后即返回导入结果。可以通过 LOAD DATA 语句的返回结果判断导入是否成功。一般来说&#xff0c;可以使用 MySQL Load 导入 10GB 以下的…...

电感的饱和、温升、额定电流

电感饱和电流的定义&#xff1a; 电感的感值下降30%时候对应的电流 注意不要让电感的瞬间电流大于饱和电流&#xff1a; 温升电流&#xff1a; 电感器的饱和电流、温升电流和额定电流是描述电感在不同工作条件下表现的三个重要参数。它们分别反映了电感的不同工作特性&#xf…...

基于阿里云百炼大模型Sensevoice-1的语音识别与文本保存工具开发

基于阿里云百炼大模型Sensevoice-1的语音识别与文本保存工具开发 摘要 随着人工智能技术的不断发展&#xff0c;语音识别在会议记录、语音笔记等场景中得到了广泛应用。本文介绍了一个基于Python和阿里云百炼大模型的语音识别与文本保存工具的开发过程。该工具能够高效地识别东…...

【go语言】函数

一、什么是函数 函数是入门简单精通难&#xff0c;函数是什么&#xff1f;&#xff1f;&#xff1f; 函数就是一段代码的集合go 语言中至少有一个 main 函数函数需要有一个名字&#xff0c;独立定义的情况下&#xff0c;见名知意函数可能需要有一个结果&#xff0c;也可能没有…...

CTF-web: phar反序列化+数据库伪造 [DASCTF2024最后一战 strange_php]

step 1 如何触发反序列化? 漏洞入口在 welcome.php case delete: // 获取删除留言的路径&#xff0c;优先使用 POST 请求中的路径&#xff0c;否则使用会话中的路径 $message $_POST[message_path] ? $_POST[message_path] : $_SESSION[message_path]; $msg $userMes…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(动态菜单组件实现)

目录 面对对象C的程序设计&#xff08;范例&#xff09; 面对对象C的程序设计&#xff08;应用&#xff09; 进一步谈论我上面给出的代码——继承 实现一个面对对象的文本编辑器 所以&#xff0c;什么是继承 重申我们对菜单的抽象 抽象菜单项目 抽象菜单动画 实现菜单功…...

EtherCAT主站IGH-- 23 -- IGH之fsm_slave.h/c文件解析

EtherCAT主站IGH-- 23 -- IGH之fsm_slave.h/c文件解析 0 预览一 该文件功能`fsm_slave.c` 文件功能函数预览二 函数功能介绍`fsm_slave.c` 中主要函数的作用1. `ec_fsm_slave_init`2. `ec_fsm_slave_clear`3. `ec_fsm_slave_exec`4. `ec_fsm_slave_set_ready`5. `ec_fsm_slave_…...

windows10 配置使用json server作为图片服务器

步骤1&#xff1a;在vs code中安装json server, npm i -g json-server 注意&#xff1a;需要安装对应版本的json server&#xff0c;不然可能会报错&#xff0c;比如&#xff1a; npm i -g json-server 0.16.3 步骤2&#xff1a;出现如下报错&#xff1a; json-server 不是…...

虚幻引擎+数字孪生:手把手搭建智慧校园三维可视化平台(附浙江工商大学实战案例)

虚幻引擎数字孪生&#xff1a;从零构建智慧校园三维可视化平台的完整指南 想象一下&#xff0c;清晨走进校园时&#xff0c;管理员已经在三维可视化平台上完成了安防巡查&#xff1b;教务主任通过热力图调整着今天的课程安排&#xff1b;后勤人员正根据实时数据优化能源分配——…...

电气工程优化调度Matlab代码优化与注释那些事儿

优化调度修改、注释、matlab代码&#xff0c;主要为但不限于电气工程优化调度相关方向 主要包括&#xff0c;但不限于&#xff1a; 1、在原有程序基础上替换算法&#xff1b; 2、修改优化调度程序yalmip求解器ipopt&#xff1b; 3、新买的代码没注释&#xff0c;可以注释并可以…...

3步解锁Umi-OCR服务化潜能:让自动化文字识别融入工作流

3步解锁Umi-OCR服务化潜能&#xff1a;让自动化文字识别融入工作流 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/Git…...

macOS效率工具:Dozer极简菜单栏管理方案

macOS效率工具&#xff1a;Dozer极简菜单栏管理方案 【免费下载链接】Dozer Hide menu bar icons on macOS 项目地址: https://gitcode.com/gh_mirrors/do/Dozer 在现代工作环境中&#xff0c;macOS用户常常面临菜单栏图标过多导致的视觉混乱问题。随着各类应用程序的安…...

Qt+OpenCV+海康SDK实战:多线程回调架构下的实时视频流解码与Mat转换全流程解析

1. 项目背景与核心挑战 在智能安防和视频监控领域&#xff0c;实时视频流处理一直是技术难点。传统方案往往面临三个关键问题&#xff1a;视频流延迟高、解码效率低下、跨平台兼容性差。这正是我们选择QtOpenCV海康SDK技术栈的原因——Qt提供跨平台GUI支持&#xff0c;OpenCV负…...

避坑指南:MTK DRM屏兼容中,那些容易让你“点不亮”的硬件与配置细节(附TP复位脚案例)

MTK DRM屏兼容开发实战&#xff1a;从硬件引脚到驱动配置的深度避坑指南 在MTK平台的多屏兼容开发中&#xff0c;工程师们常常会遇到屏幕"点不亮"的棘手问题。这类问题往往源于硬件连接、引脚配置或驱动编译选项中的细微疏忽。本文将结合真实案例&#xff0c;深入剖…...

多角色语音合成解决方案:Chatterbox技术实现与应用指南

多角色语音合成解决方案&#xff1a;Chatterbox技术实现与应用指南 【免费下载链接】chatterbox Open source TTS model 项目地址: https://gitcode.com/GitHub_Trending/chatterbox7/chatterbox 在数字化内容创作与智能交互领域&#xff0c;语音合成技术正经历从单一语…...

网络协议深度解析:从OSI七层模型到TCP/IP实战应用

1. OSI七层模型&#xff1a;网络世界的通用语言 第一次接触OSI七层模型时&#xff0c;我完全被那些专业术语搞晕了。直到后来在实际项目中调试网络问题&#xff0c;才真正理解这个模型的精妙之处。简单来说&#xff0c;OSI模型就像是一本网络通信的"使用说明书"&…...

Hasklig字体终极指南:多语言编程环境中的完美适配方案

Hasklig字体终极指南&#xff1a;多语言编程环境中的完美适配方案 【免费下载链接】Hasklig Hasklig - a code font with monospaced ligatures 项目地址: https://gitcode.com/gh_mirrors/ha/Hasklig Hasklig是一款专为程序员设计的等宽字体&#xff0c;通过智能连字技…...

ParrelSync自定义参数功能:打造专属多人游戏测试环境的终极指南

ParrelSync自定义参数功能&#xff1a;打造专属多人游戏测试环境的终极指南 【免费下载链接】ParrelSync (Unity3D) Test multiplayer without building 项目地址: https://gitcode.com/gh_mirrors/pa/ParrelSync ParrelSync是一款专为Unity3D开发者设计的高效多人游戏测…...