【算法系列】淘汰算法之LRU

web技术分享| LRU 缓存淘汰算法 了解 LRU 之前,我们应该了解一下缓存,大家都知道计算机具有缓存内存,可以临时存储最常用的数据,当缓存数据超过一定大小时,系统会进行回收,以便释放出空间来缓存新的数据,但从系统中检索数据的成本比较高。 缓存要求: 固定大小:缓存需要有一些限制来限制内存使用。 快速访问:缓存插入和查找操作应该很快,最好是 O(1) 时间。 在达到内存限制的情况下替换条目:缓存应该具有有效的算法来在内存已满时驱逐条目 如果提供一个缓存替换算法来辅助管理,按照设定的内存大小,删除最少使用的数据,在系统回收之前主动释放出空间 阅读详情

LRU算法

LRU(The Least Recently Used)最近最少使用。

LRU算法的思想

如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。

因此,当空间满时,最久未被使用的数据最先被淘汰。

LRU算法的描述

设计一种缓存结构,该结构在构造时确定大小,假设大小为 K,并有两个功能:

  • put(key, value)将记录(key, value)插入该结构。当缓存满时,将最久未使用的数据淘汰掉。

  • get(key)返回key对应的value值。

LRU算法的实现

  1. 最朴素的思想就是用数组+时间戳的方式,不过这样做效率较低。

  2. 我们可以用双向链表(LinkedList)+哈希表(HashMap)实现(链表用来表示位置,哈希表用来存储和查找)。

  3. 直接使用Java里有的数据结构LinkedHashMap。

LRUCache

package com.itplh;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author: tanpenggood
 * @date: 2020-09-17 10:49
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private int cacheSize;

    public LRUCache(int cacheSize) {
    	// LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
        // 关键:使用的三个参数的构造方法,将accessOrder设置为true,LinkedHashMap默认为false
        super(16, (float) 0.75, true);
        this.cacheSize = cacheSize;
    }

	/**
     * 当缓存空间不够时,淘汰最久未使用的数据
     * 
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > cacheSize;
    }

}

LRUCacheTest

package com.itplh;

import lombok.extern.slf4j.Slf4j;

/**
 * @author: tanpenggood
 * @date: 2020-09-17 10:49
 */
@Slf4j
public class LRUCacheTest {

    public static void main(String[] args) {
        LRUCache<String, Integer> cache = new LRUCache<>(5);
        for (int i = 1; i <= 5; i++) {
            cache.put("k" + i, i);
        }
        log.info("all cache: {}", cache);
        cache.get("k3");
        log.info("get k3: {}", cache);
        cache.get("k4");
        log.info("get k4: {}", cache);
        cache.get("k4");
        log.info("get k4: {}", cache);
        cache.put("k" + 10, 10);
        log.info("After running the LRU algorithm cache: {}", cache);
    }
}

Output

all cache: {k1=1, k2=2, k3=3, k4=4, k5=5}
get k3: {k1=1, k2=2, k4=4, k5=5, k3=3}
get k4: {k1=1, k2=2, k5=5, k3=3, k4=4}
get k4: {k1=1, k2=2, k5=5, k3=3, k4=4}
After running the LRU algorithm cache: {k2=2, k5=5, k3=3, k4=4, k10=10}

总结

  1. 每一次从cache中get数据时会将取出来的元素移到队尾。
  2. 向cache中put数据时,先将新数据存到队尾,再判断缓存空间是否够用,若空间不够,则淘汰队首(最久未使用)的元素。

参考

缓存算法(FIFO 、LRU、LFU三种算法的区别)

Bellhop水声信道模型的仿真 Bellhop是一种基于射线追踪的水声信道模型,广泛用于预测水下环境中的声压场。它通过模拟声波在水中的传播路径,计算声场分布,适用于复杂的水下通信场景。 阅读详情

相关推荐

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3563

缓存淘汰算法--LRU算法的原理与应用

本文LRU算法的含义、应用、Java实现。 LRU算法全称是:Least Recently Used,即:检查最近最少使用的数据。这个算法通常使用在内存淘汰策略中,用于将不常用的数据转移出内存,将空间腾给最近更常用的“热点数据”。

IT利刃出鞘的博客 2373

金蝶云星空初级实施认证考题

