Redis 内存淘汰策略有哪些?过期数据如何删除?

Redis 在面试中出现的概率非常大,毕竟后端项目如果用到分布式缓存的话,一般用的都是 Redis。目前,还没有出现一个能够取代 Redis 的分布式缓存解决方案。

这篇文章中,我会分享几道 Redis 内存管理相关的问题,都很常见。不论是面试还是项目中用到 Redis,都能有帮助。

下面几篇是之前分享的 Redis 相关的文章,没看过的朋友可以抽空看看:

  • 这 7 道 Redis 基础问题,很常见!!

  • 如何发现 Redis 热 Key,有哪些解决方案?

  • Redis 大 key 有什么危害?如何排查和处理?

  • Redis 除了缓存还能做什么?可以做消息队列吗?

  • 本地缓存和分布式缓存有什么区别?如何选择?

  • 宕机了,Redis 如何避免数据丢失?

  • Redis 如何使用批量操作提高效率?

Redis 给缓存数据设置过期时间有啥用?

一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢?

因为内存是有限的,如果缓存中的所有数据都是一直保存的话,分分钟直接 Out of memory。

Redis 自带了给缓存数据设置过期时间的功能,比如:

127.0.0.1:6379> expire key 60 # 数据在 60s 后过期
(integer) 1
127.0.0.1:6379> setex key 60 value # 数据在 60s 后过期 (setex:[set] + [ex]pire)
OK
127.0.0.1:6379> ttl key # 查看数据还有多久过期
(integer) 56

注意:Redis 中除了字符串类型有自己独有设置过期时间的命令 setex 外,其他方法都需要依靠 expire 命令来设置过期时间 。另外, persist 命令可以移除一个键的过期时间。

过期时间除了有助于缓解内存的消耗,还有什么其他用么?

很多时候,我们的业务场景就是需要某个数据只在某一时间段内存在,比如我们的短信验证码可能只在 1 分钟内有效,用户登录的 Token 可能只在 1 天内有效。

如果使用传统的数据库来处理的话,一般都是自己判断过期,这样更麻烦并且性能要差很多。

Redis 是如何判断数据是否过期的呢?

Redis 通过一个叫做过期字典(可以看作是 hash 表)来保存数据过期的时间。过期字典的键指向 Redis 数据库中的某个 key(键),过期字典的值是一个 long long 类型的整数,这个整数保存了 key 所指向的数据库键的过期时间(毫秒精度的 UNIX 时间戳)。

图片

redis过期字典

过期字典是存储在 redisDb 这个结构里的:

typedef struct redisDb {...dict *dict;     //数据库键空间,保存着数据库中所有键值对dict *expires   // 过期字典,保存着键的过期时间...
} redisDb;

过期的数据的删除策略了解么?

如果假设你设置了一批 key 只能存活 1 分钟,那么 1 分钟后,Redis 是怎么对这批 key 进行删除的呢?

常用的过期数据的删除策略就两个(重要!自己造缓存轮子的时候需要格外考虑的东西):

  1. 惰性删除:只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。

  2. 定期删除:每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。

定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是 定期删除+惰性/懒汉式删除 。

但是,仅仅通过给 key 设置过期时间还是有问题的。因为还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。这样就导致大量过期 key 堆积在内存里,然后就 Out of memory 了。

怎么解决这个问题呢?答案就是:Redis 内存淘汰机制。

Redis 内存淘汰机制了解么?

相关问题:MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?

Redis 提供 6 种数据淘汰策略:

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。

  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。

  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。

  4. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。

  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。

  6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!

4.0 版本后增加以下两种:

  1. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰。

  2. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key。

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

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

相关文章

Redis的过期策略

Redis 支持的过期策略主要有以下几种: 定时过期(Timed Expiration) 这种策略会在设置键的过期时间时,创建一个定时器,当达到指定的过期时间点时,立即执行删除操作。这种方式可以精确控制键的生命周期,但是如果有大量的…

uniapp引入第三方字体库如(宋体、喜鹊燕书体、字小魂歌以晓手迹行楷体等) 最优解决方案

最近在开发一个写对联的小程序,其中要求对联文字以不同字体呈现,比如(宋体、喜鹊燕书体、字小魂歌以晓手迹行楷体等),如图: 一般UI设计给的都是这种.tff格式的字体文件,如图: 那么…

猫咪主食冻干真的对猫好吗?最热门的三款主食冻干对比测评

随着对猫咪主食健康和营养问题的关注度提高,越来越多的铲屎官开始重视科学养猫。 主食冻干因其模拟猫咪原始捕猎猎物模型配比、低温加工的特点,被认为是最符合猫咪饮食天性的选择。 相比传统的膨化猫粮,主食冻干中的淀粉和碳水化合物添加较…

如何删除mysql-bin

“删除mysql-bin”,用于记录一下后面还会用到. 删除mysql-bin的方法: 1、通过“mysql> reset master;reset slave;”命令删除“mysql-bin”文件;2、删除“my.cnf”中的“log-binmysql-bin”一行即可。 默认情况下mysql会一直保留mysql-bin文件&…

QT基础篇(2)QT5模板库,工具类及控件

1.字符串类 QT中的字符串类包括以下几种: QString类:是Qt中最常用的字符串类,用来存储Unicode字符。它支持各种字符串操作,例如连接、替换、截取等。 QByteArray类:用来存储字节序列,适用于处理非Unicode…

计算机网络 物理层

