Redis面试篇笔记(持续更新)

一、redis主从集群

  单节点redis的并发能力是由上限的,要进一步提高redis的并发能力可以搭建主从集群,实现读写分离,一主多从,主节点写数据,从节点读数据

部署redis主从节点的docker-compose文件命令解析

version: "3.2"services:r1:image: rediscontainer_name: r1network_mode: "host"entrypoint: ["redis-server", "--port", "7001"]r2:image: rediscontainer_name: r2network_mode: "host"entrypoint: ["redis-server", "--port", "7002"]r3:image: rediscontainer_name: r3network_mode: "host"entrypoint: ["redis-server", "--port", "7003"]

①network_mode: "host",这里表示网络模式都是host,之前部署容器都没有指定网络模式,所以默认是桥接模式,桥接模式:容器由docker提供的虚拟网桥与宿主机进行连接,这样容器都有一个虚拟的IP地址,这样redis各个实例之间的交互先通过虚拟网桥再到宿主机网卡进行网络转发,这样集群之间的健康监测会出现一定问题。redis官方告诉我们在搭建集群的时候建议使用host模式,这样redis容器相当于直接暴露在宿主机里面,相当于宿主机普通进程,将来部署的时候不用做端口映射,直接使用宿主机端口就行,但是需要改默认端口(见②)

②entrypoint: ["redis-server", "--port", "7003"]:修改容器启动命令

二、redis主从同步原理

1.全量同步

基于replicationID做判断,与主节点不相同则为第一次建立主从连接,是则执行bgsave命令,生成RDB文件,将RDB文件发给slave进行数据同步(slave需要将本地数据清理完)

2.增量同步

master需要将slave缺失 的数据发送给slave,当建立同步连接后master的repl_backlog(操作越多offset值越大)会记录所有写的操作的命令,slave接收到master数同步时slave的repl_backlog(与主节点操作越一致offset值越多)也会记录写操作,当连接断开,再重新连接,两者的repl_backlog的offset值进行比较,比较出缺失的部分再将缺失的部分进行同步

总结:

1.根据什么判断是否第一次来?

当slave节点第一次和master建立主从关系,建立连接的时候或者是连接建立完了后来断开了重连的时候,slave都会去做这个同步,都会发送一个psync请求,而在发请求的同时会携带两个参数分别是replicationId和offset,那么master呢就需要去判断sleep到底是第一次来呢还是断开重连,判断的依据呢就是replicationID

2.判断原理是怎么样

因为呢在没有建立主从关系的情况下,每一个节点都认为自己是master,他们都会有自己唯一的replicationID也就是说大家id是不一样的,而一旦建立主从关系呢,master就会给大家生成一个统一的replicationID,也就是集群内的每个节点大家id都是一样的,所以你第一次来的时候你带这个id,我只需要比较一下,看看咱俩是否一样,如果你不一样,说明咱们之前没有约定过,你肯定是第一次来,他通过这个就能去判断了啊

3.第一次来全量同步

好那如果你第一次来,那说明我上面的数据你都没有嘛,我就要给你做全量同步,不同步的方式就是利用bgsave,把redis内存中的所有数据都写入RDB文件(存在磁盘中),然后把RDB文件发给slave,slave只需要把本地数据删了,然后再把RDB文件加载的内存就实现这个同步了,两者的数据是不是就完全一致了,那从此之后就简单了,后续master会不断接受新的命令,那每当master执行写操作时,就可以把这个写的命令啊传播给slave,slave也去执行

那这样来两者是不是就永远保持一致了,那这是理想情况 

4.断开重连增量同步

那万一在这个过程当中,slave突然出现了宕机或者网络故障,那master发过去的命令slave就没收到,没收到就不会执行,那于是两者之间数据就不会出现差异了,那么这个时候断开重连的时候,slave想要来恢复数据,其实就是想找到自己断开时缺失的那部分命令,那怎么找到呢,我们的master里面会有一个缓冲区(repl_backlog),它会去记录啊,两者建立同步关系之后,所有的master执行过的写命令啊,全部记在里面,并且会有一个offset(repl_backlog写入的数据长度)记录,说我当前命令写到哪里了,就是写的命令这个位置对吧,那么slave呢内部它在接收到master命令的时候,他就执行完了以后他也会有一个offset啊,记住的是我执行了哪一些命令,执行到哪个位置了,那再去做同步的时候,他就可以把offset传过去,master呢哎发现你不是第一次来叫做增量同步嘛,他就可以去比较一下自己的offset和slave,offset两者之间的差异,就是master已经执行了,而slave还没执行的命令,那我只需要把这部分命令呢发给slave,slave执行,咱们是不是又一致了,这就是增量同步

