当前位置: 首页 > news >正文

Java实习生------Redis常见面试题汇总(AOF持久化、RDB快照、分布式锁、缓存一致性)⭐⭐⭐

 “年轻人,就要勇敢追梦”🌹

参考资料:图解redis

目录

谈谈你对AOF持久化的理解?

redis的三种写回策略是什么?

谈谈你对AOF重写机制的理解?AOF重写机制的具体过程?

谈谈你对RDB快照的理解?怎么触发RDB?

redis大key对持久化有什么影响?

如何用redis实现分布式锁?基于 Redis 实现分布式锁的优点与缺点?

数据库和缓存如何保持一致性?


谈谈你对AOF持久化的理解?

  • Redis每执行一次写操作命令,就会以追加的方式写入到一个文件里,这个文件就叫做AOF日志,当redis重启时,再去执行这个文件中的命令,就相当于做了数据恢复。将写操作命令写入到日志文件的过程就是redis的AOF持久化过程。

值得注意的是,redis只会记录写操作,读操作不会记录;另外,redis是先执行完写操作命令,再将这个命令记录到日志中,这么做有两点好处:

  • 避免了额外的检查开销,如果命令是错误的,那么在执行的时候就可以检查出来了,不会往日志中记录一条错误命令
  • 不会阻塞当前命令的执行

但是也有两点坏处:

  • 如果redis在执行这条写命令的时候,redis发生故障宕机,也就是还没来得及将这条命令写入到日志中,所以就会造成数据丢失
  • 可能会阻塞下一条命令的执行

redis的三种写回策略是什么?

AOF日志中的命令还并没有被同步到硬盘,此时这些命令还存在于server.aof_buf缓冲区中

AOF具体有三种写回策略:

  • always:命令写入aof_buf之后就立即调用fsync函数,将AOF数据同步到硬盘。可靠性高,最大程度保证数据不会丢失,但是性能开销比较大
  • no:命令写入aof_buf之后先将命令写入到AOF文件的内核缓冲区,不对AOF文件做fsync同步,同步硬盘操作由操作系统负责。性能好,但是如果宕机会丢失很多数据
  • everysec:命令写入aof_buf之后,先将命令写入到AOF文件的内核缓冲区,然后每隔一秒调用一次fsync函数,将内核缓冲区中的数据同步到硬盘。性能适中,redis宕机会丢失一秒内的数据

谈谈你对AOF重写机制的理解?AOF重写机制的具体过程?

随着执行命令的增多,AOF文件中的命令也越来越多,AOF文件的体积也会越来越大,AOF重写机制的目的就是为了压缩AOF文件的体积。

AOF重写机制的妙处就在于,它会读取数据库中的最新数据,然后仅用一条命令来记录这条数据;也就是说,如果在之前,这条记录被多次修改过,也就意味着有多条修改命令,那么只需要记录最后一条修改不就行了吗?这样就减少了命令的数量,AOF重写机制会把这些最新的命令写入到一个新的AOF文件中,然后覆盖掉原有的AOF文件。

因为AOF重写过程比较耗时,所以一般不会在主进程中执行

开启AOF重写机制之后,主进程会fork出一个子进程,由子进程来执行AOF重写。

这样做的好处有两点:

  • 重写过程由子进程来执行,主进程依旧可以相应客户端命令
  • 主进程和子进程共用一份页表,即主进程和子进程共用一块物理内存

缺点:

  • 主进程在fork子进程的时候,由于要复制一份页表给子进程,所以会造成主进程阻塞
  • 另外,当主进程或者子进程修改共享数据时,会发生写时复制,内核会将物理内存再拷贝一份,也会造成主进程的阻塞

谈谈你对RDB快照的理解?怎么触发RDB?

RDB快照记录了某一瞬间内存中的数据,所以RDB文件记录的是实际的数据,而AOF日志记录的是一条条命令。使用RDB来进行数据恢复的效率要高于AOF,所以RDB是redis的默认持久化方式。

触发机制:两条命令,save和bgsave

  • save:阻塞当前redis服务器,直到RDB过程结束
  • bgsave:主进程fork出一个子进程,阻塞只发生在fork阶段,一般时间很短

redis大key对持久化有什么影响?

大key对AOF日志的影响:

  • 使用always策略:主线程在执行fsync函数时,阻塞的时间比较久
  • 使用no策略:由于永远不会执行fsync函数,所以不会影响主线程
  • 使用everysec策略:由于是异步执行fsync函数,所以大key持久化的过程不会影响主线程

