整理好了!2024年最常见 20 道 Redis面试题(四)
上一篇地址:整理好了!2024年最常见 20 道 Redis面试题(三)-CSDN博客
七、Redis 单线程模型是如何工作的?
Redis 是一个基于单线程模型的高性能键值存储数据库。尽管 Redis 操作大多数是单线程执行的,但它依然能够提供极高的性能,这主要得益于以下几个方面:
-
单线程模型:
- Redis 的所有操作都是在一个主线程中顺序执行的,这意味着在任何给定时刻,只有一个操作在处理,减少了多线程编程中的锁和同步开销。
-
事件驱动:
- Redis 使用事件驱动模型来处理客户端的请求和服务器的响应。这种模型允许 Redis 以非阻塞的方式处理多个客户端连接和请求。
-
I/O 多路复用:
- Redis 利用了 I/O 多路复用技术,如 epoll(在 Linux 上)或 kqueue(在 BSD 系统上),这使得 Redis 能够同时监视多个套接字,以确定哪些套接字已经准备好进行读写操作。
- 当一个套接字准备好进行操作时,Redis 会将该操作加入到事件循环中,由主线程顺序执行。
-
高效的数据结构:
- Redis 使用了高效的数据结构来存储键值对,如哈希表、跳表、压缩列表等,这些数据结构能够提供快速的查找、插入和删除操作。
-
内存管理:
- Redis 拥有精细的内存管理策略,包括内存分配、回收、碎片管理等,这有助于提高内存的使用效率。
-
无锁编程:
- 由于 Redis 是单线程的,它避免了多线程编程中常见的锁竞争和死锁问题,从而简化了编程模型并提高了性能。
-
原子操作:
- Redis 的操作是原子性的,这意味着每个操作要么完全执行,要么完全不执行,这有助于保证数据的一致性。
-
命令的优化:
- Redis 的命令执行是高度优化的,许多命令都是直接在内存中执行,无需进行磁盘 I/O 操作。
-
持久化操作的异步性:
- 虽然 Redis 是内存数据库,但它提供了持久化机制,如 RDB 快照和 AOF 日志。这些持久化操作通常是由子进程或后台线程异步执行的,不会阻塞主线程。
-
网络模型:
- Redis 使用自己的网络模型来处理客户端连接和请求,这使得它能够有效地管理大量并发连接。
-
Pipelining:
- 客户端可以发送多个命令到 Redis,而不需要等待每个命令的响应,这种技术称为 Pipelining,可以显著提高客户端和服务器之间的通信效率。
-
Lua 脚本:
- Redis 支持 Lua 脚本,允许用户在服务器端执行 Lua 脚本来执行复杂的操作,这些操作也是单线程执行的。
尽管 Redis 是单线程的,但通过上述机制,它能够提供非常高的性能和可伸缩性。然而,单线程模型也意味着 Redis 的性能受限于单个 CPU 核心的处理能力。对于需要高并发写入操作的应用,Redis 可能不是最佳选择,但对于读多写少的场景,Redis 可以提供非常出色的性能。
八、Redis 的主从复制是如何工作的?
Redis 的主从复制是一种高可用性解决方案,它允许多个 Redis 服务器(称为从服务器或副本)复制主服务器(称为主服务器或领导者)的数据。以下是 Redis 主从复制工作的详细过程:
-
复制的初始化:
- 主从复制开始于从服务器向主服务器发送
SLAVEOF命令,指定主服务器的地址和端口。 - 从服务器随后建立与主服务器的连接,并发送
PSYNC命令请求数据同步。
- 主从复制开始于从服务器向主服务器发送
-
数据同步:
- 如果从服务器是第一次复制,或者无法提供有效的复制偏移量,主服务器会执行一个 RDB 快照,并将整个数据库的数据发送给从服务器。
- 如果从服务器已经复制过部分数据,
PSYNC命令会尝试进行部分重同步(如果主服务器支持的话)。这可以减少所需的数据传输量。
-
RDB 快照传输:
- 主服务器生成 RDB 快照,并将该快照文件发送给从服务器。
- 从服务器接收 RDB 文件,并将其加载到内存中,从而复制主服务器的数据。
-
命令传播:
- 在 RDB 快照同步完成后,主服务器继续将所有写操作命令发送给从服务器。
- 从服务器接收这些命令,并在本地执行,以保持数据的一致性。
-
复制偏移量:
- 从服务器会记录它已经接收和执行的命令的数量,这个偏移量存储在从服务器的复制偏移量中。
- 如果从服务器断开连接并重新连接,它会使用这个偏移量来请求从主服务器同步丢失的数据。
-
断线重连:
- 如果从服务器与主服务器之间的连接断开,从服务器会尝试自动重新连接。
- 重连后,从服务器会发送
PSYNC命令,尝试进行部分重同步,如果可能的话。
-
主服务器的故障转移:
- 在某些配置中,如果主服务器宕机,从服务器可以被提升为新的主服务器,这个过程称为故障转移或故障切换。
- 这通常需要手动干预或使用自动化工具,如 Redis Sentinel 或 Redis Cluster。
-
读写分离:
- 在主从复制架构中,通常所有的写操作都在主服务器上执行,而读操作可以在从服务器上执行,以提高性能和可伸缩性。
-
配置和优化:
- 复制的配置和优化包括设置合适的
repl-ping-slave-period和repl-timeout参数,以优化复制的稳定性和性能。 - 还可以配置从服务器的
slave-read-only参数,确保从服务器不接受写操作。
- 复制的配置和优化包括设置合适的
-
监控和日志:
- Redis 提供了多种监控复制状态的命令,如
INFO replication,以及日志记录功能,帮助管理员监控和诊断复制问题。
- Redis 提供了多种监控复制状态的命令,如
通过主从复制,Redis 可以提供数据的高可用性和读写分离,从而提高应用程序的性能和可靠性。然而,主从复制也带来了一些复杂性,如数据同步延迟、故障转移和数据一致性问题,需要在实际部署中仔细考虑和管理。
相关文章:
整理好了!2024年最常见 20 道 Redis面试题(四)
上一篇地址:整理好了!2024年最常见 20 道 Redis面试题(三)-CSDN博客 七、Redis 单线程模型是如何工作的? Redis 是一个基于单线程模型的高性能键值存储数据库。尽管 Redis 操作大多数是单线程执行的,但它…...
sudo pip3 install rpi_ws281x error: externally-managed-environment
报错 error: externally-managed-environment piraspberrypi:~ $ sudo pip3 install rpi_ws281x error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz i…...
day08-Java常用API
day08——Java常用API 一、今日内容介绍、API概述 各位同学,我们前面已经学习了面向对象编程,使用面向编程这个套路,我们需要自己写类,然后创建对象来解决问题。但是在以后的实际开发中,更多的时候,我们是…...
设计模式--建造者模式
建造者模式是一种创建型设计模式,它允许用户通过一步一步地构建对象来创建复杂的对象。这种模式在许多应用场景中非常有用,例如在创建具有多个可选参数的对象、构建具有多种配置的对象以及生成具有多个部分的对象时。 应用场景 创建具有多个可选参数的…...
运行时间比较
subprocess.run() 函数参数的含义: shell_command:这是要执行的命令。它可以是一个字符串,也可以是一个包含命令和参数的列表。例如,“ls -l” 或 [“ls”, “-l”]。shellTrue:这是一个布尔值参数,指示是…...
【系统架构师】-案例篇(十四)数据库与分布式
1、规范化 不满足3NF,导致的存储异常 原关系模式 航班(航班编号,航空公司,起飞地,起飞时间,目的地,到达时间,剩余票数,票价) 代理商(代理商编号…...
Golang实现递归复制文件夹
代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…...
【漏洞复现】用友U8 CRM uploadfile 文件上传致RCE漏洞
0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 uploadfle.php 文件存在任意文件上传漏洞,未经身份验证的攻击者通过漏洞上传…...
键盘盲打是练出来的
键盘盲打是练出来的,那该如何练习呢?很简单,看着屏幕提示跟着练。屏幕上哪里有提示呢?请看我的截屏: 截屏下方有8个带字母的方块按钮,这个就是提示,也就是我们常说的8个基准键位,我…...
构建sqli-labs学习环境与掌握SQL注入技术教程
根据提供的文档内容,以下是关于安装sqli-labs学习环境和SQLI-LABS教学的详细步骤和知识点: 安装sqli-labs学习环境 环境准备 操作系统:CentOS 7.6主机名:xuegod63IP地址:192.168.1.63 关闭防火墙和SELinux 禁用并…...
力扣HOT100 - 1143. 最长公共子序列
解题思路: 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…...
【贪心算法题目】
1. 柠檬水找零 这一个题目是一个比较简单的模拟算法,只需要根据手里的钱进行找零即可,对于贪心的这一点,主要是在20元钱找零的情况下,此时会出现两种情况:10 5 的组合 和 5 5 5 的组合,根据找零的特点&a…...
yarn常用命令
Yarn 是一个快速、可靠且安全的依赖管理工具,用于替代 npm。以下是一些常用的 Yarn 命令,用于不同的包管理和项目依赖安装场景: 初始化一个新的项目 yarn init这个命令会引导你创建一个 package.json 文件。 安装依赖 yarn add [package]…...
nginx+nginx-http-flv-module在Linux服务器搭建
需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module ,但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开…...
多线程(八)
一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…...
投骰子——(随机游戏的控制)
精华点在于:利用封装,函数之间的良好调用,从而清晰明了的解决问题。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> # include<stdlib.h> # include<time.h> # include"math.h" # define ARR_LEN 10 # d…...
找出最长等值子数组
问题 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。 从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。 子数组 是数…...
Go 切片常用操作与使用技巧
1.什么是切片 在 Go 语言中的切片(slice)是一种灵活的动态数组,它可以自动扩展和收缩,是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象。它会生成一…...
2024 中青杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024 长三角高校数学建模竞赛(A题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过…...
开源与闭源:AI模型发展的双重路径之争
前言 随着人工智能(AI)技术的飞速发展,AI模型的应用已经渗透到各行各业,从医疗、金融到制造、教育,无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时,绕不过“开源”和“闭源”两条…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
