面试篇-Redis-2+持久化+过期key删除+内存淘汰

文章目录

  • 前言
  • 一、你知道Redis 数据是怎么持久化的
    • 1.1 Redis 持久化的方式Rdb:
      • 1.1.1 主动备份save 命令:
      • 1.1.2 Redis 中使用bgsave 进行Rdb 的持久化 :
    • 1.2 Redis 持久化的方式Aof:
      • 1.2.1 使用AOF 模式进行数据存储:
      • 1.2.2 命令重写:
    • 1.3 RDB和ROF的对比:
    • 1.4 你来说下Redis 的数据是怎么持久化的:
  • 二、Redis 中内存淘汰:
    • 3.1 Redis 过期的key 是什么时候被删除的
      • 3.1.1 惰性删除:
      • 3.1.2 周期删除:
    • 3.2 Redis 内存满了怎么办:
      • 3.2.1 内存淘汰策略:
      • 3.2.2 内存淘汰策略应该怎么选:
    • 3.3 Redis 内存只有2G,数据有10G怎么保证Redis 中最后保留的key 都是热点key:
  • 总结


前言

本文对Redis Rdb和Aof 的持久化,及过期key 和内存淘汰进行介绍,重点对面试的问题进行介绍,祝愿每位程序员都能上岸!!!


一、你知道Redis 数据是怎么持久化的

 我们知道在使用Redis 时数据都被存在内存中,要想保证数据不丢失,Redis 内存中的数据,是怎么被持久化到磁盘的;

1.1 Redis 持久化的方式Rdb:

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据.

1.1.1 主动备份save 命令:

可以通过save 命令,复制一个进程出来进行 数据的保存,可以在redis.conf 配置bgsave命令被触发的条件
在这里插入图片描述

1.1.2 Redis 中使用bgsave 进行Rdb 的持久化 :

redis bgsave 是 Redis 数据库中的一个命令,用于在后台异步地保存当前数据库的数据到一个磁盘文件(通常称为 RDB 持久化文件)。这样做的主要目的是为了在服务器发生意外故障时,可以从该备份文件中恢复数据。

bgsave 的过程:主进程阻塞式的fork(克隆) 一个子进程,然后复制主进程下的页表,因为页表保存了虚拟地址到物理地址的映射关系,这样子进程也知道了主进程的数据;
此时内存中的数据只能运行读操作;
如果主进程此时发生了数据写,则采用copy-on-write ,将内存中的数据拷贝一份进行写操作,从而不影响之前内存的数据;

在这里插入图片描述

1.2 Redis 持久化的方式Aof:

1.2.1 使用AOF 模式进行数据存储:

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
在这里插入图片描述

Aof 默认是关闭的可以通过修改配置参数进行启用
在这里插入图片描述

1.2.2 命令重写:

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果

在这里插入图片描述

1.3 RDB和ROF的对比:

在这里插入图片描述

1.4 你来说下Redis 的数据是怎么持久化的:

在Redis中提供了两种数据持久化的方式:RDB 和AOF;RDB是一个快照文件,它是把redis内存存储的数据通过bgsave命令fork出一个进程将内存中的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。

AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据;

RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令。

二、Redis 中内存淘汰:

3.1 Redis 过期的key 是什么时候被删除的

在使用Redis 时,设置了过期时间的key,当过期后key 不会立马被删除吗,因为Redis 对待过期的key 采用的惰性删除+ 周期删除方式;

3.1.1 惰性删除:

惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。
在这里插入图片描述

  • 优点:对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查;
  • 缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

3.1.2 周期删除:

如果某个key 虽然过期了,但是一直不被访问,难道会一直占用内存吗,当然不是;Redis 还有一种定时任务的删除,来应对;

定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。定期清理有两种模式:

  • SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf 的hz 选项来调整这个次数
  • FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。
缺点:难以确定删除操作执行的时长和频率。

3.2 Redis 内存满了怎么办:

3.2.1 内存淘汰策略:

redis 的内存是有一定大小的,当内存占满了后,会发生什么?实际Redis 提供了一些内存淘汰的策略来应对这种场景;

数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。Redis支持8种不同策略来选择要删除的key:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略;
  • volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰;
  • allkeys-random:对全体key,随机进行淘汰。
  • volatile-random:对设置了TTL的key,随机进行淘汰。
  • allkeys-lru:对全体key,基于LRU算法进行淘汰
  • volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰
  • allkeys-lfu:对全体key,基于LFU算法进行淘汰
  • volatile-lfu: 对设置了TTL的key,基于LFU算法进行淘汰

LRU(Least Recently Used)最近最少使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。key1是在3s之前访问的,key2是在9s之前访问的,删除的就是key2。

LFU(Least Frequently Used)最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。key1最近5s访问了4次,key2最近5s访问了9次,删除的就是key1。

3.2.2 内存淘汰策略应该怎么选:

  • 优先使用 alkeys-lru 策略。充分利用 LRU 算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。
  • 如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用alkeys-random,随机选择淘汰。
  • 如果业务中有置顶的需求,可以使用 volatile-lru 策略,同时置顶数据不设置过期时间,这些数据就一直不被删除会淘汰其他设置过期时间的数据;
  • 如果业务中有短时高频访问的数据,可以使用 alkeys-lfu 或 volatile-lfu 策略;

