【Redis】Redis 缓存应用、淘汰机制—(四)

news2024/9/21 2:35:21

目录

    • 一、缓存应用
    • 二、淘汰机制
    • 三、LRU 算法
    • 四、LFU 算法

在这里插入图片描述
在这里插入图片描述

一、缓存应用

一个系统中不同层面数据访问速度不一样,以计算机为例,CPU、内存和磁盘这三层的访问速度从几十 ns 到 100ns,再到几 ms,性能的差异很大,如果每次 CPU 处理数据时都要到磁盘读取数据,系统运行速度会大大降低。
所以,计算机系统中,默认有两种缓存:

  • (1)CPU 里面的末级缓存,即 LLC,用来缓存内存中的数据,避免每次从内存中存取数据。
  • (2)内存中的高速页缓存,即 page cache,用来缓存磁盘中的数据,避免每次从磁盘中存取数据。
    在这里插入图片描述

在一个层次化的系统中,缓存一定是一个快速子系统,数据存在缓存中时,能避免每次从慢速子系统中存取数据。对应到互联网应用来说,Redis 就是快速子系统,而数据库就是慢速子系统了。

Redis 是一个独立的系统软件,如果应用程序想使用 Redis 缓存,就需要增加相应的代码。所以,我们也把 Redis 称为旁路缓存,也就是说,读取缓存、读取数据库和更新缓存的操作都需要在应用程序中来完成。

Redis 缓存按照是否接受写请求,分为只读缓存和读写缓存两种类型,只读缓存能加速读请求,而读写缓存可以同时加速读写请求。读写缓存又分为同步直写和异步写回,可以根据业务需求在保证性能和保证数据可靠性之间进行选择。

二、淘汰机制

缓存的容量终究是有限的,需要按一定规则淘汰出去,为新来的数据腾出空间,提高缓存命中率,提升应用的访问性能。缓存容量的规划通常是需要结合应用数据实际访问特征和成本开销来综合考虑的,建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。设置容量命令(如4gb):CONFIG SET maxmemory 4gb

8种淘汰策略:noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random、allkeys-lfu
大体分为两类,noeviction(不淘汰数据),缓存被写满了,再有写请求时 Redis 不再提供服务,直接返回错误。另外7种是一类,按照一定范围对缓存数据进行淘汰,对设置过期时间的数据进行淘汰,和对所有数据进行淘汰。分类如图:
在这里插入图片描述

具体策略如下:

  • (1)volatile-ttl: 根据过期时间的先后进行删除,越早过期的越先被删除。
  • (2)volatile-rando: 在设置了过期时间的键值对中,进行随机删除。
  • (3)volatile-lru: 使用 LRU 算法筛选设置了过期时间的键值对。
  • (4)volatile-lfu: 使用 LFU 算法选择设置了过期时间的键值对。
  • (5)allkeys-random:从所有键值对中随机选择并删除数据。
  • (6)allkeys-lru: 使用 LRU 算法在所有数据中进行筛选。
  • (7)allkeys-lfu: 使用 LFU 算法在所有数据中进行筛选。

三、LRU 算法

LRU 算法全称 Least Recently Used,按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。

LRU 会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据。

举个栗子:数据 20 和 3 被访问后,它们在链表中的位置移动到了 MRU 端,LRU 算法选择删除数据时,都是从 LRU 端开始,所以当新数据15被写入时,LRU 端的数据5被删除。
在这里插入图片描述
LRU 算法在实际实现时,需要用链表管理所有的缓存数据,这会带来额外的空间开销。而且,当有数据被访问时,需要在链表上把该数据移动到 MRU 端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。

所以,在 Redis 中,LRU 算法被做了简化,以减轻数据淘汰对缓存性能的影响,具体实现原理是 Redis 默认会记录每个数据的最近一次访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录),在需要选择淘汰的数据时,Redis首先会随机选择N个数据将它们作为一个候选集合,然后比较他们的lru字段,将lru字段最小的数据淘汰掉。

N 可以通过命令设置:

CONFIG SET maxmemory-samples 100

当再次淘汰时,Redis会再挑选一些lru字段比候选集合中最小lru字段还要小的键值对,将它们放入候选集,如果候选集的数据的个数达到了 maxmemory-sample 配置的个数,Redis就开始将lru字段值最小的数据淘汰

四、LFU 算法

与 LRU 策略相比,LFU 策略中会从两个维度来筛选并淘汰数据:一是,数据访问的时效性(访问时间离当前时间的远近);二是,数据的被访问次数。就是在 LRU 策略基础上,为每个数据增加了一个计数器,来统计访问次数。淘汰数据时,首先会根据数据的访问次数进行筛选,把访问次数最低的数据淘汰出缓存。如果两个数据的访问次数相同,再比较这两个数据的访问时效性,把距离上一次访问时间更久的数据淘汰出缓存。

