缓存淘汰策略看完这篇就够了

LFU 缓存淘汰算法

LFU 是 Least Frequently Used 的缩写,即 最少使用 缓存淘汰算法。LFU算法根据数据项在缓存中的访问频率来决定淘汰哪些数据项。访问频率越高 的数据项被认为是更重要的,访问频率越低 的数据项被认为是更不重要的。

LFU算法的具体工作原理如下:

  1. 每个数据项 在缓存中都有一个计数器,用于记录该数据项被访问的次数。
  2. 当缓存空间不足 时,LFU算法会淘汰计数器值最小的数据项。
  3. 当数据项被访问 时,其计数器值会加 1。

在这里插入图片描述

LFU算法的优点如下:

  • 简单易行:LFU算法的实现比较简单,易于理解和维护。
  • 公平性:LFU算法可以保证经常使用的数据项不会被淘汰,具有一定的公平性。
    LFU算法的缺点如下:
  • 不准确:LFU算法只考虑数据项的访问频率,而不考虑数据项的访问时间。因此,LFU算法可能会淘汰最近访问过的数据项,导致缓存命中率下降。
  • 空间复杂度:LFU算法需要为每个数据项维护一个计数器,这会增加缓存的空间复杂度。

LFU算法的应用场景

LFU算法常用于对缓存命中率要求不高 的场景,例如:

  • Web 缓存:Web 缓存中存储的通常是静态数据,例如图片、CSS 和 JavaScript 文件。这些数据的访问频率通常是固定的,因此使用 LFU 算法可以有效地提高缓存空间的利用率。
  • 数据库缓存:数据库缓存中存储的通常是经常访问的数据。这些数据的访问频率可能会随着时间的推移而变化,因此使用 LFU 算法可以保证经常使用的数据项不会被淘汰。

LFU算法的改进

为了克服 LFU 算法的缺点,人们提出了改进的 LFU 算法,例如:

  • LFU-A:LFU-A 算法不仅考虑数据项的访问频率,还考虑数据项的访问时间。当缓存空间不足时,LFU-A 算法会淘汰访问频率低且访问时间最久 的数据项。
  • LFU-D:LFU-D 算法使用衰减计数器 来记录数据项的访问频率。衰减计数器会随着时间的推移而递减,这样可以保证最近访问过的数据项具有更高的计数器值。

总结

LFU 算法是一种常用的缓存淘汰算法,具有简单易行、公平性等优点。但是,LFU 算法也存在不准确、空间复杂度高等缺点。在实际应用中,可以根据具体的应用场景选择合适的缓存淘汰算法。

LRU 缓存淘汰算法

LRU 是 Least Recently Used 的缩写,即 最近最少使用 缓存淘汰算法。LRU算法根据数据项在缓存中的最近访问时间来决定淘汰哪些数据项。最近访问过 的数据项被认为是更重要的,最久未访问 的数据项被认为是更不重要的。

LRU算法的具体工作原理如下:

  1. 缓存 中的数据项使用 链表 进行存储。
  2. 当数据项被访问 时,将其移动到链表头部。
  3. 当缓存空间不足 时,LRU算法会淘汰链表尾部的数据项。

在这里插入图片描述

LRU算法的优点如下:

  • 简单易行:LRU算法的实现比较简单,易于理解和维护。
  • 有效性:LRU算法可以保证最近访问过的数据项不会被淘汰,可以有效地提高缓存命中率。

LRU算法的缺点如下:

  • 不公平性:LRU算法只考虑数据项的访问时间,而不考虑数据项的访问频率。因此,LRU算法可能会淘汰经常使用的数据项,导致缓存命中率下降。
  • 空间复杂度:LRU算法需要维护一个链表,这会增加缓存的空间复杂度。

LRU算法的应用场景

LRU算法常用于对缓存命中率要求高 的场景,例如:

  • CPU缓存:CPU缓存中存储的是 CPU 即将要访问的数据。这些数据的访问频率是随机的,因此使用 LRU 算法可以有效地提高 CPU 的性能。
  • 内存缓存:内存缓存中存储的是经常访问的数据。这些数据的访问频率可能会随着时间的推移而变化,因此使用 LRU 算法可以保证经常使用的数据项不会被淘汰。

LRU算法的改进

为了克服 LRU 算法的缺点,人们提出了改进的 LRU 算法,例如:

  • LFU-LRU:LFU-LRU 算法结合了 LFU 算法和 LRU 算法的优点。它不仅考虑数据项的访问频率,还考虑数据项的访问时间。当缓存空间不足时,LFU-LRU 算法会淘汰访问频率低且访问时间最久 的数据项。
  • 2Q:2Q 算法使用两个队列来维护缓存中的数据项。一个是 访问队列,另一个是 淘汰队列。当数据项被访问时,将其加入访问队列。当缓存空间不足时,2Q 算法会淘汰淘汰队列中的数据项。