提问

三、主从同步优化

主从同步可以保证主从数据的一致性,非常重要。

可以从以下几个方面来优化Redis主从就集群:

  • 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。

  • Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO压力过大

  • 适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步

  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力

四、搭建哨兵集群

1. 配置文件sentinel.conf内容解析

sentinel announce-ip "192.168.150.101"
sentinel monitor hmaster 192.168.150.101 7001 2
sentinel down-after-milliseconds hmaster 5000
sentinel failover-timeout hmaster 60000

第一行声明哨兵自己的IP,哨兵和之前搭建的主从集群一样在虚拟机用docker部署所有IP地址都是虚拟机的地址

  • sentinel announce-ip "192.168.150.101":声明当前sentinel(哨兵)的ip

  • sentinel monitor hmaster 192.168.150.101 7001 2:指定集群的主节点信息

    • hmaster:主节点名称,自定义,任意写

    • 192.168.150.101 7001:主节点的ip和端口

    • 2:认定master下线时的quorum值,(就是最少哨兵主观认定下线的哨兵个数,一般大于哨兵个数一半)

  • sentinel down-after-milliseconds hmaster 5000:声明master节点超时多久后被标记下线

  • sentinel failover-timeout hmaster 60000:在第一次故障转移失败后多久再次重试

2.选举主节点的依据

一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

  • 首先会判断slave节点与master节点断开时间长短,如果超过down-after-milliseconds * 10则会排除该slave节点

  • 然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举(默认都是1)。

  • 如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高

  • 最后是判断slave节点的run_id大小,越小优先级越高(通过info server可以查看run_id)。

3.提问

五、搭建分片集群

命令解释,这些在redis配置文件里面配置

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

其中有3个我们没见过的参数:

  • cluster-enabled:是否开启集群模式

  • cluster-config-file:集群模式的配置文件名称,无需手动创建,由集群自动维护

  • cluster-node-timeout:集群中节点之间心跳超时时间

  • appendonly yes:数据持久化,默认就有不用理会

散列插槽:

Redis分片集群如何判断某个key应该在哪个实例?

将16384个插槽分配到不同的实例

根据key的有效部分计算哈希值,对16384取余

余数作为插槽,寻找插槽所在实例即可

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISUP协议视频平台EasyCVR私有化视频平台新能源汽车充电停车管理方案的创新与实践

在环保意识提升和能源转型的大背景下,新能源汽车作为低碳出行的选择,正在全球迅速推广。但这种快速增长也引发了充电基础设施短缺和停车秩序混乱等挑战,特别是在城市中心和人口密集的居住区,这些问题更加明显。因此,开…

goland单元测试

一、单元测试的概念 1.1 什么是单元测试,有什么用? 单元测试是针对于函数的测试,用来保证该函数的逻辑正确性。 1.2 单元测试的要求? 1. 单元测试在正式上线之前应该全部自动执行,并且需要保证全部通过 2. 单元测试需…

连接数据库:通过链和代理查询鲜花信息

