Redis中的淘汰策略

news2024/11/17 21:50:35

前言

本文主要说明在Redis面临key过期和内存不足的情况时,可以采用什么策略进行解决问题。

Redis中是如何应对过期数据的

正如我们知道的Redis是基于内存的、单线程的一个中间件,在面对过期数据的时候,Redis并不会去直接把它从内存中进行剔除,因为Redis是单线程的,如果出现了过期key就立马去删除,可能会影响到主要的业务的执行

在Redis中提供了以下两种删除过期键值的策略

惰性删除

工作原理: 惰性删除就出现过期了也不去管他,等某个请求访问到这条数据的时候,判断是否过期,过期就删除,并返回null
优点: 每次访问过期数据才会进行删除操作,占用相对较少的系统资源
缺点: 过期数据占用的空间清理不及时,导致空间利用率低,浪费内存空间

定期删除

工作原理: 每隔一段时间,检测数据库,随机删除一些过期数据
优点: 通过限制删除操作的时长和频率,来减少删除操作对主业务的影响,同时也能减轻内存空间的压力
缺点: 没有惰性删除的系统资源占用少,本身还是存在一定的空间浪费

定期删除工作流程

举个简单的例子:

  1. 定期中从设置过期时间的key字典中随机取出一定数量的key,
  2. 删除一定数量中过期key,
  3. 如果这个过期key占25%,重复1步骤

为了防止出现循环过度造成线程卡死,redis中设置了默认扫描时间25ms,流程图如下:
在这里插入图片描述

Redis的内存淘汰策略

当Redis中的内存使用超过最大使用内存数后,会使用内存淘汰策略删除 来保证redis的正常运行

  1. noeviction(不淘汰): 当内存不足以容纳新写入数据时,新写入操作会报错。
  2. allkeys-lru(最近最少使用): 从键空间中选择最近最少使用的键淘汰。
  3. allkeys-lfu(最不经常使用): 从键空间中选择最不经常使用的键淘汰。
  4. allkeys-random(随机淘汰): 从键空间中随机选择键淘汰。
  5. volatile-lru(最近最少使用): 从设置了过期时间的键中选择最近最少使用的键淘汰。
  6. volatile-lfu(最不经常使用): 从设置了过期时间的键中选择最不经常使用的键淘汰。
  7. volatile-random(随机淘汰): 从设置了过期时间的键中随机选择键淘汰。
  8. volatile-ttl(最短过期时间): 从设置了过期时间的键中选择离过期时间最近的键淘汰。

这些淘汰策略可以通过在 Redis 配置文件或在运行时通过相关命令进行配置。根据具体业务需求和数据访问模式,选取合适的淘汰策略可以提高 Redis 的性能和内存利用率。

实际是三大类,noeviction、allkey-xxx、volatile-xxx

LRU 与 LFU

LRU (Last Recently Used)

LRU 策略按照最近最少使用的原则淘汰数据。当缓存空间不足时,会优先淘汰最长时间未被访问的数据。LRU 策略维护一个访问时间顺序的队列,每次访问数据时,将数据移动到队列的末尾。当需要淘汰数据时,从队列的头部淘汰最久未被访问的数据

LFU (Last Frequently Used)

LFU 策略按照最不经常使用的原则淘汰数据。LFU 策略维护每个数据被访问的频率信息,当缓存空间不足时,会优先淘汰访问频率最低的数据。LFU 策略需要为每个数据维护一个访问频率计数器,每次访问数据时,将对应的计数器值加一。当需要淘汰数据时,选择访问频率最低的数据进行淘汰

主要区别

  1. LRU 按照最近最少使用进行淘汰,LFU按照最不经常使用进行淘汰。
  2. LRU维护一个顺序表,LFU维护一个计数器
  3. LRU关注访问顺序,LFU关注访问频率
  4. LRU假设最近被访问的可能会被再次访问,LFU假设访问次数最少的键是最不常用的
以上是本文全部内容
感谢阅读

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

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

相关文章

运用工具Postman快速导出python接口测试脚本

Postman的脚本可以导出多种语言的脚本,方便二次维护开发。 Python的requests库,支持python2和python3,用于发送http/https请求 使用unittest进行接口自动化测试 一、环境准备 1、安装python(使用python2或3都可以)…

HCIP之VLAN实验

目录 一、实验题目 二、实验思路 三、实验步骤 3.1 将接口划入vlan,设置trunk干道 3.2 启动DHCP服务,下发地址 四、测试 一、实验题目 实验要求: 1,PC1/3的接口均为access模式,且属于vlan2,处于同一…

pyltp 0.2.1安装

1. LTP及pyltp pyltp是 LTP的 Python封装,它里面提供了包括分词,词性标注,命名实体识别,句法分析等等能力。 比较坑的是我们可能无法直接通过pip install pyltp0.2.1方式来安装,所以本文就简单记录下如何通过源码安装…

04_15页表缓存(TLB)和巨型页

前言 linux里面每个物理内存(RAM)页的一般大小都是4kb(32位就是4kb),为了使管理虚拟地址数变少 加快从虚拟地址到物理地址的映射 建议配值并使用HugePage巨型页特性 cpu和mmu和页表缓存(TLB)和cache和ram的关系 CPU看到的都是虚拟地址,需要经过MMU的转化&#xf…