文章目录 物理层物理层的基本概念数据通信的基础知识数据通信系统的模型有关信道的几个基本概念信道的极限容量 物理层下面的传输媒体导引型传输媒体非引导型传输媒体 信道复用技术波分复用码的复用 宽带接入技术ADSL 技术光纤同轴混合网 (HFC 网)FTTx 技术 物理层 …

爬虫01-爬虫原理以及爬虫前期准备工作

文章目录 1 爬虫基本原理什么是爬虫爬虫功能详解爬虫基本流程两个概念:request和response 2 一些问题爬虫能抓取什么样的数据?抓取的数据怎么提取部分内容?数据解析方式。为什么我爬虫抓取的数据和浏览器看到的不一样怎样解决JavaScript渲染的…

阿里云弹性计算技术公开课-ECS 安全季 全新上线!

云布道师 如何保障云上业务的应用安全和数据安全,是每一个上云的企业和用户关注的重点。云上安全建设是一个体系化工程,需要用户主动进行多方面的考虑和实施,包括制定完善的安全策略和规范,如身份认证、访问控制、漏洞管理、安全…

超实用的公众号内容制作流程,小白也能轻松学会

公众号是以内容为王的平台,保持优质原创内容发布可以给公众号带来源源不断的流量,稳定输出内容,会获得平台的流量扶持。 很多小伙伴运营公众号都没有什么阅读量,一方面是公众号内容同质化越来越严重,另外一方面是公众…

编程笔记 html5cssjs 030 HTML音频

编程笔记 html5&css&js 030 HTML音频 一、<audio>元素二、属性三、事件三、使用 CSS 设置样式练习小结 有时候网页上也需要嵌入音频。比如播放歌曲或老师讲课的音频等。 一、<audio>元素 <audio> HTML 元素用于在文档中嵌入音频内容。<audio>…

寒假刷题第四天

PTA甲级 1017 Queueing at Bank 可以使用小顶堆模拟窗口的情况&#xff0c;一定是最小的时间的窗口先空出来 #include<iostream> #include<algorithm> #include<queue> #include<vector>using namespace std;struct people {int time;int process; …

完全卸载grafana

查看要卸载的包的名字 yum list installed yum remove grafana-enterprise.x86_64 成功

【tensorflowflutterweb】机器学习模型怎样用到前端上(未写完)

书接上回 在上一章 我们谈了怎么根据项目需求构建一个简单的机器学习模型。 ​​​​​​ ​​​​​​【tensorflow&flutter】自己写个机器学习模型用在项目上&#xff1f;-CSDN博客文章浏览阅读852次&#xff0c;点赞22次&#xff0c;收藏15次。【tensorflow&flutter…

【2023 - 探索】博0到博1,游戏新地图的探索日志

【2023 - 探索】博0到博1&#xff0c;游戏新地图的探索日志 写在最前面CSDN探索日志2023的探险 探索日志年终回顾探索 冒险回顾实习6月开始跟着老师做科研年中的一些其他事情9月开始上课开学后11月&#xff0c;读者互动 新年展望新年祝福 写在最前面 2023&#xff0c;我解锁了新…

C语言——结构体类型(二)【结构体内存对齐,结构体数组】

&#x1f4dd;前言&#xff1a; 上一讲结构体类型&#xff08;一&#xff09;中&#xff0c;我们讲述了有关结构体定义&#xff0c;创建&#xff0c;初始化和引用的内容&#xff0c;这一讲&#xff0c;我们进一步学习结构体的相关知识&#xff1a; 1&#xff0c;结构体内存对齐…

腾讯云2024年优惠券领取入口汇总

腾讯云是国内知名的云计算服务提供商&#xff0c;提供了包括云服务器、云数据库、云存储、人工智能等全方位的云服务。为了吸引更多的用户&#xff0c;腾讯云经常会推出各种优惠券&#xff0c;让用户在购买云服务时能够享受到更多的优惠&#xff0c;下面给大家整理汇总最新腾讯…

独享静态代理IP在海外市场调研中的独特优势

独享静态代理IP在海外市场调研中扮演着至关重要的角色&#xff0c;提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要&#xff0c;它保证了连接的持续性和数据的准确性。通过这些方面的综合优势&#xff0c;独享静态代理IP成为海外市场调…

【华为OD机试真题2023CD卷 JAVAJS】矩阵匹配

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 矩阵匹配 知识点二分查找DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 从一个N*M(N<=M)的矩阵中选出N个数,任意两个数字不能在同一行或同一列,求选出来的N个数中第K大的数字的最小值是多少。…

每日一看大模型新闻(2023.11.20)

1.产品发布 1.1长虹&#xff1a;首个基于大模型的智慧家电AI平台 发布日期&#xff1a;2023.11.20 全球首个基于大模型智慧家电AI平台长虹云帆震撼发布&#xff01; 主要内容&#xff1a;长虹智慧AI平台发布会上&#xff0c;发布了全球首个基于大模型的智慧家电AI平台——长…

靜態住宅IP代理詳解(ISP代理)

IP地址如同我們的網路身份證&#xff0c;是我們在互聯網世界中的標識。而在這個廣闊的網路世界中&#xff0c;有一種特殊的IP地址——靜態住宅IP&#xff0c;它就像我們的網路“定居地”。 靜態住宅IP是什麼&#xff1f; 靜態住宅IP&#xff0c;顧名思義&#xff0c;是一種固定…