目录 新的数据库查询范式 实战案例背景信息 创建数据库表 用 Chain 查询数据库 用 Agent 查询数据库 一直以来,在计算机编程和数据库管理领域,所有的操作都需要通过严格、专业且结构化的语法来完成。这就是结构化查询语言(SQL&#xff0…

【c++丨STL】stack和queue的使用及模拟实现

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…

aws上安装ssm-agent

aws-cloudwatch 连接机器 下载ssm-agent aws-ec2 安装ssm-agent aws-linux安装ssm-agent 使用 SSM 代理查找 AMI 预装 先运行:systemctl status amazon-ssm-agent 查看sshm-agent的状态。 然后安装提示,执行 systemctl start amazon-ssm-agent 启动即…

百度世界2024:智能体引领AI应用新纪元

在近日盛大举行的百度世界2024大会上,百度创始人李彦宏以一场题为“文心一言”的精彩演讲,再次将全球科技界的目光聚焦于人工智能(AI)的无限可能。作为一名科技自媒体,我深感这场演讲不仅是对百度AI技术实力的一次全面…

纯血鸿蒙NEXT-组件导航 (Navigation)

Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(NavDestination的子组件…

C语言 | Leetcode C语言题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; #define MAX_STR_LEN 32 typedef unsigned long long ULL;void reverseStr(char * str) {int n strlen(str);for (int l 0, r n-1; l < r; l, r--) {char c str[l];str[l] str[r];str[r] c;} }ULL * getCandidates(const char * n…

docker学习笔记跟常用命令总结

Docker简介 Docker是一个用于构建运行传送应用程序的平台 镜像 将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜 镜像结构 镜像管理命令 命令说明docker pull拉取镜像docker push推送镜像docker images查看本地镜像docker rmi删除本地镜像docker image prune…

MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

MySQL中的InnoDB存储引擎支持四种事务隔离级别&#xff0c;这些级别定义了事务在并发环境中的行为和相互之间的可见性。以下是这四种隔离级别的名称以及它们之间的区别&#xff1a; 读未提交&#xff08;Read Uncommitted&#xff09; 特点&#xff1a;这是最低的隔离级别&…

【力扣热题100】[Java版] 刷题笔记-226. 翻转二叉树

题目:226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 解题思路 二叉树翻转&#xff0c;可以通过递归进行交换。 解题过程 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeN…

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…

【Linux学习】【Ubuntu入门】1-8 ubuntu下压缩与解压缩

1.Linux系统下常用的压缩格式 常用的压缩扩展名&#xff1a;.tar、.tar.bz2、.tar.gz 2.Windows下7ZIP软件安装 Linux系统下很多文件是.bz2&#xff0c;.gz结尾的压缩文件。 3.Linux系统下gzip压缩工具 gzip工具负责压缩和解压缩.gz格式的压缩包。 gzip对单个文件进行…

【Linux】【Shell】Shell 基础与变量

Shell 基础 Shell 基础查看可用的 Shell判断当前 Shell 类型 变量环境变量查看环境变量临时环境变量永久环境变量PATH 变量 自定义变量特殊赋值(双引号、单引号、反撇号) 预定义变量bashrc Shell 基础 Shell 是一个用 C 语言编写的程序&#xff0c;相当于是一个翻译&#xff0c…

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

React可以做全栈开发吗

React可以做全栈开发吗? 答案是肯定的&#xff0c;而且还比较完美 React可以用于全栈开发&#xff0c;以下是具体的介绍&#xff1a; 前端部分 构建用户界面 React是一个用于构建用户界面的JavaScript库&#xff0c;它通过组件化的方式让开发者能够高效地创建交互式的UI。例…

折叠光腔衰荡高反射率测量技术的matlab模拟理论分析

折叠光腔衰荡高反射率测量技术的matlab模拟理论分析 1. 前言2. 光腔模型3. 光腔衰荡过程4. 衰荡时间与反射率的关系5. 测量步骤①. 光腔调节&#xff1a;②. 光腔衰荡测量&#xff1a;③. 计算衰荡时间常数&#xff1a;④. 反射率计算&#xff1a; 6. 实际应用中的调整7. 技术优…

爬取网易云音乐热歌榜:从入门到实战

爬取网易云音乐热歌榜&#xff1a;从入门到实战 前提声明 爬虫应遵守目标网站的robots.txt协议&#xff0c;尊重版权和用户隐私。本代码仅供学习和研究使用&#xff0c;不得用于商业用途。请确保在合法合规的前提下使用本代码。本代码所爬音乐为公开可选择的音乐 目录 引言…

C语言菜鸟入门·关键字·void的用法

目录 1. void关键字 1.1 对函数返回的限定 1.2 对函数参数的限定 1.3 用作指针类型 (void*) 2. 更多关键字 1. void关键字 在 C 语言中&#xff0c;void 是一个关键字&#xff0c;用于表示“无类型”或“没有值”。 void的作用&#xff1a; 对函数返回的限定对函数参…

PlncRNA-HDeep:使用基于两种编码风格的混合深度学习进行植物长非编码 RNA 预测

长链非编码 RNA &#xff08;lncRNAs&#xff09; 在调控生物活动中起着重要作用&#xff0c;其预测对探索生物过程具有重要意义。长短期记忆 &#xff08;LSTM&#xff09; 和卷积神经网络 &#xff08;CNN&#xff09; 可以自动从编码的 RNA 序列中提取和学习抽象信息&#x…