官网下载zip:
在这里插入图片描述
本文即是文件创建时间时候的版本~

文章目录

    • 目录结构
      • /src
        • int main()
        • 服务端 server
          • 足够的熵值 entropy
          • umask掩码
          • 系统初始化*
          • 重启机制:保存执行数据 以便后续重启服务
          • 哨兵模式 sentinel
          • rdb aof
          • 解析命令行参数
          • 声明实现的位置

目录结构

目录/文件说明
src/✅核心源代码目录,大多数逻辑都在这里
deps/依赖的第三方库,如 jemalloc、hiredis
tests/单元测试和集成测试代码
redis.conf默认的 Redis 配置文件
Makefile编译入口,可通过 make 编译 redis-server 等
README.md项目简介
utils/一些工具脚本,比如 create-cluster

/src

int main()

在这里插入图片描述

程序执行命令功能
redis-server./src/redis-server启动 Redis 【服务端】
redis-cli./src/redis-cli连接 Redis 的【命令行客户端】
redis-benchmark./src/redis-benchmark对 Redis 做压力测试
setproctitle开发/调试辅助工具设置 Linux 进程名用的工具模块
服务端 server

从上往下读读注释:

足够的熵值 entropy

在这里插入图片描述
为了确保获取到的随机数具有足够的熵值(entropy),我们不能仅依赖 time() 和 getpid()。

因为在 容器(如 Docker) 中运行多个 Redis 实例时:

  • 它们的 time()(当前时间戳 - 秒级)
  • 和 getpid()(进程号)

可能是一样的!
导致它们生成的随机数是一样的。

微秒tv_usec 几乎不可能重复 —— 一秒中可以有 100 万 个不同的微秒值(0~999999)

	struct timeval tv;.../* To achieve entropy, in case of containers, their time() and getpid() can* be the same. But value of tv_usec is fast enough to make the difference */gettimeofday(&tv,NULL); //获取微秒级时间戳srand(time(NULL)^getpid()^tv.tv_usec); //种随机数种子srandom(time(NULL)^getpid()^tv.tv_usec);init_genrand64(((long long) tv.tv_sec * 1000000 + tv.tv_usec) ^ getpid()); //【初始化 Redis 自己实现的 Mersenne Twister 64 位随机数发生器】【梅森旋转算法】crc64_init(); //初始化 【CRC64 校验表】;Redis 中使用 CRC64 进行数据校验
umask掩码

在这里插入图片描述

存储 umask 值。因为 umask(2) 只提供设置并返回旧值的接口,
所以我们必须先设置一次再恢复它。
我们在启动早期执行这一步,是为了避免与可能正在创建文件或目录的线程之间产生竞态条件(race condition)。

umask 是 Unix 系统下用于设置默认新建文件权限的掩码(默认文件0666/目录0777,当 umask = 0022时(2 = 010),文件0644/目录0755)
(0777二进制: 0 111 111 111)

没有纯获取 umask 的接口,而 set 时可以返回之前的值
所以可以通过 umask(umask(0)) 的方式获取~

系统初始化*

在这里插入图片描述
ASAP:as soon as possible 尽快
sentinel mode: 哨兵模式 后面才初始化

strrchr() C标准库函数【string reverse chracter】:从右向左查找字符串中最后一次出现 ‘/’ 的位置,返回该位置的指针。
这里只想要执行的文件名

	uint8_t hashseed[16];getRandomBytes(hashseed,sizeof(hashseed));//Redis 自己的随机字节生成函数dictSetHashFunctionSeed(hashseed);// 初始化全局字典等结构中的哈希行为char *exec_name = strrchr(argv[0], '/');if (exec_name == NULL) exec_name = argv[0];server.sentinel_mode = checkForSentinelMode(argc,argv, exec_name);// 判断是否是 sentinel 模式,这是 Redis 支持的一种高可用模式。initServerConfig();// 初始化服务配置(比如监听端口、最大连接数、缓存设置等)//初始化 ACL(访问控制列表)子系统 【Redis 的权限控制系统】ACLInit(); /* The ACL subsystem must be initialized ASAP because thebasic networking code and client creation depends on it. */ // 后面的网络服务和客户端创建依赖它moduleInitModulesSystem();// 初始化模块管理框架 // Redis 支持以插件形式加载模块,比如 RedisGraph、RedisAI 等connTypeInitialize();// 初始化连接类型  // 用于注册不同类型的连接(TCP、Unix socket、TLS 等)