langchain-ChatGLM源码阅读:模型加载

文章目录 使用命令行参数初始化加载器模型实例化清空显存加载模型调用链loader.py的_load_model方法auto_factory.py的from_pretrained方法modeling_utils.py的from_pretrained方法hub.py的get_checkpoint_shard_files方法modeling_utils.py的_load_pretrained_mode方法回到loa…

电脑远程接入软件可以进行文件传输吗?快解析内网穿透

电脑远程接入软件的出现,让我们可以在两台电脑之间进行交互和操作。但是,很多人对于这些软件能否进行文件传输还存在一些疑问。下面的文章将解答这个问题。 1.电脑远程接入软件可以进行文件传输。传统上,我们可能会通过传输线或者移动存储设…

听GPT 讲Prometheus源代码--promql/promdb

Prometheus的promql目录包含PromQL(Prometheus Query Language)的解析和执行代码: parser.go 定义PromQL语法结构和parser,用于将PromQL查询语句进行语法解析。 semantic.go 实现PromQL的语义分析,检查查询是否语法正确且语义合理。 engine.go 定义PromQL执行引擎的接口和数据结…

Chapter 15: Object-Oriented Programming | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Object-oriented programmingManaging larger programsGetting startedUsing objectsStarting with programsSubdividing a problemOur first Python objectClasses as typesObject lifecycleMultiple instancesInheritanceSummaryGlossa…

AlexNet阅读笔记

ImageNet classification with deep convolutional neural networks 原文链接:https://dl.acm.org/doi/abs/10.1145/3065386 中文翻译:https://blog.csdn.net/qq_38473254/article/details/132307508 使用深度卷积神经网络进行 ImageNet 分类 摘要 大…

all in one之安装群辉和加硬盘(第五章)

安装群辉和加硬盘 安装群辉 群辉系统选择和介绍 PVE7.1虚拟机安装黑群晖教程 安装教程2 下载对应的群辉系统,根据自己的电脑性能来选择并下载: 百度网盘链接:提取码: 4itr 下载链接【私人博客】 第一步,把下载的img镜像上传到pve 记住上…

idea2023 springboot2.7.5+mybatis+jsp 初学单表增删改查

创建项目 因为2.7.14使用量较少,特更改spring-boot为2.7.5版本 配置端口号 打开Sm01Application类,右键运行启动项目,或者按照如下箭头启动 启动后,控制台提示如下信息表示成功 此刻在浏览器中输入:http://lo…

UltraEdit2023代码编辑器下载安装教程

UltraEdit是深受编程人士喜爱的代码编辑器之一,简洁干净的工作界面,标配的语法高亮功能,代码折叠等高效编程功能,并且,还支持HTML、PHP和JavaScript等语法,让代码编辑、文档内容处理更加方便。 作为一款广…

文心一言 VS 讯飞星火 VS chatgpt (78)-- 算法导论7.4 2题

二、如果用go语言,证明:在最好情况下,快速排序的运行时间为 Ω(nlgn)。 文心一言: 在最好情况下,快速排序的运行时间为Ω(nlgn)的证明如下: 快速排序是一种分治算法,它将一个数组分成两个子数…

Android webrtc实战(一)录制本地视频并播放,附带详细的基础知识讲解

目录 一、创建PeerConnectionFactory 初始化 构建对象 二、创建AudioDeviceModule AudioDeviceModule JavaAudioDeviceModule 构建对象 setAudioAttributes setAudioFormat setAudioSource 创建录制视频相关对象 创建VideoSource 创建VideoCapturer 创建VideoTra…

一台电脑访问另一台电脑的虚拟机

打开虚拟机的ip:端口映射 虚拟网络编辑器设置:端口转发 访问虚拟机的主机IP 转发端口 ssh root另一台电脑的虚拟机主机ip: 9000注意:不是虚拟机的ip

通讯录实现【C语言】

目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 前言 我们上期已经详细的介绍了自定…

docker学习(十五)docker安装MongoDB

什么是MongoDB? MongoDB 是一个开源的、面向文档的 NoSQL 数据库管理系统,它以高性能、灵活的数据存储方式而闻名。与传统的关系型数据库不同,MongoDB 采用了一种称为 BSON(Binary JSON)的二进制 JSON 格式来存储数据。它是一种非…

【AIGC 讯飞星火 | 百度AI|ChatGPT| 】智能对比

AI智能对比 🍸 前言🍺 概念类对比🍵 讯飞🍵 百度AI🍵 chatGPT 🍹 功能类对比☕ 讯飞☕ 百度AI☕ chatGPT 🥃 可输入字数对比🥤 百度AI🥤 讯飞🥤 chatGPT &…

markdown编写微信公众号文章

微信公众号文章编写,暂不支持MarkDown的使用, 推荐工具: 墨滴 全称叫做: Makedown Nice,后面会以mdNice代替使用。 通过官网的写文章,支持在线编译安装chrome浏览器插件, 支持在微信公众号编译…