总结

LRU 算法是一种常用的缓存淘汰算法,具有简单易行、有效性等优点。但是,LRU 算法也存在不公平性、空间复杂度高等缺点。在实际应用中,可以根据具体的应用场景选择合适的缓存淘汰算法。
以下是一些关于 LRU 算法的额外信息:

  • LRU 算法可以用链表或哈希表来实现。
  • LRU 算法可以与其他缓存淘汰算法结合使用,例如 LFU 算法。
  • LRU 算法是一种近似算法,无法保证最优的缓存命中率。
    希望以上信息对您有所帮助。

TinyLFU 缓存淘汰算法

TinyLFU 是一种基于频率的缓存淘汰算法,由 Redis 团队在 2018 年提出。TinyLFU 算法旨在在降低空间复杂度的情况下,提供与 LFU 算法相近的缓存命中率。

TinyLFU 算法的工作原理:

  • TinyLFU 算法使用一个 bitmap 来记录每个数据项的访问频率。bitmap 中的每个 bit 代表一个数据项,bit 的值为 1 表示该数据项在最近一个时间窗口内被访问过,bit 的值为 0 表示该数据项没有被访问过。
  • 当数据项被访问 时,TinyLFU 算法会将该数据项对应的 bit 设置为 1。
  • 当缓存空间不足 时,TinyLFU 算法会淘汰 bitmap 中 bit 值为 0 的数据项。

在这里插入图片描述

TinyLFU 算法的优点:

  • 空间复杂度低:TinyLFU 算法只需要使用一个 bitmap 来记录数据项的访问频率,因此空间复杂度较低。
  • 性能优良:TinyLFU 算法可以提供与 LFU 算法相近的缓存命中率。

TinyLFU 算法的缺点:

  • 不精确:TinyLFU 算法只考虑数据项的访问频率,而不考虑数据项的访问时间。因此,TinyLFU 算法可能会淘汰最近访问过的数据项,导致缓存命中率下降。
  • 时间窗口大小敏感:TinyLFU 算法的性能依赖于时间窗口的大小。如果时间窗口大小设置过小,TinyLFU 算法可能会频繁淘汰最近访问过的数据项,导致缓存命中率下降。

TinyLFU 算法的应用场景:

TinyLFU 算法常用于对空间复杂度要求较高 的场景,例如:

  • 嵌入式系统:嵌入式系统的资源有限,因此需要使用空间复杂度较低的缓存淘汰算法。
  • 移动设备:移动设备的存储空间有限,因此需要使用空间复杂度较低的缓存淘汰算法。

TinyLFU 算法的改进:

为了克服 TinyLFU 算法的缺点,人们提出了改进的 TinyLFU 算法,例如:

  • TinyLFU-A:TinyLFU-A 算法不仅考虑数据项的访问频率,还考虑数据项的访问时间。当缓存空间不足时,TinyLFU-A 算法会淘汰 访问频率低且访问时间最久 的数据项。
  • W-TinyLFU:W-TinyLFU 算法使用加权计数器来记录数据项的访问频率。加权计数器的值会随着时间的推移而衰减,这样可以保证最近访问过的数据项具有更高的计数器值。

总结:

TinyLFU 是一种空间复杂度低、性能优良 的缓存淘汰算法。但是,TinyLFU 算法也存在不精确、时间窗口大小敏感等缺点。在实际应用中,可以根据具体的应用场景选择合适的缓存淘汰算法。
以下是一些关于 TinyLFU 算法的额外信息:

  • TinyLFU 算法可以用 bitmap 或 cuckoo hash table 来实现。
  • TinyLFU 算法可以与其他缓存淘汰算法结合使用,例如 LRU 算法。
  • TinyLFU 算法是一种近似算法,无法保证最优的缓存命中率。
    希望以上信息对您有所帮助。

W-TinyLFU 缓存淘汰算法

W-TinyLFU 是一种基于频率和时间窗口的缓存淘汰算法,由 Caffeine 缓存框架在 2019 年提出。W-TinyLFU 算法旨在在降低空间复杂度的情况下,提供与 LFU 算法相近的缓存命中率,并克服 TinyLFU 算法对时间窗口大小敏感的缺点。

