当前位置: 首页 > news >正文

整理好了!2024年最常见 20 道 Redis面试题(四)

上一篇地址:整理好了!2024年最常见 20 道 Redis面试题(三)-CSDN博客

七、Redis 单线程模型是如何工作的?

Redis 是一个基于单线程模型的高性能键值存储数据库。尽管 Redis 操作大多数是单线程执行的,但它依然能够提供极高的性能,这主要得益于以下几个方面:

  1. 单线程模型

    • Redis 的所有操作都是在一个主线程中顺序执行的,这意味着在任何给定时刻,只有一个操作在处理,减少了多线程编程中的锁和同步开销。
  2. 事件驱动

    • Redis 使用事件驱动模型来处理客户端的请求和服务器的响应。这种模型允许 Redis 以非阻塞的方式处理多个客户端连接和请求。
  3. I/O 多路复用

    • Redis 利用了 I/O 多路复用技术,如 epoll(在 Linux 上)或 kqueue(在 BSD 系统上),这使得 Redis 能够同时监视多个套接字,以确定哪些套接字已经准备好进行读写操作。
    • 当一个套接字准备好进行操作时,Redis 会将该操作加入到事件循环中,由主线程顺序执行。
  4. 高效的数据结构

    • Redis 使用了高效的数据结构来存储键值对,如哈希表、跳表、压缩列表等,这些数据结构能够提供快速的查找、插入和删除操作。
  5. 内存管理

    • Redis 拥有精细的内存管理策略,包括内存分配、回收、碎片管理等,这有助于提高内存的使用效率。
  6. 无锁编程

    • 由于 Redis 是单线程的,它避免了多线程编程中常见的锁竞争和死锁问题,从而简化了编程模型并提高了性能。
  7. 原子操作

    • Redis 的操作是原子性的,这意味着每个操作要么完全执行,要么完全不执行,这有助于保证数据的一致性。
  8. 命令的优化

    • Redis 的命令执行是高度优化的,许多命令都是直接在内存中执行,无需进行磁盘 I/O 操作。
  9. 持久化操作的异步性

    • 虽然 Redis 是内存数据库,但它提供了持久化机制,如 RDB 快照和 AOF 日志。这些持久化操作通常是由子进程或后台线程异步执行的,不会阻塞主线程。
  10. 网络模型

    • Redis 使用自己的网络模型来处理客户端连接和请求,这使得它能够有效地管理大量并发连接。
  11. Pipelining

    • 客户端可以发送多个命令到 Redis,而不需要等待每个命令的响应,这种技术称为 Pipelining,可以显著提高客户端和服务器之间的通信效率。
  12. Lua 脚本

    • Redis 支持 Lua 脚本,允许用户在服务器端执行 Lua 脚本来执行复杂的操作,这些操作也是单线程执行的。

尽管 Redis 是单线程的,但通过上述机制,它能够提供非常高的性能和可伸缩性。然而,单线程模型也意味着 Redis 的性能受限于单个 CPU 核心的处理能力。对于需要高并发写入操作的应用,Redis 可能不是最佳选择,但对于读多写少的场景,Redis 可以提供非常出色的性能。

八、Redis 的主从复制是如何工作的?

