【Java面试】二、Redis篇(中)
文章目录
- 1、Redis持久化
- 1.1 RDB
- 1.2 AOF
- 1.3 RDB与AOF的对比
- 2、数据过期策略(删除策略)
- 2.1 惰性删除
- 2.2 定期删除
- 3、数据淘汰策略
- 4、主从复制
- 4.1 主从全量同步
- 4.2 增量同步
- 5、哨兵模式
- 5.1 服务状态监控
- 5.2 哨兵选主规则
- 5.3 哨兵模式下,Redis集群的脑裂
- 6、分片集群
- 7、Redis快的原因(IO多路复用 + Redis网络模型)
- 7.1 用户空间和内核空间
- 7.2 阻塞IO模型
- 7.3 非阻塞IO模型
- 7.4 IO多路复用
- 8、面试
1、Redis持久化
1.1 RDB
RDB,即Redis Database Backup file,导出数据快照到磁盘。如果Redis实例宕机,也可读取快照文件,恢复数据,一般bgsave,以防文件过大时,阻塞其他请求

也可根据配置触发RDB:redis.conf

RDB的执行原理:bgsave开始时,fork主进程得到一个子进程(类似克隆,把存有映射关系的页表拷贝给了子进程),页表中存了分配给进程的内存(虚拟地址)和物理内存(物理地址) 的映射关系。子进程根据页表去读取数据,并写入RDB文件,主进程则继续回去处理客户端请求。

主进程和子进程之间会使用写时复制(copy-on-write)机制,此时,原内存空间为read-only,主进程如果要进行写操作,会拷贝一份数据,进行写操作,且后面读操作也是基于拷贝的副本去读,因此,basave期间,进行更新的那部分数据,不会同步到快照文件中。
1.2 AOF
Append Only File(追加文件),类似日志文件,记录每一个写命令

相关配置:redis.conf

记录写命令到AOF文件,有不同的策略(即刷盘策略)


everysec策略适用场景最多。此外,多次set同一个key,没必要重复记录,记录最后一次即可,可用bgrewriteaof命令,让AOF重写,降低文件大小。

关于触发重写的阈值配置:

1.3 RDB与AOF的对比

2、数据过期策略(删除策略)
即数据过期后,何时从内存中删除。
- 惰性删除
- 定期删除
2.1 惰性删除
key过期后,不管,直到下次get key,发现过期就删除,否则正常返回

- 优点:不多占用CPU
- 缺点:如果有key过期,但后面没被get过,则这块空间一直得不到释放
2.2 定期删除
每隔一段时间,对一定数量的key进行检查,删除过期的key。有两种模式:
- SLOW模式:定时任务,执行频率默认10hz,即每个执行周期100ms,每次不超过25ms,可在redis.conf调整
- FAST模式:频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
Redis的过期策略是惰性删除 + 定期删除配合。
3、数据淘汰策略
如果缓存过多,内存沾满了,如何处理 ⇒ 根据配置的策略删除一定的数据 ⇒ 数据淘汰策略
- noeviction:不淘汰,内存满了就不允许写,抛错,是默认的策略
- volatile-ttl:TTL越小,越先被淘汰
- allkeys-randon:全体key,随机淘汰
- volatile-random:设置了TTL的key,随机淘汰
- allkeys-lru:全体key,按LRU算法淘汰
- volatile-lru:设置了TTL的key,按LRU淘汰
- allkeys-lfu:全体key,按LFU算法淘汰
- volatile-lfu:设置了TTL的key,按LFU淘汰

数据库有 1000 万数据 ,Redis 只能缓存 20w 数据,如何保证 Redis 中的数据都是热点数据?
⇒ allkeys-lru策略,挑选最近没怎么使用的数据淘汰,留下热点数据。且如果有指定的需求,可以用volatile-lru + 置顶数据不设置过期时间,以保证这些数据永不被删除
4、主从复制
Redis的三种模式:
- 单机模式
- 集群模式
- 哨兵模式

单节点的Redis并发能力有上限,切为Redis主从集群,实现读写分离,提高并发能力(如下,一台服务器又查又写,并为一台写两台查,查的并发上限翻倍):