W-TinyLFU 算法的工作原理:

  • W-TinyLFU 算法将缓存划分为 两个区域:Window Cache 和 Main Cache。
  • Window Cache 是一个 LRU 缓存,用于存储最近访问过的数据项。
  • Main Cache 是一个 SLRU 缓存,用于存储访问频率较高的数据项。
  • 当数据项被访问 时,W-TinyLFU 算法会将其加入 Window Cache。
  • 当 Window Cache 空间不足 时,W-TinyLFU 算法会淘汰 LRU 缓存中的数据项。
  • 当 Main Cache 空间不足 时,W-TinyLFU 算法会淘汰 访问频率低于阈值的 SLRU 缓存中的数据项。
    在这里插入图片描述

W-TinyLFU 算法的实现原理:

  • Window Cache 使用 链表 来实现。
  • Main Cache 使用 哈希表 和 链表 来实现。
  • 每个数据项 都包含一个 计数器,用于记录该数据项的访问频率。
  • 计数器 的值会随着时间的推移而 衰减。
  • 当数据项被访问 时,其 计数器 值会 加 1。
  • 当 Window Cache 空间不足 时,W-TinyLFU 算法会淘汰 链表尾部的数据项。
  • 当 Main Cache 空间不足 时,W-TinyLFU 算法会淘汰 计数器值低于阈值的哈希表中的数据项。

W-TinyLFU 算法的优点:

  • 空间复杂度低:W-TinyLFU 算法只需要使用一个 bitmap 和一个计数器来记录数据项的访问频率,因此空间复杂度较低。
  • 性能优良:W-TinyLFU 算法可以提供与 LFU 算法相近的缓存命中率。
  • 时间窗口大小不敏感:W-TinyLFU 算法的性能不依赖于时间窗口的大小。
    W-TinyLFU 算法的缺点:
  • 实现复杂度较高:W-TinyLFU 算法的实现复杂度比 LRU 算法和 TinyLFU 算法要高。

W-TinyLFU 算法的应用场景:

W-TinyLFU 算法常用于对空间复杂度和缓存命中率要求都较高 的场景,例如:

  • Web 缓存:Web 缓存中存储的通常是静态数据,例如图片、CSS 和 JavaScript 文件。这些数据的访问频率通常是固定的,因此使用 W-TinyLFU 算法可以有效地提高缓存空间的利用率和缓存命中率。
  • 数据库缓存:数据库缓存中存储的通常是经常访问的数据。这些数据的访问频率可能会随着时间的推移而变化,因此使用 W-TinyLFU 算法可以保证经常使用的数据项不会被淘汰,并提高缓存命中率。

总结:

W-TinyLFU 是一种空间复杂度低、性能优良、时间窗口大小不敏感 的缓存淘汰算法。但是,W-TinyLFU 算法的实现复杂度较高。在实际应用中,可以根据具体的应用场景选择合适的缓存淘汰算法。

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

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

相关文章

c# 查询dataset数据集

