MRU算法实现

news/2024/11/20 11:28:38/文章来源:https://www.cnblogs.com/lianshuiwuyi/p/18289833

MRU(Most Recently Used)算法是一种缓存替换策略,与LRU(Least Recently Used)算法相反。MRU算法优先移除最近使用的缓存项,而保留较久未使用的缓存项。MRU算法适用于某些特定的访问模式,例如当数据访问具有较强的局部性时,MRU可能比LRU更有效。

基本原理

MRU算法的核心思想是,当缓存需要淘汰旧条目时,选择最近使用过的条目进行淘汰。这种策略基于一种假设,即最近被使用的条目将来不太可能会再次被访问。因此,优先淘汰这些条目可以提高缓存的命中率。

适用场景

MRU算法适用于某些特定的访问模式。例如,当数据访问存在“短期集中访问”特性时,即某段时间内某些数据被频繁访问,但之后很长一段时间内不会再被访问,这种情况下MRU可能比LRU更有效。

实现方法

MRU算法的实现通常涉及以下步骤:

  1. 缓存初始化:设置一个固定大小的缓存。
  2. 访问缓存
    • 如果访问的数据在缓存中,则更新该数据的使用时间或顺序。
    • 如果访问的数据不在缓存中:
      • 如果缓存未满,将数据直接放入缓存。
      • 如果缓存已满,选择最近使用过的条目进行替换。
  3. 记录使用顺序:通常使用堆栈或链表记录每个缓存条目的访问时间或顺序。

MRU算法的优缺点

优点

  • 适用于某些特定的访问模式,例如数据访问具有较强的局部性时。
  • 实现简单,易于理解和维护。

缺点

  • 对于大多数常见的访问模式,MRU的性能可能不如LRU。
  • 在某些情况下,MRU可能会导致频繁的缓存替换,降低缓存命中率。

Go实现示例

package mruimport ("container/list""sync"
)// MRUCache represents a Most Recently Used (MRU) cache.
type MRUCache struct {mtx      sync.Mutexcapacity intcache    map[any]*list.Elementlist     *list.List
}// NewMRUCache creates a new MRUCache with the given capacity.
func NewMRUCache(capacity int) *MRUCache {return &MRUCache{capacity: capacity,cache:    make(map[any]*list.Element),list:     list.New(),}
}// Get returns the item from the cache.
// This function is safe for concurrent access.
func (c *MRUCache) Get(item any) any {c.mtx.Lock()defer c.mtx.Unlock()node, exists := c.cache[item]if exists {return node.Value} else {return nil}
}// Add adds the given item to the cache.
// This function is safe for concurrent access.
func (c *MRUCache) Put(item any) {c.mtx.Lock()defer c.mtx.Unlock()// if capacity is 0, nothing can be added, so just returnif c.capacity == 0 {return}// check if the item is already in the cacheif node, exists := c.cache[item]; exists {node.Value = itemc.list.MoveToFront(node)return}// if the cache is full, remove the front elementif c.list.Len() == c.capacity {elem := c.list.Front()c.list.Remove(elem)delete(c.cache, elem.Value)}// add the new item to the back of the listnode := c.list.PushFront(item)c.cache[item] = node
}

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740571.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

py-》生成自定义文件大小

生成自定义文件大小import os import time# 获取username, 如chinaren def getusername():namelist = os.popen(echo %username%).readlines()username = namelist[0].replace("\n", "")# 获取当前的usernamereturn username# 获取时间和日期 def getnowda…

【可视化还能免费做?!】用这款免费可视化工具做智慧港口建设,实现港口统一调度

在智慧港口的建设中,实现港口的统一调度是一项关键任务。山海鲸可视化,这款免费可视化工具,通过其卓越的功能和特色,为智慧港口的建设提供了强大的支持。从智慧港口的需求出发,结合船舶调度和货物转运的需求,山海鲸可视化能够实现二三维融合,将二维面板与三维场景无缝结…

你真的了解Java内存模型JMM吗?

面试连环call: 1. 什么是Java内存模型(JMM)? 为什么需要JMM? 2. Java线程的工作内存和主内存各自的作用? 3. Java缓存一致性问题? 4. Java的并发编程问题?哈喽,大家好🎉,我是世杰。 本文我为大家介绍面试官经常考察的「Java内存模型JMM相关内容」面试连环call什么是J…

Lucene-7.4.0简要介绍和初学者快速上手

通过一个自建的索引案例,分几篇记录Lucene使用中的心得和存在的问题。 本文的目的是能让初学者快速学会Lucene的使用,所以所涉及的原理都会十分粗浅,而不讨论更深层次的实现过程。 一、什么是Lucene 首先看一下摘自百度百科的定义:“Lucene是一套用于全文检索和搜寻的开源程…

Ubuntu 2204 安装使用 mariadb

1. 查看mariadb版本,实际上使用的还是mysqld命令: mysqld --version 2. 3. 4. 5. 6. 7.

Docker安装命令

事先声明-对于命令直接粘进去执行就可以Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 最重要一点:Docker CE 支持 64 位版本 CentOS 7…

elemenet 级联

两种数据格式 注释掉的是一种格式,未注释的是另一种格式。<template><div><!-- <select v-model="selectedProvince" @change="provinceChanged"><option v-for="province in provinces" :value="province.code&q…

树莓派4B-PCA9685驱动舵机

直接用树莓派的引脚输出PWM控制舵机,舵机是会出现抖动的。就算代码进行一定的时延迟优化还是会有影响的。现在我们可以使用PCA9685这个模块去驱动舵机,做到高精度控制舵机。前言 不知道你们有没有遇到过这么一种情况,直接用树莓派的引脚输出PWM控制舵机,舵机是会出现抖动的…

docker-compose vs docker-stack

docker-compose vs docker-stack 都是docker两个容器编排工具,docker-compose是属于第三方容器编排工具需要单独安装,docker-stack是docker内置容器编排工具。 docker-compose一般配合K8S使用,目前要容器管理方面K8S有着比较明显的优势,所以docker-compose 目前比较流行。 …

DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程。从实验结果来看,效果非常不错 来源:晓飞的算法工程笔记 公众号论文: Should All Proposals be Treated Equally in Object Detection?论文地址:https://arxiv.org/abs/2207…

ENVIFormat开源样本库使用教程

前段时间分享了两个开源样本库:GID-ENVIFormat和Five-Billion-Pixels-ENVIFormat样本库。这两个样本库均包含大量影像底图和高质量的样本数据。GID-ENVIFormat样本库包含5类别和15类别样本数据,Five-Billion-Pixels-ENVIFormat包含24类别样本数据。有关样本库数据的获取可参考…

新架构下服务建模,关键在这6步!

经纬恒润基于SystemWeaver平台,按照SOA建模理念为客户提供了新一代基于SOA的企业级电子电气系统协同设计解决方案,可以有效支持服务和信号的混合架构建模。 随着AUTOSAR、SOA、以太网通讯等新技术、新理念的成熟化,面向软件、硬件、网络、电气等多领域的电子电气系统经…