读写分离后,数据的同步方案:
4.1 主从全量同步
-
Replication Id:即replid,数据集的标记,该ID相同则说明对应的数据集是同一个,每个master有唯一的replid,slave会继承master的replid。
-
offset:偏移量,repl_baklog文件记录的数据越多,offset越大
全量同步时,如果master和slave的replid不相等,则master执行basave生成快照给slave去同步。根据前面的写时复制机制,basave期间,master接收到的写请求不会同步到快照文件中,因此,slave加载完快照文件后,还要执行从master收到的repl_baklog文件,该文件记录了basave期间,master额外收到的写指令。

如果replid相等,但master的offset为80,slave的offset为50,则slave把repl_baklog文件50-80的这一段命令再执行一下
4.2 增量同步
常用于slave节点重启后。slave发送自己的replid和offset到master,如果replid不一致,则是第一次同步,后续同全量。

如果replid一致,则不是第一次同步。根据offset发送对应片段的repl_baklog的命令到slave

5、哨兵模式
上面的主从集群,并不能实现高可用,master一挂,丧失写的能力 ⇒ 引入哨兵机制实现主从集群自动故障恢复。哨兵做为Redis集群的一个节点,其作用:
- 节点状态监控:不断检查master、各个slave的健康状况
- 自动故障恢复:如果master故障,则从slave中提升一个出来当master,即使后面master再恢复,也以新的master为主节点
- 通知:集群故障转移后,将新的master、slave信息推到Redis客户端

5.1 服务状态监控
哨兵Sentinel基于心跳机制监测节点状态,每1秒向集群每个节点发送ping命令:
- 主观下线:某一个Sentienl发现某节点在规定时间未响应回pong到Sentinel,认为该节点主观下线
- 客观下线:指定数量(常设为Sentienl数量的一半)的Sentintl都认为这个节点主观下线,则该节点客观下线

5.2 哨兵选主规则
- 排除不在线的、响应慢的
- 排除与主节点断开时间长的(断开时间长,读写分离下,数据不全)
- 根据优先级、offset。若slave-prority一样,offset越大,优先级越高
- 看运行ID,越小优先级越高
5.3 哨兵模式下,Redis集群的脑裂
下面是一个正常的哨兵模式架构:

如下,假如Sentinel、master、slave处于不同的网络环境,当Sentinel因网络原因连不上master时,其会去重新选举出一个master。但原来的master客户端是可以连接通的,此时就出现了两个master,即发生了脑裂。

再到后来,网络恢复,原来的master会被降为slave(前面提到的,恢复后,以新master为主节点),并从新的master去同步数据。即清空自己的数据,导入新master的快照文件,如此,脑裂期间,客户端写到master的数据就会丢失。
关于集群脑裂问题的解决,可配置这两个参数:
//最少的slave节点为1个
min-replicas-to-write 1
//数据复制和同步的延迟不能超过5秒
min-replicas-max-lag 5
如此,脑裂时,往旧的master写数据,因其slave数量为0,就会写入失败。且网络恢复后,数据同步也会因延迟过大而报错。
6、分片集群
主从(主写从读)集群和哨兵,解决了高可用、高并发读的问题,但存在两个问题:
- 海量数据的存储问题
- 高并发
写的问题
由此 ⇒ Redis分片集群,特点:
- 集群中有多个master,每个master保存不同的数据,由此,每加一个master,并发写的能力就加一段(如从2n到3n)⇒ 解决高并发写
- 每个master有多个slave ⇒ 解决高并发读
- master之间互相ping,以检测健康状态,起到了哨兵的作用。如果多个master都认为某个master挂了,那这个master客观下线 ⇒ 类似哨兵
- 客户端可请求访问集群的任意节点,最终都会被转发到正确的节点上去查写

至于客户端的请求会被转发到正确的节点上去,是通过哈希槽实现。Redis集群引入哈希槽的概念,整个集群有16384个哈希槽。
set或者get某个key ⇒ 这个key通过CRC16校验后,对16384取模来决定放哪个槽 ⇒ 集群每个master负责一定范围的槽