Q4.[单选题] (1.5分) 总账中的多账簿账表主要是基于什么进行查看的Q47.[多选题] (2.5分) 销售订单的收款计划页签勾选预收之后,预收控制环节可以控制哪些节点?

m0_51994557的博客 3117

Redis缓存淘汰算法——LRU

LRU算法原理分析,手写LRU示例,redis中的lru

m0_62909831的博客 2274

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 412

海康DS-7604N-K1/RTB固件包

【摘要】海康DS-7604N-K1/RTB萤石云设备发布V4.30.091版本升级程序(2022.09.19),仅适用于指定型号。升级前需先升级至V3.4.106基础版本,刷机会重置设备为未激活状态,需重新设置admin密码。该机型支持密码/手势登录,无密码时可通过U盘升级。注意事项:升级存在风险,需确认程序适用性;升级过程严禁断电;必须阅读压缩包内的刷机说明。此为定制机型,非必要不建议升级。(150字)

海康威视技术支持 1568

缓存淘汰算法之LRU

参考:http://www.cnblogs.com/-OYK/archive/2012/12/05/2803317.html     http://blog.youkuaiyun.com/exceptional_derek/article/details/11713255

jueshengtianya的专栏 1136

lammps教程:官方自带eam_database程序拟合EAM势方法介绍

使用lammps模拟金属体系,最常用的势函数为eam、meam势。 对于大多数金属或者合金来说,可以从网上下载相对应的eam或meam势力场文件。 而对于一些新的合金材料,可能就找不到相对应的力场文件。 解决的方法有两种,一是采用混合势(pair_style hybrid),第二种方法是自己拟合势函数文件。 混合势的写法在前面文章中已经介绍过,本文介绍一种拟合EAM势的方法。 该方法是运行Xiaowang Zhou编写的一个拟合程序,该程序可自动生成所需要的合金势。 这个程序能够拟合的合金元素有: Cu,

lammps_jiayou的博客 4613

手写缓存之Lru缓存淘汰算法

随着近些年大型电商应用(例如京东、阿里巴巴等)的迅速发展,本地缓存和分布式缓存相关技术被大量的应用。那么这些缓存的核心算法都有哪些呢,上次给大家手写了FIFO先进先出算法的实现过程,感兴趣的可以通过手写缓存之FIFO先进先出算法来进行学习和回顾。那么今天给大家介绍的是Lru淘汰缓存算法。手写缓存之FIFO先进先出算法 Lru算法是近些年来一些大型电商平台比较推荐的一种算法,其原理是在我们的缓存满了以后按照访问数量来进行淘汰,优先淘汰那些访问次数比较低的缓存数据,大家来看下面的示例图来加深理解。 大家可以从图

m0_72106802的博客 1082

DSI3接口介绍

DSI3(distributed system interface)分布式系统接口,是一种强大且通用的总线协议,旨在将多个遥感器和执行器互连到中央控制模块。在单总线中集成了电压信号、电流信号还有电源,甚至引用了3位状态机概念(反向数据),从逻辑0/1扩展到了0/1/2。

Airer_00的博客 4295

【异常】Cursor导入Karpathy指南失败解决方案Failed to import GitHub/GitLab rules: Error executing git: Cloning into

摘要:本文解决了Git克隆单个文件报错的问题,指出git clone只能克隆整个仓库而非单个文件。提供了两种解决方案:1) 推荐手动创建规则文件,在Cursor项目中新建.mdc文件并粘贴Karpathy行为指南完整内容;2) 备选克隆整个仓库获取文件。指南包含编码行为规范,强调简单性、精准修改和明确目标。还说明了如何设置全局规则和即时生效的方法。

奶爸的编程之路,也就一周冷个三天 174

内卷大厂系列《LRU 缓存淘汰算法》

LRU 是什么? LRU 是 Least Recently Used 的缩写,即最近最少使用,是一种常用的内存淘汰数据算法,即淘汰掉最近最少使用的缓存数据。 LRU 功能需求 请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存。int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void .

R先生专栏 1万+

使用GitLab的VS Code插件 GitLab Workflow 来进行项目的DevOps管理,助力研发效能

使用VS Code的GitLab Workflow插件,进行项目的DevOps管理,将效率提升到MAX。直接在VScode中管理流水线,一键跳转到创建 Issues,MR

知无涯 5290

缓存淘汰算法系列之1——LRU类