重启机制:保存执行数据 以便后续重启服务

在这里插入图片描述
“将可执行文件路径和参数安全地保存下来,以便之后能够重新启动服务器。”

    /* Store the executable path and arguments in a safe place in order* to be able to restart the server later. */server.executable = getAbsolutePath(argv[0]); // 获取当前进程的可执行文件的绝对路径:argv[0] 通常是执行程序的名称或者路径server.exec_argv = zmalloc(sizeof(char*)*(argc+1)); // 为参数数组 exec_argv 分配内存server.exec_argv[argc] = NULL;for (j = 0; j < argc; j++) server.exec_argv[j] = zstrdup(argv[j]); // 将原始 argv 中的参数逐个复制(深拷贝)到 server.exec_argv 中

redis 的优雅重启机制:一旦重启时,可以直接调用 execv(server.executable, server.exec_argv) 实现“就地重启”。

哨兵模式 sentinel

在这里插入图片描述
我们现在就需要初始化 Sentinel,
因为在 Sentinel 模式下解析配置文件的过程中,会将需要监控的主节点信息填充到 Sentinel 的数据结构中。(所以new出来’数据结构’)

    /* We need to init sentinel right now as parsing the configuration file* in sentinel mode will have the effect of populating the sentinel* data structures with master nodes to monitor. */if (server.sentinel_mode) {	// 检查当前 Redis 是否以哨兵模式运行(通常通过命令行参数或配置文件设置 --sentinel)initSentinelConfig(); // 初始化哨兵【配置解析】相关内容。[哨兵配置文件会描述要监控的主节点(master),以及配置项如 down-after-milliseconds、quorum 等。]initSentinel(); // 初始化哨兵运行时的核心数据结构(如监控的 master 列表等)。(结合上面的 initSentinelConfig(),最终目的是:在加载配置文件时,把其中的哨兵监控项正确写入内存结构,准备后续运行。)}

哨兵模式介绍:
哨兵模式下,Redis 的行为和普通的主从模式不同,它主要用于自动:

  1. 监控(Monitoring):持续【检查】主节点和从节点是否可用;(哨兵模式是基于主从结构进行监控和故障转移的。)
  2. 通知(Notification):当某个节点不可达时,【通知】管理员或其他系统;
    (哨兵周期性地通过 PING 命令检查主从节点的可用性。无响应就判断为节点“主观下线” subjectively down)
  3. 自动故障转移(Automatic Failover):主节点宕机后,自动将某个从节点【升级】为主节点;
    (如果大多数哨兵都认为某个主节点不可达,称为“客观下线”(objectively down))(选举后,哨兵更新集群配置,并通知客户端。)
  4. 服务发现(Configuration Provider):客户端可以通过哨兵【获取】当前的主节点地址。

哨兵的部署架构
通常使用【多个哨兵(>=3 个)组成一个哨兵集群 + 【一个主节点(master)】 + 【多个从节点(slave)】:

sentinel.conf 中配置以告知哨兵谁是主节点:

sentinel monitor <master-name> <ip> <port> <quorum><master-name>:主节点的逻辑名称,客户端通过这个名字向 Sentinel 查询主节点地址
<quorum>:判定主节点下线需要多少哨兵确认

主从模式并不一定必须带上哨兵,但哨兵是 Redis 官方推荐的高可用方案之一。
主从模式本身没有自动故障转移能力。

rdb aof

在这里插入图片描述
检查是否需要以 redis-check-rdb 或 redis-check-aof 模式启动。※
我们只是执行对应程序的主函数。
但是这两个程序是 Redis 可执行文件的一部分,
因此可以方便地在加载出错时执行 RDB 文件检查。

就是看执不执行,如果执行,就进入相应的“检查模式”,专门去检测 RDB 或 AOF 文件有没有问题。【官方的检查工具】

    /* Check if we need to start in redis-check-rdb/aof mode. We just execute* the program main. However the program is part of the Redis executable* so that we can easily execute an RDB check on loading errors. */if (strstr(exec_name,"redis-check-rdb") != NULL)redis_check_rdb_main(argc,argv,NULL);else if (strstr(exec_name,"redis-check-aof") != NULL)redis_check_aof_main(argc,argv);

strstr(str1, str2) (string.h) 检查str1里有没有str2

解析命令行参数
声明实现的位置

zsetAdd 等,声明在server.h,实现不在server.c,而是在 t_zset.c :
在这里插入图片描述

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

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

相关文章

《C++》面向对象编程--类(下)

文章目录一、赋值运算符重载1.1定义1.2基本规则1.3为什么需要运算符重载&#xff1f;1.4示例&#xff1a;二、前置和后置区别2.1前置的实现与特点2.2后置的实现与特点2.3核心区别三、const四、取地址及const取地址操作符重载4.1定义4.2语法4.3注意事项一、赋值运算符重载 1.1定…

EasyExcel 模板导出数据 + 自定义策略(合并单元格)

需求&#xff1a;数据库里的主表明细表&#xff0c;联查出数据并导出Excel&#xff0c;合并主表数据的单元格。代码&#xff1a;controllerPostMapping("export")ApiOperation(value "导出数据")protected void export(ApiParam Valid RequestBody NewWms…

股指期权可以随时平仓吗?

本文主要介绍股指期权可以随时平仓吗&#xff1f;股指期权是否可以随时平仓&#xff0c;需结合交易规则、合约状态及市场流动性综合判断&#xff0c;具体如下。股指期权可以随时平仓吗&#xff1f;一、正常交易时间内的平仓规则在交易日的交易时段内&#xff08;如国内上证50ET…

成品电池综合测试仪:保障电池品质与安全的核心工具|深圳鑫达能

随着新能源汽车、储能系统、消费电子等领域的快速发展&#xff0c;电池作为核心能源组件&#xff0c;其性能与安全性直接关系到产品的整体质量与用户体验。成品电池综合测试仪作为电池生产与质检环节的关键设备&#xff0c;通过模拟真实使用场景&#xff0c;对电池的电气性能、…

智慧工厂网络升级:新型 SD-WAN 技术架构与应用解析

1. 智慧工厂对网络的核心需求智慧工厂的网络需求高度复杂&#xff0c;主要体现在以下几个方面&#xff1a;高可靠性与低延迟工厂中的生产执行系统&#xff08;MES&#xff09;、设备监控系统&#xff08;如 PLC/SCADA&#xff09;、产品生命周期管理系统&#xff08;PLM&#x…

在 Windows 使用 Nginx/HAProxy 实现负载均衡

在本实验中&#xff0c;我们将在 Windows 系统 上使用 Python 编写一个 TCP 服务器&#xff0c;并启动两个服务实例。然后使用 Nginx 或 HAProxy 作为负载均衡器&#xff0c;将来自多个客户端的请求分发到这两个服务实例上&#xff0c;验证负载均衡效果。 &#x1f9e9; 环境准…

【物联网】基于树莓派的物联网开发【17】——物联网通信协议MQTT基础知识

使用背景 MQTT最初是为了解决物联网&#xff08;IoT&#xff09;领域设备之间的低带宽、高延迟、不稳定网络连接等问题而设计的。 场景介绍 广泛应用物联网领域&#xff0c;数据实时传输&#xff0c;连接各种智能设备和应用的关键桥梁 MQTT简介和概述 MQTT&#xff08;Message …

【qml-3】qml与c++交互第二次尝试(类型方式)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例方式&#xff09; 【qml-2】尝试一个有模式的qml弹窗-CSDN博客 【qml-3】qml与c交互第二次尝试&#xff08;类型方式&#xff09; 还是qml学习笔记。 这次搁置太久了。其实不太会&#xff0c;还是以教程为主…

输电线路观冰精灵在线监测装置:科技赋能电网安全的新利器

一、技术架构与工作原理输电线路观冰精灵在线监测装置&#xff08;简称“观冰精灵”&#xff09;是一款集成多源感知、智能分析、远程通信于一体的专业化覆冰监测设备。其核心功能通过以下技术路径实现&#xff1a;1. 数据采集模块视觉识别系统&#xff1a;搭载工业级夜视摄像机…

Ubuntu22 上,用C++ gSoap 创建一个简单的webservice

创建calc.h// calc.h // gSOAP 服务定义 int ns__add(double a, double b, double &result); int ns__subtract(double a, double b, double &result);创建my_server.cpp#include "soapService.h" #include "ns.nsmap" class MyService : public S…

Java(LinkedList和ArrayList底层分析)

LinkedList全面说明:LinkedList底层操作机制:LinkedList的方法:add():增加节点对象remove():删除一个节点对象(默认删除第一个节点对象)set():修改一个节点对象get():得到一个节点对象LinkedList的遍历:增强for循环迭代器普通for循化LinkedList的源码解读:增加源码:1. LinkedLi…

开源项目XBuilder的user逻辑

stores \ userquery-keys.ts 统一管理Vue Query&#xff08;TanStack Query的Vue适配版本&#xff09;缓存键&#xff0c;在下面的文件中复用index.ts 入口文件&#xff0c;统一用户信息查询signed-in.ts 登录状态管理、认证逻辑在用户登录后&#xff0c;系统颁发一个令牌&…

第十五章 SEO的简单免费工具

SEO的基础工具和检测 前文中主要是讲一些SEO的网站基本功&#xff0c;而在这一章那&#xff0c;会讲到一些非常基本的工具&#xff0c;主要是关于&#xff1a;网站的流量、停留时长、关键词密度、内容、以及Google的站长工具。 Google Search Console Google Search Console这是…

SSL 证书与 HTTPS 的关系:一文理清核心关联

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;和 SSL 证书&#xff08;Secure Sockets Layer Certificate&#xff09;是网络安全的两大基石&#xff0c;它们共同保障了互联网通信的安全性和可信度。以下从定义、功能、关系及实际应用层面进行解析&#xf…

使用Jmeter参数化实现接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文记录如何使用Jmeter参数化&#xff08;csv)实现接口自动化——测试Token不同入参情况下&#xff0c;接口请求能够返回正确的结果1. 首先需要使用Jmeter获取一个…

X-plore File Manager v4.34.02 修改版:安卓设备上的全能文件管理器

在使用安卓设备时&#xff0c;文件管理是日常操作中不可或缺的一部分。X-plore File Manager 作为一款功能强大的文件管理器&#xff0c;凭借其丰富的功能和便捷的操作&#xff0c;成为安卓用户管理文件的首选工具之一。最新版 v4.34.02 修改版更是解锁了更多高级功能&#xff…

React+threejs两种3D多场景渲染方案

在现代 Web 开发中&#xff0c;3D 可视化需求日益增长&#xff0c;特别是在 React 生态系统中实现多 3D 场景的展示与交互。本文通过对比两种实现方案&#xff0c;探讨 React 中构建多 3D 场景的最佳实践&#xff0c;分析它们的技术特点、性能表现和适用场景。方案一&#xff1…

React性能优化终极指南:memo、useCallback、useMemo全解析

掌握 React.memo、useCallback、useMemo 的正确使用姿势&#xff0c;让你的 React 应用性能飞起来&#xff01; &#x1f3af; React.memo 作用 React.memo 是一个高阶组件&#xff0c;用于函数组件&#xff0c;通过浅比较 props 的变化来决定是否重新渲染。如果 props 没有变…

借助 VR 消防技术开展应急演练,检验完善应急预案​

应急演练是企业应对火灾事故的重要手段&#xff0c;而 VR 消防技术的应用&#xff0c;为应急演练带来了全新的体验和更高的效率。VR 消防技术通过虚拟现实技术模拟逼真的火灾场景&#xff0c;让参与者能够身临其境地感受火灾发生时的紧张氛围。某知名物流企业&#xff0c;仓库众…

【电赛学习笔记】MaxiCAM 项目实践——二维云台追踪指定目标

前言 本文是对视觉模块MaixCam实现二维云台人脸跟踪_哔哩哔哩_bilibili大佬的项目实践整理与拓展&#xff0c;侵权即删。 单路舵机基本控制 #导入必要模块 from maix import pwm, time , pinmap#定义全局变量&#xff0c;设初值 SERVO_FREQ 50 #主频 SERVO_MIN_DUT…