具体实现是把原来 24bit 大小的 lru 字段,又进一步拆分成了两部分:ldt 值(lru 字段的前 16bit,表示数据的访问时间戳)、counter 值(lru 字段的后 8bit,表示数据的访问次数)。但是 counter 只有 8bit,记录的最大值是 255,显然不能因对数据成千上万次的访问。实际 LFU 策略实现时,数据访问并不是简单的 counter 值加 1 的计数规则,而是采用了一个更优化的计数规则。

每当数据被访问一次时,首先,用计数器当前的值乘以配置项 lfu_log_factor 再加

  • 1,再取其倒数,得到一个 p 值;然后,把这个 p 值和一个取值范围在(0,1)间的随机数 r 值比大小,只有 p 值大于 r
    值时,计数器才加 1,通过设置不同的 lfu_log_factor 配置项,来控制计数器值增加的速度。以下是计算方式部分代码

(baseval当前值)和 lfu_log_factor 设置不同值的变化情况:

double r = (double)rand()/RAND_MAX;
...
double p = 1.0/(baseval*server.lfu_log_factor+1);
if (r < p) counter++;   

在这里插入图片描述

正是因为使用了非线性递增的计数器方法,即使缓存数据的访问次数成千上万,LFU 策略也可以有效地区分不同的访问次数,从而进行合理的数据筛选。从刚才的表中,我们可以看到,当 lfu_log_factor 取值为 10 时,百、千、十万级别的访问次数对应的 counter 值已经有明显的区分了,所以,我们在应用 LFU 策略时,一般可以将 lfu_log_factor 取值为 10。

有些数据在短时间内被大量访问后就不会再被访问了,按访问次数筛选时,这些数据会被留存在缓存中,但不会提升缓存命中率。为此,Redis 在实现 LFU 策略时,还设计了一个 counter 值的衰减机制。通过配置衰减因子 lfu_decay_time 来控制访问次数的衰减。

具体操作是计算当前时间和数据最近一次访问时间的差值,换算成分钟单位,再除以 lfu_decay_time 值,就是数据 counter 要衰减的值。lfu_decay_time 值越大,相应的衰减值会变小,衰减效果也会减弱。所以,如果业务应用中有短时高频访问的数据的话,建议把 lfu_decay_time 值设置为 1,它们不再被访问后,会较快地衰减它们的访问次数,尽早把它们从缓存中淘汰出去,避免缓存污染。

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

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

相关文章

【视频讲解】主成分分析原理与水果成熟数据实例:Python中PCA-LDA 与卷积神经网络CNN...

全文链接&#xff1a;https://tecdat.cn/?p37450 分析师&#xff1a;Shixian Ding 主成分分析&#xff08;PCA&#xff09;作为数据科学中用于可视化和降维的重要工具&#xff0c;在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本 1000 页的书&#xff0…

jpg免费转换成pdf?jpg和pdf谁更好?图片转pdf的优势总结!

jpg免费转换成pdf&#xff1f;jpg和pdf谁更好&#xff1f;我们经常需要将JPG图片转换为PDF文档。无论是个人照片管理、证件扫描&#xff0c;还是商业和行政领域的文档整理、合同协议、电子邮件附件&#xff0c;以及教育领域的课件制作和论文报告&#xff0c;都可以通过JPG到PDF…

JVM - 1.类加载子系统

1.类加载子系统 1.作用 1.负责从文件系统或网络中加载字节码(.class)文件&#xff0c;即将物理磁盘上的字节码文件加载到内存中&#xff0c;生成供程序使用的类对象 2.字节码文件要求在文件开头有特定的文件标识(CA FE BA BE)3.类加载器(ClassLoader)只负责字节码文件的加载&am…

VS项目写完执行exe隐藏调试用的黑窗口(控制台)

在vs创建完项目&#xff0c;我们只希望运行显示界面&#xff0c;不显示控制台&#xff0c;控制台就是这样的黑色窗口&#xff0c;他可以在我们调试的时候打印一些东西来判断辅助编程。 1、首先修改为窗口模式 2、在你的main文件里最上面加入一行代码&#xff1a; #pragma comme…

android打印编码转换-SAAS本地化及未来之窗行业应用跨平台架构

一、打印转码 1.图片转打印 2.文字转打印 二、代码 package CyberWinPHP.Cyber_Plus;import java.util.Hashtable;import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.WriterException; import com.google.zxing.co…

【文档合集】软件类常用文档整理大全,软件工程,软件项目管理,技术标书方案,模

目的&#xff1a;规范系统开发流程&#xff0c;提高系统开发效率。 立项申请需求分析方案设计方案评审开发调整测试阶段系统培训试运行测试验收投入使用 所有文档过去进主页获取。 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作…

一款免费轻量的CAD看图软件

这款免费CAD看图软件&#xff0c;旨在为用户提供快速查看和处理CAD图纸的能力。该软件以其轻量化、功能全面、操作简便等特点受到用户的欢迎。支持多种CAD文件的快速查看&#xff0c;包括但不限于DWG、DXF等格式&#xff0c;而且不需要安装大型CAD软件即可使用。 主要特点包括…

齐护语音识别V2.1模块可自定义免编程学习唤醒词指令词自带IO实现人机对话 Arduino C编程图形化Mixly Scratch编程