缓存淘汰算法系列之1——LRU类 1. LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 1.2. 实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1. 新数据插入到链表头部; 2. 每当缓

526

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【❤重点❤】【数据结构系列】——LRU缓存淘汰算法

146. LRU 缓存机制 LRU缓存淘汰算法 LRU 算法实际上是让你设计数据结构: 首先要接收一个 capacity 参数作为缓存的最大容量, 然后实现两个 API, 一个是 put(key, val) 方法存入键值对, 另一个是 get(key) 方法获取 key 对应的 val, 如果 key 不存在则返回-1。 LRU 缓存算法的核心数据结构就是哈希链表, 双向链表和哈希表的结合体。 cache这个数据结构必备条件: 显然cache中的元素必须有时序,以区分最近使用的和长久未使用的数据,当容量满

your_棒棒糖的博客 189

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【转】缓存淘汰算法系列之1——LRU类

原文地址:http://www.360doc.com/content/13/0805/15/13247663_304901967.shtml 参考地址(一系列关于缓存的,后面几篇也都在这里有):http://www.360doc.com/userhome.aspx?userid=13247663&cid=48# 1. LRU1.1. 原理 LRU(Least recently ...

weixin_30699235的博客 63

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据缓存策略 缓存淘汰算法系列 Second-chance FIFO NRU LRU LRU-K Clock Gclock WSclock Two queues

前言   缓存算法历史已经很久了,但在楼主查询相关资料时,发现知识零碎,且原理介绍的很不详细,遂有了总结常用缓存算法文章的想法,以供广大朋友们查阅。本文是缓存系列的第一篇,知识侧重于初略的介绍,并未深入。   一、Second-chance   1、算法思想     这是FIFO算法的改进版,相对于FIFO算法立刻淘汰对象,该算法会检查待淘汰对象的引用标志位。如果对象被引用过,该对象引用...

huizai的博客 5204

缓存淘汰算法--LRU算法

1.LRU 1.1LRU原理 LRU(least recently read,最近最少使用)算法根据数据的历史访问j记录来进行淘汰数据,其核心思想是如果数据最近被访问过,那么将来被访问的几率也更高。 1.2实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1.新数据插入到链表头部; 2.每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 3.当链表满的时候,

u014641018的博客 553

Redis核心技术-高频问题-缓存淘汰策略

  内存不是无限大的,有用完的时候,当内存满时,边触发Redis淘汰策略。 淘汰策略分类   淘汰策略总共8种。 不进行数据淘汰的策略   noeviction,默认使用的配置。   noeviction策略是缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。 设置了过期时间的数据中进行淘汰   volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis 4.0 后新增)。   volatile-ttl: 根据过期时间的

ALONG的博客 1057

玩转Redis-8种数据淘汰策略及近似LRU、LFU原理

此文转载自:https://my.oschina.net/zxiaofan/blog/4765393 大咖揭秘Java人都栽在了哪?点击免费领取《大厂面试清单》,攻克面试难关~>>> >  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【14】篇,最新系列文章请前往公众号“zxiaofan”(点我点我)查看,或百...

Python研究所 502

Redis内存淘汰

Redis内存淘汰

y674945473的博客 184

redis key的淘汰策略

Redis中共有下面八种内存淘汰策略: volatile-lru:设置了过期时间的key使用LRU算法淘汰; allkeys-lru:所有key使用LRU算法淘汰; volatile-lfu:设置了过期时间的key使用LFU算法淘汰; allkeys-lfu:所有key使用LFU算法淘汰; volatile-random:设置了过期时间的key使用随机淘汰; allkeys-random:所有key使用随机淘汰; volatile-ttl:设置了过期时间的key根据过期时间淘汰,越早过期越早淘汰; noe

horse_xiao的博客 984

redis缓存淘汰策略

当有新数据进入候选数据集后,如果候选数据集中的数据个数达到了 maxmemory-samples,Redis 就把候选数据集中 lru 字段值最小的数据淘汰出去。而且,当有数据被访问时,需要在链表上把该数据移动到 MRU 端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。LRU 算法的全称是 Least Recently Used,从名字上就可以看出,这是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。

m0_61923610的博客 255
上一篇: 【Exception】The dependencies of some of the beans in the application context form a cycle
下一篇: 【算法系列】淘汰算法之LFU
tanpenggood
博客等级 码龄9年 129粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值