3.3 Redis 内存只有2G,数据有10G怎么保证Redis 中最后保留的key 都是热点key:

使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据;


总结

本文对Redis 的两种持久化,及过期key 删除和内存淘汰进行总结。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库主从复制

目录 一.主从复制架构 二.主从复制原理 三.实现主从复制配置 1.新建主从复制 2.实战遇到问题 3.复制错误解决方法 4.级联 主从复制 5.半同步复制 MySQL数据库的主从复制(Master-Slave Replication)是一种常见的数据库复制架构,用于提…

越南宣称已成全球第二大手机出口国,富士康翻白眼,为啥限电?

日前越南媒体报道指越南今年前5个月的手机及零部件出口达到224亿美元,同比增长11%,超越印度,成为仅次于中国的全球第二大手机出口国,对此富士康、三星恐怕会有不同的意见。 为越南手机业务做出重要贡献的无疑是富士康、三星等企业…

2.2.1 ROS2案例以及案例分析

1.案例需求 需求1:编写话题通信实现,发布方以某个频率发布一段文本,订阅方订阅消息,并输出在终端。 需求2:编写话题通信实现,发布方以某个频率发布自定义接口消息,订阅方订阅消息,并…

1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码

一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统,结合react.js框架和node.js后端完成本系统,对理解react node编程开发语言有帮助系统采用node框架(前后端分离)),系统具有完整的源…

什么是数字体验成熟度,以及数字成熟度的模型计算和实现方法

“开发成功的全渠道数字身份,并通过无缝的数字体验吸引广泛的受众。无论您身在何处,都可以加速数字化转型并促进业务增长。通过直观、全面的工具,并了解您个人的数字体验成熟度水平,超越不断增长的客户期望并超越竞争对手。今天就…

构建LangChain应用程序的示例代码:53、利用多模态大型语言模型在RAG应用中处理混合文档的示例

许多文档包含多种内容类型,包括文本和图像。 然而,在大多数 RAG 应用中,图像中捕获的信息都会丢失。 随着多模态LLMs的出现,比如GPT-4V,如何在RAG中利用图像是值得考虑的。 本篇指南的亮点是: 使用非结…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树,广泛应用于数据库和 文件系统中,以保持数据…

Ubuntu20.04突然没网的一种解决办法

本来要学一下点云地图处理,用octomap库,但是提示少了octomap-server库,然后通过下面命令安装的时候: sudo apt install ros-noetic-octomap-server 提示:错误:7 https://mirrors.ustc.edu.cn/ubuntu focal-security …

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数(m_track)、绘…

HTTP与HTTPS协议区别及应用场景

HTTP(超文本传输​​协议)和 HTTPS(安全超文本传输​​协议)都是用于通过网络传输数据的协议。虽然它们有一些相似之处,但在安全性和数据保护方面也存在显著差异。 在这篇博文中,我们将探讨 HTTP 和 HTTPS…

Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作

章节内容 上一节我们完成了: MapReduce的介绍Hadoop序列化介绍Mapper编写规范Reducer编写规范Driver编写规范WordCount功能开发WordCount本地测试 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学…

利用YOLOv8识别自定义模型

一、背景介绍 最近项目需要识别自定义物品,于是学习利用YOLOv8算法,实现物品识别。由于物体类别不再常规模型中,因此需要自己训练相应的模型,特此记录模型训练的过程。 二、训练模型的步骤 1.拍照获取训练图片(训练图…

【前端CSS3】CSS显示模式(黑马程序员)

文章目录 一、前言🚀🚀🚀二、CSS元素显示模式:☀️☀️☀️2.1 什么是元素显示模式2.2 块元素2.3 行内元素2.4 行块元素2.5 元素显示模式的转换 三、总结🚀🚀🚀 一、前言🚀&#x1f…

操作符“->“

title: 操作符"->" date: 2024-01-16 00:00:00 categories: C箭头 tags: 箭头操作以及偏移量计算 #嘎嘎 操作符"->" ->是一个成员访问的操作,它的作用是通过一个指针来访问它所指向的对象的成员变量或成员函数。它的左边必须是一个指…

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE 解决方法:在命令后面加上 -legacy-peer-deps结果: 解决参考:https://blog.csdn.net/qq_43799531/article/details/131403987

全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系,你知道多少?

全网最适合入门的面向对象编程教程:09 类和对象的 Python 实现-类之间的关系,你知道多少? 摘要: 本文主要对类之间的关系进行了基本介绍,包括继承、组合、依赖关系,并辅以现实中的例子加以讲解&#xff0…

Java的进程和线程

一Java的进程 二Java的线程 多线程 ◆如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”。 ◆多个线程交替占用CPU资源,而非真正的并行执行。 ◆多线程好处。 ◆充分利用CPU的资源。 ◆简化编程模型。 ◆良好的用…