1、读取xml,见上一个博客 2、加载到dataset中,按照条件进行dataset数据集查询后返回满足条件结果 public static string GetStrByID(string ID) { string str string.Empty; DataSet ds FromXmlFileToDataSet(); Dat…

HarmonyOS4开发 数据持久化-用户首选项 封装

import preferences from ohos.data.preferences;class PreferencesUtil {prefMap: Map<string, preferences.Preferences> new Map()async loadPreference(context, name: string) {try { //加载preferencesconst pref await preferences.getPreferences(context, nam…

Kali Linux 2024.1

Kali Linux 2024.1刚刚发布&#xff0c;标志着这个备受欢迎的安全重点Linux发行版在今年的首次重大更新。以其先进的渗透测试和安全审计功能而闻名&#xff0c;它是安全专业人员和爱好者的首选工具。 Kali 2024.1 亮点 本次发布由 Linux 内核 6.6 提供支持&#xff0c;突出了…

C语言qsort函数介绍

前言 学到了函数指针&#xff0c;那这篇博客我们可以根据函数指针&#xff0c;了解一个函数qsort的应用与模拟实现 欢迎关注个人主页&#xff1a;小张同学zkf 若有疑问 评论区见 目录 1.回调函数 2.qsort函数使用 3.qsort模拟实现 1.回调函数 讲这个东西之前我们来认识一下…

mq基础类设计

消息队列就是把阻塞队列这样的数据结构单独提取成一个程序独立进行部署。——>实现生产者消费者模型。 但是阻塞队列是在一个进程内部进行的&#xff1b; 消息队列是在进程与进程之间进行实现的&#xff0c; 解耦合&#xff1a;就是在分布式系统中&#xff0c;A服务器调用B…

Tomcat -2

① 单机反向代理 7-2 代理服务器 7-5 tomcat 设置 7-3 测试&#xff1a; 代理服务器那里写什么就显示什么 ② 多机反向代理 实现动静分离和负载均衡 7-2 nginx 7-3 7-5 测试&#xff1a; 看静态&#xff1a; 看动态&#xff1a; ③ 反向代理多机多级 7-2 7-1 和 7-4 7-3…

LeetCode45:搜索插入位置

问题描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 示例…

【STM32】STM32学习笔记-读写内部FLASH 读取芯片ID(49)

00. 目录 文章目录 00. 目录01. FLASH概述02. 读写内部FLASH接线图03. 读写内部FLASH相关API04. 读写内部FLASH程序示例05. 读写芯片ID接线图06. 读写芯片ID程序示例07. 程序示例下载08. 附录 01. FLASH概述 STM32F10xxx内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(…

华为OD机试 - 数字排列 - 深度优先搜索dfs算法(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

前端:js实现页面跳转

一、使用 window.location 对象来实现页面跳转 // 在当前页面打开新的 URL window.location.href https://www.example.com;// 或者使用下面的方法 window.location.assign(https://www.example.com); 二、在当前页面的历史记录中创建一个新的条目&#xff08;允许用户通过浏…

外部存储器接口(EMIF)

外部存储器接口&#xff08;EMIF&#xff09; 该设备支持双核架构&#xff1b;为了为每个CPU子系统提供一个专用的EMIF&#xff0c;该设备支持两个EMIF模块——EMIF1和EMIF2。两个模块完全相同&#xff0c;具有相同的功能集&#xff0c;但具有不同的地址/数据大小。EMIF1在CPU…

Unity 角色控制(初版)

角色控制器组件&#xff0c;当然是将组件放在角色上了。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// 获取角色控制器private CharacterController player;void Start(){// 加载角色控制器player …

Qt应用软件【测试篇】Dr.Memory动态测试内存

文章目录 Dr.Memeory 简介特点下载地址windows安装及使用Dr. Memory在Linux或Mac OSX在Windows上安装Dr. MemoryDr. Memory和MinGWDr. Memory和Visual Studio使用Visual Studio编译没有Visual Studio集成开发环境(IDE)命令测试结果更多内容

机器学习 | 模型性能评估

目录 一. 回归模型的性能评估1. 平均平方误差(MSE)2. 平均绝对误差(MAE)3. R 2 R^{2} R2 值3.1 R 2 R^{2} R2优点 二. 分类模型的性能评估1. 准确率&#xff08;Accuracy&#xff09;2. 召回率&#xff08;Recall&#xff09;3. 精确率&#xff08;Precision&#xff09;4. …

大模型学习笔记五:RAG

文章目录 一、RAG介绍1)局限性2)通过检索增强生成二、RAG系统的基本搭建流程1)搭建流程简介2)文档的加载和切割3)检索引擎4)LLM接口封装5)prompt模板6)RAG Pipeline初探7)关键字检索局限性三、向量检索1)文本向量2)向量相似度计算3)向量数据库4)基于向量检索的RAG…

电源完整性设计的重要三步!

电源模块布局布线 电源模块是电子设备的能量来源&#xff0c;其性能与布局直接影响到整个系统的稳定性和效率。正确的布局和走线不仅能减少噪声干扰&#xff0c;还能确保电流的顺畅流通&#xff0c;从而提高整体性能。 1、电源模块布局 ● 源头处理&#xff1a;电源模块作为…

Java 面试题

Java 基础 以下代码执行结果&#xff1f; 示例1&#xff1a; public static void main(String[] args) {int a 0;Integer b 0;String c "0";String d new String("0");change(a, b, c, d);System.out.println(a "|" b "|" …

网络支付个人信息安全的挑战与保护策略

随着互联网的飞速发展和大数据时代的来临&#xff0c;网络支付已逐渐成为人们日常生活中不可或缺的一部分。从线上购物到线下扫码&#xff0c;从水电煤缴费到交通出行&#xff0c;网络支付已经渗透到生活的方方面面。然而&#xff0c;在享受便捷的同时&#xff0c;网络支付个人…

glibc

交叉编译器的glibc库位置&#xff1a; 用此交叉编译器编译的根文件系统对应的开发板上的GLIBC版本&#xff1a; 证明buildroot会使用交叉编译器自带的glibc库来对根文件系统进行编译。

网安笔记(一)

一、渗透测试的流程 1.明确目标&#xff1a; 确定需要渗透资产的范围&#xff1b;确定规则&#xff0c;怎么去渗透&#xff1b;确定需求&#xff1a;需要达到什么样的效果 2.信息收集&#xff1a; 首先可以用社会工程学的方法来收集信息&#xff0c;看看有没有好的薄弱点。然…