除了key去决定放哪个槽,也可以在key前加个{有效部分},如上面{aaa},如此,这些key就都可以被分到同一个master节点
7、Redis快的原因(IO多路复用 + Redis网络模型)
Redis是单线程的,但为什么还那么快?
- 纯内存操作,执行速度快
- 单线程下,避免了上下文切换,以及线程安全问题的考虑和实现
- 使用了I/O多路复用模型,是非阻塞IO
7.1 用户空间和内核空间
Linux系统中一个进程使用的内存有两部分:
- 用户空间:权限低,不能直接调用系统资源(只能通过内核提供的接口来调用)
- 内核空间:可调用一切系统资源

关于以上空间的理解:用户A打开微信给其好友B,发生了一条消息message1。启动微信,即开了一个进程,编辑信息message1,相当于在服务器的用户空间,想发送message1,就要过网卡然后发给用户B。
而用户空间不能直接调用系统资源(硬件网卡),因此整个流程为:把用户缓冲区数据拷贝到内核缓冲区 ⇒ 写入硬件设备。用户B给A回复后,读数据则是:从网卡设备读到内核缓冲区,再拷贝到用户缓冲区。
以上,影响性能的有两个点:
- 用户空间读数据时,要等待内核空间给它,内核空间数据未就绪,就一直空等
- 数据来回拷贝
7.2 阻塞IO模型
用户进程在以下两个阶段都被阻塞:
- 阶段1:等待内核从系统硬件资源中去准备数据
- 阶段2:数据从内核空间拷贝到用户空间

7.3 非阻塞IO模型
用户进程,在阶段一不会被阻塞,如果内核空间没数据,会返回一个异常给用户进程,用户进程可以过会儿再去读。但阶段二,从内核空间拷贝到用户空间的时候,依然阻塞

7.4 IO多路复用
单个线程去监听多个Socket,监听的过程,用户线程是阻塞的,但只要出现一个Socket可读或可写,用户线程就会收到通知去干活儿

IO多路复用,监听Socket有多种实现:
- select
- poll
- epoll

以点餐为例,select和poll就像:吧台有一盏灯,底下一群顾客,人手一个按钮,想好吃什么时,按下按钮,吧台灯亮。但此时吧台显示不出具体是哪个顾客要点餐,只是知道有人要点餐了。服务员就得挨个去问,是不是你要点餐?
epoll则是:顾客的按钮不再控制吧台的灯,而是控制吧台的计算机屏幕,顾客按一下,屏幕显示顾客桌号
select 和 poll 只会通知用户进程有 Socket 就绪,但不确定具体是哪个Socket ,需要用户进程逐个遍历 Socket 来确认
epoll 则会在通知用户进程 Socket 就绪的同时,把已就绪的 Socket 写入用户空间
最后,Redis的网络模型,有IO多路复用,用来监听客户端的连接Socket,但每个Socket下做的事可能不一样,有读请求、写请求,因此,Redis再用事件派发机制,转发到对应的处理器

8、面试