大key对AOF重写和RDB的影响:

  • 创建子进程的过程中父进程会发生阻塞,因为子进程要复制父进程的页表等数据结构
  • 创建完子进程之后父进程也会发生阻塞,如果父进程对大key做了修改,那么内核就会发生写时复制,会把物理内存复制一份,由于大key占用的物理内存比较大,那么在复制物理内存的时候就会很耗时,就会阻塞父进程

如何用redis实现分布式锁?基于 Redis 实现分布式锁的优点与缺点?

分布式锁主要应用于并发环境下,保证某个资源在同一时刻只能被某一个用户所使用

使用 redis 中的 SET NX命令实现分布式锁

SET lock_key unique_value NX PX 10000 

在设置锁的时候,需要满足两个条件:

  • 需要对锁设置过期时间,避免锁被获取之后发生异常,导致客户端无法释放锁
  • 锁变量的值需要能够区分出不同的用户

优点:

  • 性能高效、实现方便(使用SET NX命令)

缺点:

  • 超时时间不好设置:如果设置的时间太长,那么会影响性能;如果设置的时间太短,起不到互斥的作用
  • 可能存在不可靠性:redis基于集群分布的,且主从复制的过程是异步的,可能在redis主节点获取到锁之后,主节点宕机,还没来得及同步,所以在新的redis主节点上依旧可以重新获取锁

数据库和缓存如何保持一致性?

如果先更新数据库,再更新缓存:

此时,数据库中的值是2,而缓存中的值是1,出现了数据库和缓存中的数据不一致的现象! 

如果先更新缓存,再更新数据库:

此时,缓存中的值是2,数据库中的值是1,依旧出现了数据库和缓存中的数据不一致的现象! 

如果先删除缓存,再更新数据库:

 这种情况下,读请求和写请求并发的情况下,出现了数据库和缓存中的数据不一致的问题!

如果先更新数据库,再删除缓存:

 如果但从理论上分析,上述情况依旧导致了数据不一致的问题,但是,值得注意的是,在实际中,这种情况出现的概率并不高,因为写缓存的速度要快于写数据库的速度

所以,先更新数据库,再删除缓存这种方案是可行的。

但是,继续分析,更新数据库和删除缓存,这是两种操作,如果更新数据库成功了,但是删除缓存的时候失败了,那么缓存中缓存的就是旧值,数据库中存放的是新值。怎么保证这两个操作都能顺利执行呢?

解决方案有两种:

重试机制:将要操作的数据加入到消息队列,如果删除缓存失败,那么就重新读取消息,重新执行删除缓存操作;如果删除缓存成功了,就将消息从消息队列中移除。

订阅MySQL binlog:在更新数据库时,会产生一条bin log日志,如果删除缓存失败,就从bin log中拿到具体操作的数据,进行重新删除


 整理面经不易,觉得有帮助的小伙伴点个赞吧~感谢收看!

相关文章:

Java实习生------Redis常见面试题汇总(AOF持久化、RDB快照、分布式锁、缓存一致性)⭐⭐⭐

“年轻人,就要勇敢追梦”🌹 参考资料:图解redis 目录 谈谈你对AOF持久化的理解? redis的三种写回策略是什么? 谈谈你对AOF重写机制的理解?AOF重写机制的具体过程? 谈谈你对RDB快照的理解&a…...

seata服务搭建

它支持两种存储模式,一个是文件,一个是数据库,下面我们分别介绍一下这两种配置nacos存储配置,注意如果registry.conf中注册和配置使用的是file,就会去读取file.config的配置,如果是nacos则通过nacos动态读取…...

Kafka和RabbitMQ有哪些区别,各自适合什么场景?

目录标题1. 消息的顺序2. 消息的匹配3. 消息的超时4. 消息的保持5. 消息的错误处理6. 消息的吞吐量总结1. 消息的顺序 有这样一个需求:当订单状态变化的时候,把订单状态变化的消息发送给所有关心订单变化的系统。 订单会有创建成功、待付款、已支付、已…...

用Pytorch构建一个喵咪识别模型

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 目录 一、前言 二、问题阐述及理论流程 2.1问题阐述 2.2猫咪图片识别原理 三、用PyTorch 实现 3.1PyTorch介绍 3.2PyTorch 构建模型的五要素 3.3PyTorch 实现的步骤 3.3.…...

