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

LRU算法与Caffeine、Redis中的缓存淘汰策略

推荐阅读

AI文本 OCR识别最佳实践

AI Gamma一键生成PPT工具直达链接

玩转cloud Studio 在线编码神器

玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间

资源分享

「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间
https://drive.uc.cn/s/2aeb6c2dcedd4
AIGC资料包
https://drive.uc.cn/s/6077fc42116d4
https://pan.xunlei.com/s/VN_qC7kwpKFgKLto4KgP4Do_A1?pwd=7kbv#
https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH

引言

在现代计算机系统中,缓存是提高系统性能的关键技术之一。为了避免频繁的IO操作,常见的做法是将数据存储在内存中的缓存中,以便快速访问。然而,由于内存资源有限,缓存的大小是有限的,因此需要一种策略来淘汰缓存中的数据,以便为新的数据腾出空间。本文将介绍一种常用的缓存淘汰策略——最近最少使用(Least Recently Used,LRU)算法,并且比较它与Caffeine和Redis中的缓存淘汰策略。

LRU算法

LRU算法是一种基于访问时间的缓存淘汰策略。其核心思想是根据数据的访问顺序来判断数据的热度,将最近最少使用的数据淘汰出缓存。具体实现上,可以使用一个双向链表和一个哈希表来实现LRU缓存。

双向链表用于记录数据的访问顺序,新访问的数据插入链表头部,而最少访问的数据则位于链表尾部。哈希表用于快速查找数据是否在缓存中,并且能够在O(1)的时间复杂度内找到对应的链表节点。

下面是一个示例的LRU缓存的代码实现:

class LRUCache {private int capacity;private Map<Integer, Node> map;private Node head;private Node tail;class Node {int key;int value;Node prev;Node next;}public LRUCache(int capacity) {this.capacity = capacity;this.map = new HashMap<>();this.head = new Node();this.tail = new Node();head.next = tail;tail.prev = head;}public int get(int key) {Node node = map.get(key);if (node == null) {return -1;}moveToHead(node);return node.value;}public void put(int key, int value) {Node node = map.get(key);if (node == null) {node = new Node();node.key = key;node.value = value;map.put(key, node);addToHead(node);if (map.size() > capacity) {Node removed = removeTail();map.remove(removed.key);}} else {node.value = value;moveToHead(node);}}private void addToHead(Node node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}private void removeNode(Node node) {node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(Node node) {removeNode(node);addToHead(node);}private Node removeTail() {Node node = tail.prev;removeNode(node);return node;}
}

上述代码中,LRUCache类是LRU缓存的实现。其中,map用于快速查找节点,head和tail是链表的头尾节点。LRUCache类提供了get和put方法用于获取缓存数据和插入缓存数据。

Caffeine缓存淘汰策略

Caffeine是一种Java缓存库,提供了多种缓存淘汰策略。除了LRU算法外,Caffeine还支持LFU(Least Frequently Used,最不经常使用)和基于时间的淘汰策略。下面是一个示例展示了如何使用Caffeine库来创建一个LRU缓存:

LoadingCache<String, String> cache = Caffeine.newBuilder()
.cacheLoader(key -> fetchDataFromDB(key))
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener((key, value, cause) -> System.out.println("Key " + key + " was removed from cache"))
.build();String data = cache.get("key");

上述代码中,使用Caffeine的newBuilder方法创建一个缓存,设置了最大缓存大小为1000条记录,并且设置了数据在写入后的10分钟内过期。在缓存中找不到数据时,会调用fetchDataFromDB方法从数据库中获取数据,并将数据放入缓存中。

Redis缓存淘汰策略

Redis是一种内存数据库,也提供了多种缓存淘汰策略。与Caffeine类似,Redis也支持LRU、LFU和基于时间的淘汰策略。

在Redis中,可以使用maxmemory-policy配置项来设置缓存淘汰策略。下面是一个示例展示了如何使用Redis的LRU淘汰策略:

CONFIG SET maxmemory-policy volatile-lru

上述命令将缓存的淘汰策略设置为volatile-lru,即LRU淘汰策略。当缓存空间达到上限时,Redis会根据数据的访问时间来选择最近最少使用的数据进行淘汰。

总结

本文介绍了LRU算法及其在Caffeine和Redis中的应用。LRU算法是一种常用的缓存淘汰策略,通过记录数据的访问顺序来判断数据的热度,从而决定数据的淘汰顺序。Caffeine和Redis都提供了LRU淘汰策略,并且还支持其他的淘汰策略,以满足不同场景下的需求。

通过本文的介绍,读者可以了解到LRU算法的原理及其在实际应用中的实现方式。同时,也能够了解到Caffeine和Redis这两个常用的缓存库是如何使用LRU淘汰策略来提高缓存性能的。希望本文对读者在面试和实际项目中的应用有所帮助。

参考文献:

