ARC算法实现

news/2024/11/15 21:02:53/文章来源:https://www.cnblogs.com/lianshuiwuyi/p/18298460

1. 概述

Adaptive Replacement Cache(ARC)是一种缓存替换算法,用于提高缓存的命中率。ARC 动态调整缓存策略,以适应实际的访问模式,从而在不确定的工作负载下表现良好。它通过同时维护两个缓存列表来追踪最近使用和频繁使用的数据块,并根据访问模式在这两个列表之间动态分配缓存空间。

2. 基本概念

ARC 使用两个LRU队列(T1和T2)和两个历史列表(B1和B2):

  • T1: 存储一次命中(recently used once)的缓存项。
  • T2: 存储多次命中(recently used multiple times)的缓存项。
  • B1: 存储曾经在T1中,但已经被移除的缓存项。
  • B2: 存储曾经在T2中,但已经被移除的缓存项。

3. 主要操作

  • 缓存命中:如果缓存项在T1或T2中,则为缓存命中。
  • 缓存未命中:如果缓存项不在T1和T2中,则为缓存未命中。

ARC的核心操作如下:

  1. 插入
    • 若新缓存项在T1或T2中,则移动到T2的前端。
    • 若不在T1或T2中,则插入到T1的前端。
  2. 调整缓存大小
    • 若新缓存项在B1中,则表明最近访问模式偏向于访问新的缓存项,增加T1的容量。
    • 若新缓存项在B2中,则表明最近访问模式偏向于访问频繁访问的缓存项,增加T2的容量。
  3. 替换
    • 根据动态调整的容量,从T1或T2中移除最旧的缓存项,并将其元数据移动到B1或B2。

4. 线程安全的Go实现示例

以下是一个简单的线程安全的ARC缓存的Go实现:

package arcimport ("container/list""sync"
)type ARC struct {mtx      sync.Mutexcapacity intt1       *list.Listb1       *list.Listt2       *list.Listb2       *list.Listcache    map[interface{}]*list.Element
}func NewARC(capacity int) *ARC {return &ARC{capacity: capacity,t1:       list.New(),b1:       list.New(),t2:       list.New(),b2:       list.New(),cache:    make(map[interface{}]*list.Element),}
}// Get returns the item from the cache.
func (c *ARC) Get(item any) any {c.mtx.Lock()defer c.mtx.Unlock()if elem, found := c.cache[item]; found {c.t2.MoveToFront(elem)return elem.Value}return nil
}func (c *ARC) Put(item any) {c.mtx.Lock()defer c.mtx.Unlock()if c.capacity == 0 {return}if elem, found := c.cache[item]; found {elem.Value = itemc.t2.MoveToFront(elem)return}// not found, so add it to the cacheif c.t1.Len()+c.t2.Len() == c.capacity {if c.t1.Len() == c.capacity {c.removeLast(c.b1)} else {c.removeLast(c.t1)}} else if c.t1.Len()+c.b1.Len()+c.t2.Len()+c.b2.Len() >= c.capacity {if c.t1.Len()+c.b1.Len()+c.t2.Len()+c.b2.Len() == 2*c.capacity {c.removeLast(c.b2)} else {c.removeLast(c.t2)}}// add the new item to the cacheelem := c.t1.PushFront(item)c.cache[item] = elem
}// removeLast removes the last element from the list.
func (c *ARC) removeLast(l *list.List) {if l.Len() == 0 {return}elem := l.Back()l.Remove(elem)delete(c.cache, elem)
}

说明:

  • NewARC:创建一个新的ARC缓存实例。
  • Get:从缓存中获取值,并将其提升到T2。
  • Put:插入新的缓存项,并根据ARC的规则调整缓存。
  • removeLast:从指定列表中移除最后一个元素。

孟斯特

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


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

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

相关文章

西瓜种类与挑选方法

感觉十分有用,留存一下 转载自微信公众号:科技da表哥 西瓜种类如何挑选西瓜

阿里云oss配置:

一,创建bucket bucket是,存储空间是OSS的全局命名空间,相当于数据的容器,可以存储若干文件。点 完成创建 按钮 二,创建账号供访问oss资源创建用户成功后,把accesskey id和accesskey secret复制保存下来三,创建对bucket的访问策略最后点击 确定 按钮创建

Lua调用C的函数

#include <iostream> #include <string> using namespace std;extern "C" {#include "lua.h"#include "lualib.h"#include "lauxlib.h" }int myTest(lua_State* L) {// 获得Lua函数的参数的数量int nArgs = lua_gettop(L)…

如何强制删除文件夹

前几天下载了ZeroTier,不知道是哪里出问题了,手动删除文件夹一直不成功,一直提示“你需要xxx权限才能删除改文件夹”,就算我修改了文件夹所有者有无济于事,在网上找了很多方法都没用,比如说“shift+del”,还是会提示我权限不够 后面找到一个方法终于解决了 每次删文件都提…

pdf.js源码分析-字体加载流程

pdf.js中的字体加载流程,下面演示一种Type1的字体的加载流程,会把一些兼容性的内容省去,只记录字体数据的加载过程中涉及到的方法和作用:evaluator.js -> handleSetFont:操作符列表中加载字体 evaluator.js -> loadFont:加载字体的方法 evaluator.js -> preEval…

vmware个人版免费

官方个人免费版本的VMware产品 2024年5月15日,PC虚拟巨头VMware宣布旗下的两款产品VMware Workstation Pro和VMware Fusion Pro即日起对个人用户免费开放。博通官网注册账号 打开地址:https://www.broadcom.com/ 登录 https://support.broadcom.com/web/ecx/home#.下载安装免…

企业微信对接

基本概念corpid 每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限) userid 每个成员都有唯一的userid,即所谓“账号”。在管理后台->“通讯录”->点进某个成员的详情页,可以看到。 部门id 每个部门都…

【unity开发】怎么下载国际版的unity编辑器版本

有一天从公司那接手了一个项目,然后发现那个项目的版本我没有,我就去unity官网下载。 下载完了发现还是版本不对。 仔细一看发现,他们用的版本号末尾少了个"c1"。c1的意思是中国特供版,好像是说有微信api的支持。那么我应该怎么做呢? 下面随便一个版本为例子1.点…

html+js实现选中左边的数据到右边

效果后台要开发个功能,给游戏内的用户赠送道具,先把道具列表展示,然后选择要增送的道具,可以加上道具图片之类的,美化 index.html 页面没有美化,只是实现了效果。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&qu…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

本文全面介绍了在选择合适的代理时应考虑的因素,涵盖了各种代理类型(如高匿代理、隧道代理等)的特点及其适用场景。文章深入探讨了常见的反爬虫策略,以及如何通过调整爬虫策略来应对这些策略,从而提升爬虫的效率和稳定性。适合对网络爬虫开发和代理技术感兴趣的读者阅读。…

Redis部署与使用

一、关系型数据库与非关系型数据库 1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。 主流的关系型数据库…

excel表格中怎样将一列的数值全部加上一个数值

1、打开目标文件2、然后在B1或者其它单元格中输入数字“10”,如图所示。3、然后鼠标右击此单元格,在右键菜单中执行“复制”命令。4、然后选中要加10的所有数据,在右键菜单中点击“选择性粘贴”选项5、然后在出现的窗口中,点击运算区域的“加”选项,进行确定。6、完成以上…