QT搭建MQTT开发环境

QT搭建MQTT开发环境 第一步、明确安装的QT版本 注意: 从QT5.15.0版本开始,官方不再提供离线版安装包,除非你充钱买商业版。 而在这里我使用的QT版本为5.15.2,在线安装了好久才弄好,还是建议使用离线安装的版本 在这里…...

Python3,5行代码,生成自动排序动图,这操作不比Excel香?

5行代码生成自动排序动图1、引言2、代码实战2.1 pynimate介绍2.2 pynimate安装2.3 代码示例3、总结1、引言 小屌丝:鱼哥,听说你的excel段位又提升了? 小鱼:你这是疑问的语气? 小屌丝:没有~ 吧… 小鱼&…...

【Java SE】变量的本质

目录一. 前言二. 变量(variable)2.1 性质2.2 变量类型2.2.1 核心区别2.3 变量的使用三. 总结一. 前言 一天一个Java小知识点,助力小伙伴更好地入门Java,掌握更深层次的语法。 二. 变量(variable) 2.1 性质 变量本质上就是代表一个”可操作的存储空间”…...

【Android笔记85】Android之使用Camera和MediaRecorder录制视频

这篇文章,主要介绍Android之使用Camera和MediaRecorder录制视频。 目录 一、录制视频 1.1、案例运行效果 1.2、创建Camera对象 1.3、创建MediaRecorder对象...

MySQL集群搭建与高可用性实现:掌握主从复制、多主复制、负载均衡和故障切换技术,让你的MySQL数据库永不宕机!

MySQL集群和高可用性MySQL是一款广泛使用的关系型数据库管理系统,常用于Web应用和企业级应用中。为了提高MySQL的可用性,我们可以通过搭建MySQL集群和实现高可用性来保障数据的稳定性和可靠性。本文将介绍如何搭建MySQL集群和实现高可用性,包…...

收到6家大厂offer,我把问烂了的《Java八股文》打造成3个文档。共1700页!!

前言大家好,最近有不少小伙伴在后台留言,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些程序员了。这不&#…...

多线程 (六) 单例模式

🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…...

Docker入门到放弃笔记之容器

1、启动容器1.1容器hello world1.2 容器bash终端1.3 后台运行容器是 Docker 三大核心概念之一,其余两个是镜像与仓库。本文主讲容器。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟…...

项目二 任务三 训练5 交换机的HSRP技术

在“项目二 任务三 训练4 交换机的DHCP技术”基础上继续完成下列操作: 1、二层交换机50-2的配置 50-2>en 50-2#conf t Enter configuration commands, one per line. End with CNTL/Z. 50-2(config)#int 50-2(config)#interface g 50-2(config)#interface gigab…...

计算机网络复习重点

文章目录计算机网络复习重点第一章 计算机网络和因特网概念与应用1、什么是因特网2、协议protocol3、入网方式4、物理媒介5、数据交换模式6、延时与丢包什么时候发生延时?延时的类型丢包何时发生7、协议层次与模型因特网协议栈TCP / IP模型ISO/OSI参考模型协议数据单…...

算法基础---基础算法