  • Caffeine: a high performance Java caching library
  • Redis Documentation

相关文章:

LRU算法与Caffeine、Redis中的缓存淘汰策略

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享&#xff0c;打开手机app&#xff0c;额外获得1T空间 https://dr…...

HTML笔记(3)

表单标签 用于登录、注册界面&#xff0c;以采集用户输入的信息&#xff0c;把信息采集到之后&#xff0c;用户一点按钮&#xff0c;就会把这些信息发送到服务端&#xff0c;服务端就可以把这些数据存储到数据库&#xff0c;所以表单是一个非常重要的html标签&#xff0c;它主要…...

c++——重写(覆盖),实际上对应的就是虚函数

重写是指派生类中存在重新定义的函数。其函数名&#xff0c;参数列表&#xff0c;返回值类型&#xff0c;所有都必须同基类中被重写的函数一致。只有函数体不同&#xff08;花括号内&#xff09;&#xff0c;派生类调用时会调用派生类的重写函数&#xff0c;不会调用被重写函数…...

算法通关村——字符串反转问题解析

1. 反转字符串 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 1.1 交换 这一题的思路还是简单的&…...

vue + elementui 中 在弹框中使用了 tree型结构(<el-tree></el-tree>),点击关闭按钮按钮重置tree

vue 项目中使用了element-ui 中 tree&#xff0c;选择了懒加载的模式 通过点击按钮&#xff0c;使得 tree 重新加载 <div class"head-container header-tree" v-if"addDialogVisible"><el-treeref"tree":data"treeData":loa…...

windows adb根据id点击按钮

在 Windows 上使用 adb 根据控件的 ID 来模拟点击按钮&#xff0c;可以使用以下命令&#xff1a; 查看当前屏幕上的所有控件信息&#xff0c;并将其保存到文件中&#xff1a; adb shell uiautomator dump /sdcard/ui.xml 将设备上的 ui.xml 文件下载到计算机上&#xff1a; ad…...

netty(一):NIO——处理消息边界

处理消息边界 为什么要处理边界 因为会存在半包和粘包的问题 1.客户端和服务端约定一个固定长度 优点&#xff1a;简单 缺点&#xff1a;可能造成浪费 2.客户端与服务端约定一个固定分割符 *缺点 效率低 3.先发送长度&#xff0c;再发送数据 TLV格式&#xff1a; type…...

等保测评--安全计算环境--测评方法

安全子类--身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 一、测评对象 终端和服务器等设备中的操作系统(包括宿主机和虚拟机操作系统) 、网络设备(包括虚拟网络设备)、安全设备(包括虚拟安全设备)、移动终端…...

open cv学习 (二)色彩空间和通道

色彩空间和通道 demo1 import cv2hsv_image cv2.imread("./img.png")cv2.imshow("img", hsv_image) hsv_image cv2.cvtColor(hsv_image, cv2.COLOR_BGR2HSV) h, s, v cv2.split(hsv_image) cv2.imshow("B", h) cv2.imshow("G", s…...

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习 一、串行&#xff08;异步/同步)通讯、并行通讯、以太网通讯 二、单工通讯/半双工通讯/双工通讯 三、常用硬件接口&#xff08;工业上基本是RS485两线制的接线&#xff09; 常用硬件接口RS232/RS422/RS485&#xff0c;…...

背景属性样式

&#x1f353;背景属性 属性名称中文注释备注background-image背景图片url(img-path)background-color背景颜色background-attachment设置背景固定scroll默认值&#xff0c;随盒子滚动&#xff0c; fixed固定&#xff0c;脱离标准流&#xff0c;固定在浏览器窗口&#xff0c;当…...

蓝桥杯每日N题 (消灭老鼠)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…...

k8s 用户角色 权限的划分

在Kubernetes中&#xff0c;角色&#xff08;Role&#xff09;和角色绑定&#xff08;RoleBinding&#xff09;用于划分用户的权限。 Kubernetes中的角色定义了一组特定操作的权限&#xff0c;例如 创建、删除或修改特定资源。而 角色绑定则将角色与用户、组或服务账号进行关联…...

聊一下操作系统 macOS 与 Linux

对于Windows操作系统大家都比较熟悉&#xff0c;也常拿它与Linux操作系统进行比较&#xff0c;两者之间的差异也很明显。但对于macOS 和 Linux的比较不太多&#xff0c;很多人认为它们很相似&#xff0c;因为这两种操作系统都可以运行 Unix 命令。其实详细比较下&#xff0c;两…...

OJ练习第153题——分发糖果

分发糖果 力扣链接&#xff1a;135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。…...

iOS 通知推送服务端部署测试过程详细版

文章目录 iOS 通知推送服务端部署测试过程详细版前言部署Serverless 版Bark-server1.注册Render 账号2.创建一个Web Service3.连接 repository4.Web Service 设置推送测试1.手机端安装 bark2.设定服务器3.发送测试推送请求参数列表:4.手机推送结果iOS 通知推送服务端部署测试过…...

【COMP282 LEC3 LEC4 LEC5】

LEC 3 Overloading 超载 1. Two functions can have the same name if they have different parameters 2. The compiler will use the one whose parameters match the ones you pass in Performing Addition “” 重载一个operator &#xff0c;这个operator函数被定义…...

panda3d加载模型复习和python面向对象编程属性学习

运行一个python示例&#xff1b;然后去除一些代码&#xff0c;只剩下加载模型相关&#xff0c;如下&#xff1b; from panda3d.core import loadPrcFileData # Configure the parallax mapping settings (these are just the defaults) loadPrcFileData("", "p…...

使用 Node.js 生成优化的图像格式

使用 Node.js 生成优化的图像格式 图像是任何 Web 应用程序的重要组成部分&#xff0c;但如果优化不当&#xff0c;它们也可能成为性能问题的主要根源。在本文中&#xff0c;我们将介绍如何使用 Node.js 自动生成优化的图像格式&#xff0c;并以最适合用户浏览器的格式显示它们…...

【WinAPI详解】<CreateWindowEx详解>

函数原型: HWND CreateWindowEx(DWORD dwExStyle, //窗口的扩展风格&#xff08;加强版专有&#xff09;LPCTSTR lpClassName, //已经注册的窗口类名称LPCTSTR lpWindowName,//窗口标题栏的名字DWORD dwStyle, //窗口的基本风格int x, //窗口左上角水平坐标位置int …...

【Git】分支管理

文章目录 一、理解分支二、创建、切换、合并分支三、删除分支四、合并冲突五、合并模式六、分支策略七、bug分支八、强制删除分支 努力经营当下 直至未来明朗&#xff01; 一、理解分支 HEAD指向的是master分支&#xff0c;master中指向的是最新一次的提交&#xff0c;也就是m…...

玩转单元测试之gtest

引言 程序开发的时候&#xff0c;往往需要编写一些测试样例来完成功能测试&#xff0c;以保证自己的代码在功能上符合预期&#xff0c;能考虑到一些异常边界问题等等。 gtest快速入门 1.引入gtest # 使用的是1.10版本&#xff0c;其他版本可根据需要选择 git clone -b v1.1…...

Tomcat 一次请求的生命周期

在使用 Tomcat 的时候&#xff0c;我们只需要在 Servlet 实现类中写我们的业务逻辑代码即可&#xff0c;不需要管 Socket 连接、协议处理要怎么实现&#xff0c;因为这部分作为不经常变动的部分&#xff0c;被封装到了 Tomcat 中&#xff0c;程序员只需要引入 Tomcat 中即可&am…...

spring cloud gateway中配置uri

gateway中配置uri配置有三种方式: websocket方式&#xff1a;uri: ws://localhost:9000http方式: uri: http://localhost:8130/lb注册中心配置方式&#xff08;注册的服务名称&#xff09;: uri: lb://monitor-ms gateway的lb方式识别的服务名称命名规则&#xff1a; "[…...

使用NAudio录制wav音频

NAudio NAudio官网 环境 Unity2019.4.34f1c1 Window10 NAudio 1.10 .Net 3.5 录制音频 WaveInEvent类可录制音频 StartRecording方法 启用录制StopRecording方法 停止录制DataAvailable 录制中回调RecordingStopped 录制结束回调 WaveFileWriter类可存储音频 Write方法…...

数据结构之动态内存管理机制

目录 数据结构之动态内存管理机制 占用块和空闲块 系统的内存管理 可利用空间表 分配存储空间的方式 空间分配与回收过程产生的问题 边界标识法管理动态内存 分配算法 回收算法 伙伴系统管理动态内存 可利用空间表中结点构成 分配算法 回收算法 总结 无用单元收…...

【汇编语言】栈及栈操作的实现

文章目录 栈结构栈操作栈的小结 栈结构 栈是一种只能在一端插入或删除的数据结构&#xff1b;栈有两个基本的操作&#xff1a;入栈和出栈&#xff1b; 入栈&#xff1a;将一个新的元素放到栈顶&#xff1b;出栈&#xff1a;从栈顶取出一个元素&#xff1b; 栈的操作规则&#…...

【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

【JavaEE】Spring AOP&#xff08;1&#xff09; 文章目录 【JavaEE】Spring AOP&#xff08;1&#xff09;1. Spring AOP 是什么1.1 AOP 与 Spring AOP1.2 没有AOP的世界是怎样的1.3 AOP是什么 2. Spring AOP 框架的学习2.1 AOP的组成2.1.1 Aspect 切面2.1.2 Pointcut 切点2.1…...

SpringBoot+微信小程序奶茶在线点单小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的奶茶在线点单小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff…...

【支付宝小程序】开发基础--文件结构教程

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 &#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求收…...

重庆江北营销型网站建设公司推荐/谷歌浏览器搜索入口

统计表格是实验数据、统计结果或事物分类的一种有效表达形式&#xff0c;是科技论文中经常使用的一种特殊信息语言&#xff0c;是描述科技文献的重要工具和手段。在撰写科技论文的过程中&#xff0c;通过正确使用统计表格&#xff0c;对获取到的资料数据进行归纳、整理、统计学…...

做区块链在哪个网站/培训报名

在实际开发中&#xff0c;项目经理会一直强调一句话&#xff0c;永远不要相信客户端的数据(前端可以不用验证&#xff0c;但是后端必须验证)。大家同意这样的说法吧。。新端验证毋庸质疑JS验证&#xff0c;提高用户体验我们不得不添加一些与后端一致的验证逻辑&#xff0c;同样…...

网站负责人彩色验照/汕头seo公司

三、网络属性设置(如果你只有一台电脑&#xff0c;且外网IP就在服务器上&#xff0c;不做局域网主机的话&#xff0c;那么将不进行这个操作&#xff09;要使用以上所述服务&#xff0c;本机必须要有静态&#xff08;即固定&#xff09;的IP地址。如果只是在局域网中使用&#x…...

wordpress stheme/免费的个人网页

1.先搞清微信小程序的生命周期和页面生命周期的关系 微信小程序的生命周期包括App生命周期和页面生命周期。App生命周期指的是小程序从启动到退出的整个过程&#xff0c;而页面生命周期则是指小程序中每个页面从创建到销毁的过程。 在小程序中&#xff0c;当用户打开小程序时&a…...

广东省城乡住房建设厅网站首页/月饼营销软文

1、首先进入组件服务&#xff0c;查看组件服务/计算机/我的电脑/COM应用程序&#xff0c;结果报错“COM 无法与 Microsoft 分布式事务协调程序交谈”&#xff0c;无法查看里面的对象。 2、进入事件查看器&#xff0c;发现msdtc服务没有正常启动。 3、删除注册表中的键&#xff…...

日本网站欣赏/宁海关键词优化怎么优化

一、需求&#xff1a;有这么一张表前四个属性当作联合主键需要把该表所有的行在前端以表格形式显示出来&#xff0c;要求activityId相同时合并成一行&#xff0c;activityCode相同时&#xff0c;合并一行&#xff0c;activityVersion相同时也合并一行。类似这种&#xff1a;二、…...