Redis 的主从复制是一种高可用性解决方案,它允许多个 Redis 服务器(称为从服务器或副本)复制主服务器(称为主服务器或领导者)的数据。以下是 Redis 主从复制工作的详细过程:

  1. 复制的初始化

    • 主从复制开始于从服务器向主服务器发送 SLAVEOF 命令,指定主服务器的地址和端口。
    • 从服务器随后建立与主服务器的连接,并发送 PSYNC 命令请求数据同步。
  2. 数据同步

    • 如果从服务器是第一次复制,或者无法提供有效的复制偏移量,主服务器会执行一个 RDB 快照,并将整个数据库的数据发送给从服务器。
    • 如果从服务器已经复制过部分数据,PSYNC 命令会尝试进行部分重同步(如果主服务器支持的话)。这可以减少所需的数据传输量。
  3. RDB 快照传输

    • 主服务器生成 RDB 快照,并将该快照文件发送给从服务器。
    • 从服务器接收 RDB 文件,并将其加载到内存中,从而复制主服务器的数据。
  4. 命令传播

    • 在 RDB 快照同步完成后,主服务器继续将所有写操作命令发送给从服务器。
    • 从服务器接收这些命令,并在本地执行,以保持数据的一致性。
  5. 复制偏移量

    • 从服务器会记录它已经接收和执行的命令的数量,这个偏移量存储在从服务器的复制偏移量中。
    • 如果从服务器断开连接并重新连接,它会使用这个偏移量来请求从主服务器同步丢失的数据。
  6. 断线重连

    • 如果从服务器与主服务器之间的连接断开,从服务器会尝试自动重新连接。
    • 重连后,从服务器会发送 PSYNC 命令,尝试进行部分重同步,如果可能的话。
  7. 主服务器的故障转移

    • 在某些配置中,如果主服务器宕机,从服务器可以被提升为新的主服务器,这个过程称为故障转移或故障切换。
    • 这通常需要手动干预或使用自动化工具,如 Redis Sentinel 或 Redis Cluster。
  8. 读写分离

    • 在主从复制架构中,通常所有的写操作都在主服务器上执行,而读操作可以在从服务器上执行,以提高性能和可伸缩性。
  9. 配置和优化

    • 复制的配置和优化包括设置合适的 repl-ping-slave-period 和 repl-timeout 参数,以优化复制的稳定性和性能。
    • 还可以配置从服务器的 slave-read-only 参数,确保从服务器不接受写操作。
  10. 监控和日志

    • Redis 提供了多种监控复制状态的命令,如 INFO replication,以及日志记录功能,帮助管理员监控和诊断复制问题。

通过主从复制,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. 最长公共子序列

解题思路&#xff1a; 动态规划 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. 柠檬水找零 这一个题目是一个比较简单的模拟算法&#xff0c;只需要根据手里的钱进行找零即可&#xff0c;对于贪心的这一点&#xff0c;主要是在20元钱找零的情况下&#xff0c;此时会出现两种情况&#xff1a;10 5 的组合 和 5 5 5 的组合&#xff0c;根据找零的特点&a…...

yarn常用命令

Yarn 是一个快速、可靠且安全的依赖管理工具&#xff0c;用于替代 npm。以下是一些常用的 Yarn 命令&#xff0c;用于不同的包管理和项目依赖安装场景&#xff1a; 初始化一个新的项目 yarn init这个命令会引导你创建一个 package.json 文件。 安装依赖 yarn add [package]…...

nginx+nginx-http-flv-module在Linux服务器搭建

需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module &#xff0c;但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的&#xff0c;前者拥有的功能后者都有&#xff0c;后者是国内的开发开…...

多线程(八)

一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…...

投骰子——(随机游戏的控制)

精华点在于&#xff1a;利用封装&#xff0c;函数之间的良好调用&#xff0c;从而清晰明了的解决问题。 #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 。 如果子数组中所有元素都相等&#xff0c;则认为子数组是一个 等值子数组 。注意&#xff0c;空数组是 等值子数组 。 从 nums 中删除最多 k 个元素后&#xff0c;返回可能的最长等值子数组的长度。 子数组 是数…...

Go 切片常用操作与使用技巧

1.什么是切片 在 Go 语言中的切片&#xff08;slice&#xff09;是一种灵活的动态数组&#xff0c;它可以自动扩展和收缩&#xff0c;是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的&#xff0c;它的底层是数组&#xff0c;可以理解为对底层数组的抽象。它会生成一…...

2024 中青杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 长三角高校数学建模竞赛&#xff08;A题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过…...

开源与闭源:AI模型发展的双重路径之争

前言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI模型的应用已经渗透到各行各业&#xff0c;从医疗、金融到制造、教育&#xff0c;无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时&#xff0c;绕不过“开源”和“闭源”两条…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...