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中拿到具体操作的数据,进行重新删除


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

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

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

相关文章

Qt基础之三十三:海量网络数据实时显示

开发中我们可能会遇到接收的网络数据来不及显示的问题。最基础的做法是限制UI中加载的数据行数,这样一来可以防止内存一直涨,二来数据刷新非常快,加载再多也来不及看。此时UI能看到数据当前处理到什么阶段就行,实时性更加重要,要做数据分析的话还得查看日志文件。 这里给出…

前端网络安全

什么是同源策略同源指的是:协议、端口号、域名必须一致。他是浏览器的一个用于隔离潜在恶意文件的重要安全机制。限制了从同一个源加载的文档或脚本,与另一个源的资源进行交互。同源策略主要限制了三个方面:当前域下的js脚本不能够访问其他域…

吃透Java面试题,建议收藏

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

C++基础算法③——排序算法(选择、冒泡附完整代码)

排序算法 1、选择排序 2、冒泡排序 1、选择排序 基本思想:从头至尾扫描序列,每一趟从待排序元素中找出最小(最大)的一个元素值,然后与第一个元素交换值,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序…

Android Lancet Aop 字节编码修复7.1系统Toast问题(WindowManager$BadTokenException)

近期在Bugly上出现7.1以下设备上出现大量BadTokenException: android.view.WindowManager$BadTokenExceptionUnable to add window -- token android.os.BinderProxy6c0415d is not valid; is your activity running?报错堆栈,如下所示: …

Vite中ant design vue按需引入以及css预处理配置

这一篇主要讲一下 Vite 与 css 的配置。 1、Vite 按需加载 // vite.config.js import { defineConfig } from vite import Components from unplugin-vue-components/vite import {AntDesignVueResolver } from unplugin-vue-components/resolversexport default defineConfi…

【Java SE】变量的本质

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

【Spring-boot源码剥析】| 启动原理之侠客行篇

目录 一. 传说篇二. 快速启动原理三. 自动配置原理3.1 准备阶段3.2 配置阶段3.3 运行阶段三. Pefect Ending一. 传说篇 江湖传说,有一个神秘的江湖大侠,他名叫SpringBoot,擅长于开发出快速启动的应用程序。这个侠客的江湖名号传遍了整个江湖,无论是刀枪不入的武林高手还是阴…

谷歌外链怎么挑选?谷歌外链高质量平台有哪些?

我们都知道谷歌外链的分类是很多的,例如博客,B2B,社交媒体之类,还有论坛,书签等。 那谷歌外链怎么挑选? 答案是:选择GPB外链 下面我们来说一下关于谷歌外链的原理和技术分析。 我们先看下图…

基于“遥感+”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题,对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

[ 漏洞复现篇 ] Joomla未授权访问Rest API漏洞(CVE-2023-23752)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

linux中写定时任务

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

Linux之磁盘分区、挂载

文章目录一、Linux分区●原理介绍●硬盘说明查看所有设备挂载情况挂载的经典案例二、磁盘情况查询基本语法应用实例磁盘情况-工作实用指令一、Linux分区 ●原理介绍 Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,…

【JavaSE】类和对象(中)

类和对象(中)4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性5. 对象的构造及初始化5.1 如何初始化对象5.2 构造方法(构造器)5.2.1 概念5.2.2 特性5.3 默认初始化5.4 就地初始化6. 封装6.1 封装的概念6.2…

TypeScript(七)类

目录 前言 基本用法 实现接口 继承(extends) 基本用法 访问父类 重写父类(override) 只读关键字(readonly) 存取器(getters/setters) 静态成员(static&#xff…

JVM学习.02 内存分配和回收策略

1、前言《JVM学习.01 内存模型》篇讲述了JVM的内存布局,其中每个区域是作用,以及创建实例对象的时候内存区域的工作流程。上文还讲到了关于对象存货后,会被回收清理的过程。今天这里就着重讲一下对象实例是如何被清理回收的,以及清…

STM32的推挽输出和开漏输出

文章目录 前言一、推挽输出二、开漏输出三、区别和适应场景总结前言 本篇文章将带大家了解STM32的推挽输出和开漏输出,并且学习这两个的区别,学习分别在什么时候使用这两个不同的输出方式。 在 STM32 微控制器中,GPIO(General Purpose Input/Output)模块是一个通用的输入…

【ChatGPT】教你搭建多任务模型

ChatGPT教你搭建多任务模型 You: tell me what’s your version of gpt ? ChatGPT: As an AI language model developed by OpenAI, I am based on the GPT (Generative Pretrained Transformer) architecture. However, my version is known as GPT-3.5, which is an updat…

单元测试、反射、注解、动态代理

🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…

禁用非必需插件,让 IDEA 飞起

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech IDEA 为我们提供了众多的插件,但是这些插件并不都是必须的。如果电脑的性能不够强,反而会带来一些不必要的资源消耗。 因此这里整理了一些不常用的插件,可以…
最新文章