相关文章:
【Java面试】二、Redis篇(中)
文章目录 1、Redis持久化1.1 RDB1.2 AOF1.3 RDB与AOF的对比 2、数据过期策略(删除策略)2.1 惰性删除2.2 定期删除 3、数据淘汰策略4、主从复制4.1 主从全量同步4.2 增量同步 5、哨兵模式5.1 服务状态监控5.2 哨兵选主规则5.3 哨兵模式下,Redi…...
二进制安装Kubernetes(k8s)v1.30.1
二进制安装Kubernetes(k8s)v1.30.1 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支持IPv4IPv6双栈。 我使用IPV6的目的是…...
俄罗斯半导体领域迈出坚实步伐:首台光刻机诞生,目标直指7纳米工艺
近日,国外媒体纷纷报道,俄罗斯在半导体技术领域取得了重要突破,首台光刻机已经制造完成并正在进行严格的测试阶段。这一里程碑式的事件标志着俄罗斯在自主发展半导体技术的道路上迈出了坚实的一步。 据俄罗斯联邦工业和贸易部副部长瓦西里-什…...
什么是容器:从基础到进阶的全面介绍
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
力扣 第 399 场周赛 解题报告 | 珂学家 | 调和级数 + 分块DP
前言 T1. 优质数对的总数 I 题型: 签到 class Solution:def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:res 0for v1 in nums1:for v2 in nums2:if v1 % (v2 * k) 0:res 1return resT2. 压缩字符串 III 思路: 模拟 感觉引入一个栈&…...
Redis的下载、安装、启动和初尝试【超级简单】
redis最好是在Linux系统中使用,这是最接近生产实际的环境。 不过,我们初学者,目的是学习Redis的使用、原理,如果在Linux下直接学习Redis,很可能会因为命令不熟悉而劝退,这是不好的。 因此,我主张…...
v-cloak 用于在 Vue 实例渲染完成之前隐藏绑定的元素
如果你是后端开发者(php),在接触一些vue2开发的后台时,会发现有这段代码: # CDN <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> # 或 <script src"https://cd…...
港股:并不意外的获利了结
中金公司表示,风险偏好驱动的反弹已经较为充分,分歧和获利了结也不意外。接下来或在当前水平震荡盘整,等待更多催化剂。 在持续一个月的大涨后,港股市场上周出现明显回调。此前我们多次提示,市场已经超买,情…...
Python项目开发实战:工厂库存管理系统(案例教程)
一、项目背景与意义 随着制造业的快速发展,工厂库存管理成为了企业运营中不可或缺的一部分。一个高效的库存管理系统能够确保物料供应的及时性、降低库存成本、提高生产效率。因此,我们决定使用Python开发一个工厂库存管理系统,以满足工厂日常库存管理的需求。 二、系统需求…...
VS2022 嘿嘿
还是大二的时候就开始用这个,但居然是为了用PB,-_-|| 用了段时间换成了C#,依稀还记得大佬们纠正我的读法,别读C井,应该读C夏普。。。 安装过程其实也没啥,就是关键Key得花时间找,我好不容易搞…...
Flutter 中的 PhysicalShape 小部件:全面指南
Flutter 中的 PhysicalShape 小部件:全面指南 在Flutter中,PhysicalShape小部件是一个能够为子组件添加物理效果的边框和阴影的装饰性小部件。它能够模拟真实世界中物体的立体感,通过在子组件的周围创建一个可自定义的形状,并添加…...
CAD二次开发(6)-用户交互之选择集
1. 简单测试 测试让选中的图形描红 [CommandMethod("SeleDemo")]public void SeleDemo(){Database db HostApplicationServices.WorkingDatabase;Editor ed Application.DocumentManager.MdiActiveDocument.Editor;PromptSelectionResult psr ed.GetSelection();…...
如何使用性能监控工具分析JVM性能瓶颈
1、jConsole: jConsole是JDK自带的Java监控和管理控制台。它提供了一个图形用户界面(GUI),用于监控和管理Java应用程序的性能和资源消耗。 使用方法:打开jdk\bin\jconsole.exe,连接到正在运行的Java进程&a…...
解决vite打包只生成了一个css和js文件问题
文章目录 1. 打包遇到的问题2. 问题原因及修改3. 调整后再次打包🆗 1. 打包遇到的问题 今天整了一个项目,试了下打包,发下打包后只生成了一个css文件,和一个js文件, 这样肯定是不行的,因为这样这个文件的包…...
数据访问层设计_4.灵活运用XML Schema
1.XML Schema XML Schema用来描述XML文档合法结构、内容和限制。XML Schema由XML1.0自描述,并且使用了命名空间,有丰富的内嵌数据类型及其强大的数据结构定义功能,充分地改造了并且极大地扩展了DTDs(传统描述XML文档结构和内容限…...
【Linux安全】Firewalld防火墙基础
目录 一、Firewalld概述 二、Firewalld和iptables的关系 三、Firewalld网络区域 1、firewalld防火墙预定义了9个区域: 2、firewalld 数据包处理原则 3、firewalld数据处理流程 4、firewalld检查数据包的源地址的规则 四、Firewalld防火墙的配置方法 1、firewalld 命令…...
先进制造aps专题八 基于ai大模型的ai超级应用,ai生管
目前正在研发的面向消费者的ai超级应用有ai文员,ai教师,ai家教,ai护士,ai翻译 而ai生管无疑是面向制造业的ai超级应用 从商业角度来说,ai生管,必然是aps公司必然要研发的ai超级应用...
Textual for Mac:轻量级IRC客户端
在寻找一款高效、轻量级的IRC客户端时,Textual for Mac无疑是你的不二之选。它集成了众多现代技术,如本机IPv6、最新的IRCv3规范,以及客户端证书身份验证,让你的聊天体验更加顺畅和安全。 Textual for Mac v7.2.2免激活版下载 Tex…...
Facebook:连接世界,畅游社交之旅
作为全球最大的社交平台之一,Facebook不仅仅是一个网站,更是一个连接世界的桥梁,让人们可以轻松地与全球各地的朋友、家人和同事保持联系,分享生活、交流想法,畅游社交的无边界之旅。本文将带领读者探索Facebook的魅力…...
部署PIM-SM
拓扑图 配置 使能组播路由 配置OSPF 组播路由器接口配置pim-sm 连接组成员的接口使能igmp pim路由器上配置静态RP sysname AR1 # multicast routing-enable # interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.0 pim sm # interface GigabitEthernet0/0/…...
从Polling到DAQ:在ASAP2 Studio里提前配置XCP测量通道,提升CANape数据采集效率
从Polling到DAQ:在ASAP2 Studio里提前配置XCP测量通道,提升CANape数据采集效率 在汽车电控测试领域,数据采集的效率和精度直接影响着开发周期和标定质量。传统轮询方式(Polling)虽然简单易用,但面对现代ECU…...
HoRain云--OpenCode 配置
🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...
程序员必看:代码注释规范与最佳实践
1. 程序员与注释的爱恨情仇作为一名在代码海洋里摸爬滚打多年的老程序员,我见过太多令人啼笑皆非的代码注释。这些注释有的像谜语,有的像情书,有的干脆就是行为艺术。今天我们就来聊聊这个让无数程序员又爱又恨的话题——代码注释。记得我刚入…...
Kuikly动态化跨端框架的多维特性与选型实践
Kuikly,是指基于Kotlin MultiPlatform(KMP)构建的跨端开发框架,利用KMP的逻辑跨平台能力,抽象通用跨平台UI渲染接口,复用平台UI组件,实现UI跨平台,具备轻量、高性能、可动态化优势;其核心特点是…...
嵌入式工程师的核心竞争力与职业发展路径
1. 嵌入式工程师的现状与挑战嵌入式系统作为连接物理世界与数字世界的桥梁,已经渗透到现代社会的各个角落。从我们口袋里的智能手机到工厂的自动化设备,从智能家居到航空航天系统,嵌入式技术无处不在。然而,这个看似广阔的领域&am…...
Lychee-Rerank与MySQL协同实战:构建智能内容检索系统
Lychee-Rerank与MySQL协同实战:构建智能内容检索系统 你是不是也遇到过这样的烦恼?在自己的博客或者内容平台上,辛辛苦苦写的文章,用户却搜不到。明明文章里提到了某个技术点,但用户用关键词一搜,要么搜出…...
万象熔炉 | Anything XL参数详解:EulerAncestralDiscreteScheduler原理浅析
万象熔炉 | Anything XL参数详解:EulerAncestralDiscreteScheduler原理浅析 如果你用过Stable Diffusion这类AI绘画工具,可能对“调度器”这个词有点陌生,但一定感受过它的影响。比如,为什么有的模型生成图片又快又好,…...
基于QT(C++)+Oracle实现的(界面)教务管理系统
一、选题背景 教务管理系统是基本每个高校都有的一个系统,教务系统管理系统充分利用互联网络B/S管理系统模式,以网络为平台,为各个学校教务系统的管理提供一个平台,帮助学校管理教务,用一个账号解决学校教务教学管理&…...
直播录制从未如此简单:StreamCap 40+平台自动录制全攻略
直播录制从未如此简单:StreamCap 40平台自动录制全攻略 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st/StreamCa…...
为什么又来学习C语言?
我是一名来自民办二本院校的大三学生,早在大一上时学校就安排了C语言的课程,但是当时我很是浮躁,心不在学习,甚至想着回去复读,所以并没有吸纳多少C语言的知识。现在大三,有了考研想法,想重拾C语…...
