【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、面试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Android ListView鼠标模式下ListView回滚问题

概述 在 Android 应用程序中,ListView 是一种常用的控件,用于显示可滚动列表数据。然而,当在鼠标操作模式下使用 ListView 时,可能会遇到一个问题:点击列表项时,列表会回滚到指定位置,这可能会导…

c语言IO

前言 老是忘记c语言IO操作,故写个文章记录一下 打开文件 fopen FILE *fopen(const char *path, const char *mode);mode 返回值 如果文件成功打开,fopen 返回一个指向 FILE 结构的指针。如果文件打开失败(例如,因为文件不存…

CMS Full GC流程以及调优配置

个人博客 CMS Full GC流程以及调优配置 | iwts’s blog CMS CMS 收集器是以实现最短 STW 时间为目标的收集器,所以对于偏业务的后台开发而言,基本上都无脑选CMS了。 多线程收集器,工作在老年代,采用标记清除算法。比较特殊&am…

leetcode-顺时针旋转矩阵-111

题目要求 思路 1.假设现在有一个矩阵 123 456 789 2.我们可以根据19这个对角线将数据进行交换&#xff0c;得到矩阵 147 258 369 3.然后将矩阵每一行的数据再翻转&#xff0c;得到矩阵 741 852 963 代码实现 class Solution { public:vector<vector<int> > rot…

贪心-ACW803区间合并-XMUOJ力量碎片合并

题目 思路 附上几个参考链接 for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 C pair的基本用法总结&#xff08;整理&#xff09;_c pair用法-CSDN博客 使用 sort 实现自定义排序 - AcWing 话不多说&#xff0c;直接上代码 代码 /* ACW803区间合并-XMUOJ力量碎片合…

【C++】二分查找算法:x的平方根

1.题目 2.算法思路 看到题目可能不容易想到二分查找。 这题考察我们对算法的熟练程度。 二分查找的特点&#xff1a;数组具有二段性(不一定有序)。 题目中没有数组&#xff0c;我们可以造一个从0到x的数组&#xff0c;然后利用二分查找找到对应的值即可。 3.代码 class S…

Android 布局中@NULL的使用和代码实现方式详解

文章目录 1、使用场景2、示例代码实现2.1、移除背景2.2 、移除文本2.3、移除布局宽度或高度2.4、移除提示文本2.5、移除图像资源 3、综合示例3.1、布局文件 activity_main.xml3.2、主活动文件 MainActivity.java3.4、资源文件3.5、运行结果 4、优点5、缺点6、综合分析6.1、适用…

MySQL数据库基础:使用、架构、SQL语句、存储引擎

文章目录 什么是数据库CS模式 基本使用安装链接服务器服务器、数据库、表关系简单使用数据库在Linux下的体现 MySQL架构连接器层客户端层服务层存储引擎层物理存储层 SQL分类存储引擎 什么是数据库 mysql&#xff1a;数据库服务的客户端mysqld&#xff1a;数据库服务的服务器端…

BGP策略实验(路径属性和选路规则)

要求&#xff1a; 1、使用preval策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4、使用Local Preference策略&#xff0c;确保R1通过R2到达19…

移动云以深度融合之服务,令“大”智慧贯穿云端

移动云助力大模型&#xff0c;开拓创新领未来。 云计算——AI模型的推动器。 当前人工智能技术发展的现状和趋势&#xff0c;以及中国在人工智能领域的发展策略和成就。确实&#xff0c;以 ChatGPT 为代表的大型语言模型在自然语言处理、文本生成、对话系统等领域取得了显著的…

深度学习中的多GPU训练(Pytorch 20)

一 多GPU训练 下面详细介绍如何从零开始并行地训练网络&#xff0c;这里需要运用小批量随机梯度下降算法。后面我还讲介绍如何使用高级API并行训练网络。 我们从一个简单的计算机视觉问题和一个稍稍过时的网络开始。这个网络有多个卷积层和汇聚层&#xff0c;最后可能 有几个…

构建智慧科技园区的系统架构:数字化驱动未来创新

随着科技的不断进步和数字化转型的加速推进&#xff0c;智慧科技园区已成为当今城市发展的重要组成部分。在智慧科技园区建设中&#xff0c;系统架构的设计和实施至关重要&#xff0c;对于提升园区管理效率、优化资源利用、促进创新发展具有重要意义。 一、智慧科技园区系统架构…

数据结构和算法|排序算法系列(三)|插入排序(三路排序函数std::sort)

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.4 插入排序 插入排序的整个过程与手动整理一副牌非常相似。 我们在未排序区间选择一个基准元素&#xff0c;将…

中国人工智能大模型价格战

近年来&#xff0c;人工智能技术迅猛发展&#xff0c;尤其是大模型领域的突破让人们看到了更多的可能性。然而&#xff0c;在这一高科技领域&#xff0c;中美两国的竞争日趋激烈。近日&#xff0c;中国互联网巨头们纷纷启动大模型价格战&#xff0c;引发了广泛关注。这场价格战…

GpuMall智算云:meta-llama/llama3/Llama3-8B-Instruct-WebUI

LLaMA 模型的第三代&#xff0c;是 LLaMA 2 的一个更大和更强的版本。LLaMA 3 拥有 35 亿个参数&#xff0c;训练在更大的文本数据集上GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Llama 3 的推出标志着 Meta 基于 Llama 2 架构推出了四个新…

解决word里加入mathtype公式后行间距变大

1.布局>页面设置>文档网格&#xff0c;网格栏选为无网格 2.固定间距

CentOS Stream 9 vsftpd本地用户设置

1、使用yum指令下载vsftpd yum install vsftpd2、创建wu用户&#xff0c;为ftp组的成员 useradd -g ftp wu3、设置一个密码 echo 1 |passwd --stdin wu4、修改本地用户目录的权限&#xff08;所有者为wu用户&#xff09; chown -R wu /data/wu5、创建本地用户的信息数据存放…

领导VS管理:技术团队掌舵者的双重角色解析

文章目录 引言一、管理1.1 管理的定义1.2 管理的特点1.3 管理的作用 二、领导2.1 领导的定义2.2 领导的特点2.3 领导的作用 三、管理与领导的互补性3.1 互补策略 总结 引言 在科技飞速发展的今天&#xff0c;技术团队作为推动企业创新的核心力量&#xff0c;其管理显得尤为关键…

Quartus Cyclone I II III IVE 器件型号

玩耍了一个 EP2 型号的开发板&#xff0c;发现 安装的quartus13 没有Cyclone II 型号&#xff0c;经过探索发现了是版本不对。 https://www.intel.com/content/www/us/en/software-kit/711920/intel-quartus-ii-subscription-edition-design-software-version-13-0sp1-for-win…

3、xss-labs之lecel3

1、测试 开始页面&#xff0c;传入<script>alert(1)</script>&#xff0c;不出意外没有弹窗 2、按住CTRLU&#xff0c;查看返回的前端代码 3、看后端源码 htmlspecialchars() 是一个 PHP 函数&#xff0c;用于将特殊字符转换为 HTML 实体。比如 & &#xff08…