整理好了!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模型“好不好”“有没有发展”时,绕不过“开源”和“闭源”两条…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