文章目录 快速排序归并排序二分 整数二分浮点数二分高精度 高精度加法高精度减法高精度乘法高精度除法前缀和 一维前缀和二维前缀和差分 一维差分二维差分双指针位运算离散化区间合并一、快速排序 思想:1.首先确定一个分界点(随机取任意一点为…...

linux中写定时任务

场景:我们生产环境中有大量的日志记录,但是我们的磁盘没有太大,需要定时清理磁盘 文章目录crond 定时任务详解安装定时任务crontab服务启动与关闭crontab操作crontab 命令test.sh查看日志丢弃linux中的执行日志Linux进入nano模式方式一方式二…...

2023.3.21

6&#xff1a;有序数组中找到num // arr保证有序&#xff0c;在arr数组中寻找num&#xff0c;二分查找public static boolean find(int[] arr, int num) {if(arr null || arr.length 0) {return false;}int L 0;int R arr.length - 1;while (L < R) {int mid (L R) /…...

制作数据库框架

一 利用前端条件组装sql与查询条件的集合public void handle() throws Exception{Map<String,String> requestMap new HashMap();String fromdate requestMap.get("fromdate");String todate requestMap.get("todate");String resultcode reque…...

Winbond W25Qxx SPI FLASH 使用示例(基于沁恒CH32V307单片机)

文章目录目的基础说明使用示例总结目的 Winbond&#xff08;华邦&#xff09;的 W25Qxx 系列 SPI FLASH 是比较常用的芯片&#xff0c;这篇文章将演示单片机中通过SPI使用该芯片的操作过程。 本文使用沁恒官方的开发板 &#xff08;CH32V307-EVT-R1沁恒RISC-V模块MCU赤兔评估…...

贪心算法的原理以及应用

文章目录0、概念0.1.定义0.2.特征0.3.步骤0.4.适用1、与动态规划的联系1.1.区别1.2.联系2、例子3、总结4、引用0、概念 0.1.定义 贪心算法&#xff08;greedy algorithm &#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是…...

WebRTC拥塞控制原理之一基本介绍

1 基本原理 WebRTC的拥塞控制模块使用的是基于TCP的拥塞控制算法。它是根据网络带宽和延迟等信息来自适应地调整传输速率的。 具体来说&#xff0c;该模块采用的是基于RFC 3550中的延迟抖动调整算法的改进版本。该算法实施的基本原理是在传输的过程中定期探测网络的质量和延迟…...

选择 .NET 的 n 个理由

自从我们启动快速发展的 .NET 开源和跨平台项目以来&#xff0c;.NET 发生了很大变化。我们重新思考并完善了该平台&#xff0c;添加了专为性能和安全性而设计的新低级功能&#xff0c;以及以生产力为中心的高级功能。Span<T>、硬件内在函数和可为空的引用类型都是示例。…...

spark第三章:工程化代码

系列文章目录 spark第一章&#xff1a;环境安装 spark第二章&#xff1a;sparkcore实例 spark第三章&#xff1a;工程化代码 文章目录系列文章目录前言一、三层架构二、拆分WordCount1.三层拆分2.代码抽取总结前言 我们上一次博客&#xff0c;完成了一些案例的练习&#xff0…...

Vue实战【封装一个简单的列表组件,实现增删改查】

文章目录&#x1f31f;前言&#x1f31f;table组件封装&#x1f31f;父组件&#xff08;展示表格的页面&#xff09;&#x1f31f;控制台查看父子组件通信是否成功&#x1f31f;Vue2父子组件传递参数&#x1f31f;写在最后&#x1f31f;JSON包里写函数&#xff0c;关注博主不迷…...

微前端(无界)

前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现有方案&#xff0c;在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题&#xff0c;或无法提供支持。本…...

强烈推荐:0基础入门网安必备《网络安全知识图谱》

蚁景网安学院一直专注于网安实战技能培养&#xff0c;提供全方位的网安安全学习解决方案。我们集聚专业网安技术大佬资源&#xff0c;倾力打造了这本更全面更系统的“网络安全知识图谱”&#xff0c;让大家在网络安全学习路上不迷茫。 在这份网安技能地图册里&#xff0c;我们对…...

网络技术与应用概论(上)——“计算机网络”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容依旧是计算机网络的一些知识点噢&#xff0c;下面&#xff0c;让我们进入计算机网络的世界吧 网络内涵 网络特征 网络定义 互联网发展过程 从ARPA网络到Internet 从低速互联网到高速互联网 从数据结构到统一网…...

JAVASE/封装、继承、多态

博客制作不易&#xff0c;欢迎各位点赞&#x1f44d;收藏⭐关注前言在学习面向对象编程语言时&#xff0c;封装、继承、多态则是我们必须学习和使用的三大特征。本文通过举例&#xff0c;说明了该三大特征的基本权限特点。一、访问限定符范围private默认权限protectedpublic同一…...

SpringBoot ElasticSearch 【SpringBoot系列16】

SpringCloud 大型系列课程正在制作中&#xff0c;欢迎大家关注与提意见。 程序员每天的CV 与 板砖&#xff0c;也要知其所以然&#xff0c;本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 elasticsearch是一款非常强大的开源搜索引擎&a…...

Virtual box磁盘大小调整操作

Virtual box磁盘大小调整操作环境说明思路操作1、挂载要压缩的硬盘到 ~/data2、填充 0 文件3、删除 全是0空文件4、虚拟机关机5、在windows环境下用VBoxManage.exe 进行压缩硬盘加大环境说明 主机 windows 虚拟机 ubuntu 分配了 80G 的硬盘&#xff0c;现在已经占用 80 G 了。…...