齐护离线语音识别模块可免编程自定义学习唤醒词及识别词 固件V2.1 齐护语音识别V2.1模块可自定义免编程学习唤醒词指令词自带IO实现人机对话 Arduino C编程图形化Mixly Scratch编程 此固件&#xff08;程序/功能&#xff09;为自学习V2.1版本&#xff0c;在基础版本的上去除【变…

HashMap-leetcode总结

为什么用Hashmap? 将两种属性&#xff08;key,value&#xff09;具有某种联系&#xff0c;需要保存下来 随时读取是否存在且通过一方获取它对应值 数据结构 一数值value经过hashcode()计算出key&#xff0c;key对应数组位置建立链表 HashMap常用方法 1、HashMap的初始化 Hash…

4820道西医综合真题西医真题ACCESS\EXCEL数据库

本题库内容源自某出版物《西医综合真题考点还原与答案解析》&#xff0c;包含4千多道真题。这个数据库包含3个表&#xff0c;一个是分类表&#xff08;SECTION_BEAN&#xff09;&#xff0c;一个是题库主表&#xff08;QUESTION_INFO_BEAN&#xff09;&#xff0c;一个是选项表…

新版本 | GreatSQL 8.0.32-26全新发布 增强“四高”诸多新特性

近日&#xff0c;GreatSQL开源数据库社区正式发布 GreatSQL 8.0.32-26新版本&#xff0c;在高可用、高性能、高兼容、高安全等诸多方面进行了特性增强&#xff0c;修复多个缺陷&#xff0c;并详细说明了多个典型应用场景下&#xff0c;升级/降级到GreatSQL 8.0.32-26的操作策略…

从心理学的角度,探究一下人类为什么爱玩游戏。(缓解压力、社交需求、 获得成就感)

文章目录 引言I 游戏中的美学和文化元素,是影响玩家心理状态的关键因素。音乐美工文化背景II 成年人对游戏的心理需求获得成就感社交需求缓解压力III 心流理论(Flow Theory)解释玩家虽受虐,但也其乐无穷的现象知识扩展: 心流知识扩展: 心流活动知识扩展:得性乐观(Learne…

Koa商城项目-公共组件封装

项目地址 koa_system: &#x1f525;&#x1f525;&#x1f525;Koa2 React商城项目前端-React Antd前端-Vue2 Element-plus后端-Koa2 Sequelizehttps://gitee.com/ah-ah-bao/koa_system 欢迎大家点击查看,方便的话点一个star~ Vue2Admin和Vue3Admin版本的后台还没有对接…

学习记录:js算法(十二):柱状图中最大的矩形

文章目录 柱状图中最大的矩形我的思路网上思路 总结 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1:上图 输入&#xff1a;…

i.MX6裸机开发(6):GPIO输入——按键查询检测

按键检测使用到GPIO外设的基本输入功能&#xff0c;GPIO外设相关的概念请参考 第四章节汇编点亮LED灯。 本章主要内容&#xff1a; i.MX 6U 在硬件上实现按键消抖 Pro开发板按键原理图和功能分析 在led_rgb_c基础上修改为button 编译代码&#xff0c;实现按键查询控制LED …

OpenAI 通过强大的结构化输出功能增强了其 API

介绍 可以通过打开/关闭 JSON 模式或使用函数调用来创建先前结构化的输出。 大型语言模型 (LLM) 与一般的对话式 UI 非常相似&#xff0c;擅长处理以自然语言呈现的非结构化数据。首先对这些非结构化输入进行组织和处理&#xff0c;然后将其重新转换为自然语言作为结构化响应。…

WIFI驱动开发

Linux 4.9 内核驱动移植 Linux 4.9 BSP 内核驱动 下载驱动后获得驱动的 tar.gz 压缩包 解压后找到如下驱动与文件夹 进入内核&#xff0c;找到 linux-4.9/drivers/net/wireless 文件夹中&#xff0c;新建文件夹aic8800 并且把上面的驱动与文件夹放入刚刚创建好的 aic8800 中。…

动漫二次元漂亮的网站导航HTML5源码

二次元漂亮网站导航HTML源码&#xff0c;页面中还调用了很多外站的图片等链接需自行更换。 动漫二次元漂亮的网站导航HTML5源码

NASA:ARM 增强短波实验(ARESE)太阳辐射数据

目录 简介 摘要 代码 网址推荐 0代码在线构建地图应用 机器学习 ARM Enhanced Shortwave Experiment (ARESE) Solar Radiation Data 简介 ARESE 研究了晴朗和多云大气对太阳辐射的吸收。 测量使用了三个飞机平台&#xff1a;一架高空载人埃格雷特飞机、一架装有仪器的双…

百度地图SDK Android版开发 8 覆盖物示例2动画

百度地图SDK Android版开发 8 覆盖物示例2动画 前言动画相关的类和接口帧动画MarkerOptions 加载动画MarkerOptionsMarkerOptions.MarkerAnimateType 动画类型 Animation动画MarkerAnimation类及其子类AnimationTransformationRotateAnimationAlphaAnimationScaleAnimationSing…