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

深入理解Redis SDS:高性能字符串的终极设计指南

📍 文章提示

10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现,揭秘SDS如何解决C字符串七大缺陷,通过20+手绘图示与可运行的C代码案例,助你彻底理解二进制安全、自动扩容等核心机制,文末附实战优化技巧!


📖 前言:为什么Redis要重新造轮子?

在数据库开发领域,C语言原生字符串就像一把双刃剑——虽然简单易用,但在处理高并发、大数据量时却频频暴露出内存溢出性能低下等致命问题。Redis作为每秒处理百万级请求的内存数据库,用自主设计的SDS(Simple Dynamic String) 完美解决了这些痛点。本文将带您穿越Redis源码,拆解这个支撑起Redis高性能的核心数据结构,即使您是刚接触C语言的新手,也能通过本文彻底掌握字符串设计的精髓!


一、解剖SDS:像搭积木一样理解数据结构

1.1 核心结构体(Redis 7.0版)

// 针对中等长度字符串的结构定义
struct __attribute__((__packed__)) sdshdr8 {uint8_t len;        // len表示已用长度(1字节)uint8_t alloc;      // alloc表示总容量(1字节)unsigned char flags;// flags为类型标记(1字节)char buf[];         // 柔性数组存储数据
};

内存布局全景图

1.2 智能变体:五种铠甲应对不同场景

结构体适用场景长度上限头大小
sdshdr5微型字符串32字节1字节
sdshdr8短文本255字节3字节
sdshdr16中等文本65,535字节5字节
sdshdr32长文本/小文件4GB9字节
sdshdr64超大文件16EB17字节

 设计哲学用最小内存装最大数据,每个结构体的头部大小根据长度阈值动态选择


二、SDS七大杀招:碾压原生C字符串

2.1 生死较量:C字符串 vs SDS

战场C字符串软肋SDS绝技
长度计算遍历直到\0,O(n)耗时直接读取len属性,O(1)闪电速度
内存管理每次修改都需手动realloc自动扩容+惰性释放,减少80%内存操作
二进制安全\0导致数据截断根据len精确读取,轻松处理图片/ProtoBuf数据
缓冲区溢出strcat可能覆盖相邻数据容量检查+自动扩容,安全卫士
内存分配N次修改触发N次分配预分配策略,次数降至O(logN)
兼容性标准C字符串尾部自动加\0,无缝衔接C函数
性能峰值小数据操作快通过sdshdr5实现极致优化

2.2 核心优势图解 

图示:当追加数据导致空间不足时,SDS会根据策略扩展至2倍或1MB 

🐱 举个栗子(新手秒懂版)
假设现在有一个装小球的袋子:

  1. 初始状态:袋子能装5个球(alloc=5),已装3个(len=3)

  2. 要放入4个新球

    • 需要总空间 = 3+4=7

    • 当前容量5不够 → 触发扩容

  3. 计算新容量

    • 7 < 1024*1024(1MB)

    • 新容量 = 7*2 =14(翻倍扩容)

  4. 换大袋子

    • 新袋子容量14

    • 把旧袋子的3个球倒进去

    • 放入4个新球 → 现在共7个

  5. 最终状态

    • len=7(已用)

    • alloc=14(总容量)

    • 剩余空间=14-7=7(下次可以继续放)

 代码级扩容过程演示

// 假设原始字符串:len=5, alloc=5
sds str = sdsnew("Hello");// 追加10个字符(触发扩容)
str = sdscatlen(str, " World!", 7);/* 详细步骤:
1. 原长度5 + 新增7 = 12
2. 12 > 当前alloc=5 → 需要扩容
3. 12 < 1MB → 新alloc = 12*2 =24
4. 重新分配内存块
5. 复制"Hello"到新内存
6. 追加" World!"
7. 更新len=12, alloc=24
8. 返回新指针
*/
  1. 结构体升级:当长度超过当前类型上限时(比如sdshdr8最大255),会自动换成更大的结构体

  2. 内存对齐:实际分配的空间会做内存对齐优化(比如按8字节对齐)

  3. 安全校验:每次扩容都会校验是否超过SDS_MAX_SIZE(512MB)

结果:SDS版本快3-5倍,因为:

  • C字符串每次追加都要完全复制原有数据

  • SDS平均减少60%的内存分配次数

SDS的自动扩容就像智能行李箱:

  1. 空间预分配:旅行前预估物品量,选大一号箱子

  2. 惰性释放:回家后不急着整理,下次出门可能还用得上

  3. 类型切换:短途用背包,长途换拉杆箱

这种设计哲学在编程中随处可见:

  • Java的ArrayList扩容

  • Go语言的slice底层实现

  • C++ vector的容量管理

理解SDS的设计,就能掌握高性能存储系统的核心秘诀:用空间换时间,用冗余换效率


三、源码级解密:手把手实现SDS

3.1 创建SDS对象(简化版源码)

sds sdsnewlen(const void *init, size_t initlen) {// 根据长度选择合适类型(如sdshdr8)char type = sdsReqType(initlen);int hdrlen = sdsHdrSize(type);// 分配内存:头信息+数据区+结束符struct sdshdr *sh = malloc(hdrlen + initlen + 1);sh->len = initlen;     // 已用长度sh->alloc = initlen;   // 初始容量sh->flags = type;      // 类型标记memcpy(sh->buf, init, initlen); // 拷贝数据sh->buf[initlen] = '\0';       // 兼容C字符串return (char*)sh->buf; // 返回数据区指针
}

关键点解析

  1. sdsReqType() 智能选择最省内存的结构体

  2. 分配空间 = 头大小 + 数据长度 + 1字节(\0)

  3. 返回buf指针使得SDS可直接当C字符串使用


四、实战技巧:45条军规优化SDS性能

4.1 编码选择艺术

  • EMBSTR编码(嵌入式):

    • 适用场景:字符串 ≤44字节

    • 优势:RedisObject与SDS内存连续,减少缓存失效

// 创建embstr编码的字符串
set name "Redis SDS Design"
  • RAW编码

    • 触发条件:字符串 >44字节

    • 特点:独立内存块,支持修改操作

4.2 内存优化三原则

  • 空间预分配:追加操作预留双倍空间(<1MB时)

  • 惰性释放:缩短字符串时不立即回收内存

  • 类型降级:字符串变短后自动切换更小头结构


五、终极总结:SDS设计哲学启示

让我们通过一个完整的示例串联所有知识点:

// 创建初始字符串
sds mystr = sdsnew("Hello");
printf("长度:%d, 容量:%d\n", sdslen(mystr), sdsavail(mystr));
// 输出:长度:5, 容量:5// 追加数据触发扩容
mystr = sdscat(mystr, " World!");
printf("追加后——长度:%d, 容量:%d\n",sdslen(mystr), sdsavail(mystr));
// 输出:长度:12, 容量:20(5*2=10 <12 → 分配12+12=24?)

关键点解释

  1. sdsnew 创建时,长度5选择sdshdr8(alloc=5)

  2. 追加7字节后总长12,触发扩容:

    • 新长度12 <1MB → 分配12*2=24

    • alloc更新为24,len=12

    • avail(剩余空间)=24-12=12

设计启示

  • 空间换时间:通过预分配减少内存操作

  • 分级防御:不同结构体应对不同规模数据

  • 透明兼容:尾部\0设计实现零成本对接C库


🚀 下期预告

《Redis跳跃表深度解析:从链表到多层索引的进化之路》—— 揭秘ZSet底层如何用O(logN)复杂度实现范围查询,手写实现一个生产级跳跃表!

相关文章:

深入理解Redis SDS:高性能字符串的终极设计指南

&#x1f4cd; 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现&#xff0c;揭秘SDS如何解决C字符串七大缺陷&#xff0c;通过20手绘图示与可运行的C代码案例&#xff0c;助你彻底理解二进制安全、自动扩容等核心机制&#xff0c;文末附实战优化技巧&#xff…...

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式&#xff0c;允许外部网络连接 protected-mode no...

【AI平台】n8n入门6:调用MCP服务(非社区节点)

前言 前边用n8n搭建一个MCP服务&#xff0c;现在&#xff0c;用n8n调用其他服务商提供的MCP服务。本文以高德地图服务为例&#xff0c;记录一下操作过程。 实现案例功能 MCP是啥 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropi…...

C++负载均衡远程调用学习之 Dns-Route关系构建

目录 1.LARS-DNS-MYSQL环境搭建 2.LARSDNS-系统整体模块的简单说明 3.Lars-Dns-功能说明 4.Lars-Dns-数据表的创建 5.Lars-Dns-整体功能说明 6.Lars-DnsV0.1-Route类的单例实现 7.Lars-DnsV0.1-Route类的链接数据库方法实现 8.Lars-DnsV0.1-定义存放RouteData关系的map数…...

Linux53 百度网盘运行(下载devtoolset11后仍提示stdc++3.0.29缺失 计划用docker容器隔离运行,计划后续再看)

算了 放弃 都用到docker了 计划先看看系统服务后续再研究吧 百度网盘运行(下载devtoolset11后仍提示stdc3.0.29缺失 计划用docker容器隔离运行 但是由于系统服务未扎实&#xff0c;计划后续再看 重新下了el7的版本 刚才已启动成功 单输入xlock不启动 切换用户也不启动 …...

ASP.NET MVC​ 入门与提高指南八

45. 神经形态计算与 MVC 应用性能革新 45.1 神经形态计算概念 神经形态计算是借鉴生物神经系统的结构和工作原理来设计计算系统。它模仿人脑神经元和突触的工作方式&#xff0c;具备低功耗、高并行性和自适应学习等特性&#xff0c;能在处理复杂感知和认知任务时展现出卓越的…...

Python刷题:流程控制(下)

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 在无人问津的角落里&#xff0c; 默默努力的人独自发光&#xff0c; 孤独是他们奋斗路上的常客&#xff0c; 却也是成就他们的…...

【Bootstrap V4系列】学习入门教程之 组件-徽章(Badge)和面包屑导航(Breadcrumb)

Bootstrap V4系列 学习入门教程之 组件-徽章&#xff08;Badge&#xff09;和面包屑导航&#xff08;Breadcrumb&#xff09; 徽章&#xff08;Badge&#xff09;一、示例二、根据情境改变外观三、胶囊式徽章&#xff08;Pill badges&#xff09;四、链接 面包屑导航&#xff0…...

结合强化学习RL和SFT各自训练优势,让模型边学边练,从而平衡Zero-RL训练中的模仿和探索!!

摘要&#xff1a;最近在大型推理模型&#xff08;LRMs&#xff09;方面的进展表明&#xff0c;通过简单的基于规则的奖励进行强化学习&#xff08;RL&#xff09;&#xff0c;可以涌现出复杂的行为&#xff0c;例如多步推理和自我反思。然而&#xff0c;现有的零强化学习&#…...

ai之paddleOCR 识别PDF python312和paddle版本冲突 GLIBCXX_3.4.30

这里写自定义目录标题 问题一**解决方案****方法 1&#xff1a;使用符号链接将系统库链接到 Conda 环境** **补充说明****验证修复结果** 问题二&#xff1a;**问题根源****解决方案****1. 确认 TensorRT 安装状态****2. 安装 TensorRT 并配置环境变量****3. 验证 TensorRT 与 …...

C++ 单例模式详解

单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 概念解析 单例模式的核心思想是&#xff1a; 限制类的实例化次数&#xff0c;确保在整个应用程序中只有一个实例存在 提供对该实例的全局访问点 控制共享…...

生成器模式(Builder Pattern)

好问题&#xff01;生成器模式&#xff08;Builder Pattern&#xff09;在现实生活和程序开发中非常常见&#xff0c;它适合创建**“一步一步搭建起来的复杂对象”**。 &#x1f9e0; 一句话定义 生成器模式&#xff08;Builder Pattern&#xff09;是一种将复杂对象的构建过程…...

计算机网络八股文--day4 --传输层TCP与UDP

这是面试中最常考到的一层&#xff1a;端到端&#xff08;也就是进程之间&#xff09;的透明数据传输服务&#xff0c;差错控制和流量控制 该层呈上启下&#xff0c;像上面的资源子网提高服务&#xff0c;并使用下面通信子网的服务 端口&#xff0c;用于唯一标识主机上进程的&…...

大型语言模型个性化助手实现

大型语言模型个性化助手实现 目录 大型语言模型个性化助手实现PERSONAMEM,以及用户资料和对话模拟管道7种原位用户查询类型关于大语言模型个性化能力评估的研究大型语言模型(LLMs)已经成为用户在各种任务中的个性化助手,从提供写作支持到提供量身定制的建议或咨询。随着时间…...

步进电机中断函数解释

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函数逐行解释 下面我们对 STM32 项目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数进行逐行解析&#xff0c;帮助初学者理解每一行代码的作用。此函数是在定时器产生更新中断时被调…...

多把锁以及线程死锁问题

在 Java 中&#xff0c;每一个对象都可以作为一把锁&#xff0c;synchronized 通过获取对象头中的锁标志位来实现同步。当一个线程获取到对象的锁后&#xff0c;其他线程就无法再获取该锁&#xff0c;只能等待获取到锁的线程释放锁之后才能继续执行被 synchronized 修饰的代码块…...

Vue 3 Element Plus 浏览器使用例子

Element Plus 是一个基于 Vue 3 的流行开源 UI 库&#xff0c;提供了一系列的组件&#xff0c;帮助开发者快速构建现代化的用户界面。它的设计简洁、现代&#xff0c;包含了许多可定制的组件&#xff0c;如按钮、表格、表单、对话框等&#xff0c;适合用于开发各种 Web 应用。 …...

NoxLucky:个性化动态桌面,打造独一无二的手机体验

在数字时代&#xff0c;手机桌面的个性化设置已经成为许多人表达自我和展示个性的重要方式。今天&#xff0c;我们要介绍的 NoxLucky&#xff0c;就是这样一款功能强大的动态桌面手机应用。它不仅提供了独家的动态壁纸素材库&#xff0c;还支持将抖音、INS等平台的短视频直接设…...

如何在WORD WPS中输入英语音标 批量给英语标注音标

在我国&#xff0c;英语的学习&#xff0c;已经是贯穿小学到大学的课程&#xff0c;英语学习&#xff0c;关键是听说读写&#xff0c;而听说读&#xff0c;都离不开一个字--音&#xff0c;这就涉及到了英语的音标了。音标&#xff08;Phonetics&#xff09;是表示单词发音的一种…...

RUST变量学习笔记

1&#xff0c;作用域概念 捕获环境 2&#xff0c;所有权概念 Rust则是通过所有权和借用来保证内存安全。很多人不理解为啥说Rust是内存安全的&#xff0c;其实就是在默认情况下&#xff0c;你是写不出内存不安全的代码的。 Rust的所有权并不难理解&#xff0c;它有且只有如下…...

n8n工作流自动化平台的实操:本地化高级部署

一、本地高级部署 1.下载 docker pull docker.n8n.io/n8nio/n8n 2.运行 docker volume create n8n_data docker run -dit --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n -e N8N_SECURE_COOKIEfalse -e N8N_RUNNERS_ENABLEDtrue -e N8N_ENFORCE_SETTINGS_FIL…...

【Ansible自动化运维实战:从Playbook到负载均衡指南】

本文是「VagrantVirtualBox虚拟化环境搭建」的续篇&#xff0c;深入探索Ansible在自动化运维中的核心应用&#xff1a; ✅ Ansible核心技能&#xff1a;Playbook编写、角色&#xff08;Roles&#xff09;模块化、标签&#xff08;Tags&#xff09;精准控制 ✅ 实战场景覆盖&a…...

数据赋能(210)——质量管理——可靠性原则

概述 数据可靠性原则确保数据的准确性、完整性、一致性和可信性&#xff0c;是决策和业务活动对数据质量的基本要求。在信息化和数字化快速发展的今天&#xff0c;数据已成为企业的重要资产&#xff0c;数据可靠性直接影响到企业的决策质量和业务活动效果。数据可靠性是数据质…...

二、机器学习中Python变量基础

二、Python变量基础 像C语言和Matlab一样&#xff0c;变量名由字母、数字、下划线组成&#xff08;但不能以数字开头&#xff0c;字母区分大小写&#xff09;变量名不能与内置的函数同名。 根据变量是否可以充当容器&#xff0c;将变量类型分为基本类型和高级类型。 基本变量…...

有机玻璃材质数据采集活性炭吸附气体中二氧化硫实验装置

JGQ112Ⅱ有机玻璃材质数据采集活性炭吸附气体中二氧化硫实验装置 一.实验目的 1.熟悉活性炭吸附剂的特性和在SO2气体净化方面的应用。 2.掌握活性炭吸附法的流程和实验过程中各参数的控制方法。 3.了解主要参数变化对吸附效率的影响。 4.掌握吸附等温线概念和测定方法。 二.技术…...

Javase 基础入门 —— 07 接口

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 概述 接…...

LangChain:重构大语言模型应用开发的范式革命

2022年10月22日&#xff0c;Harrison Chase在GitHub上提交了名为LangChain的开源项目的第一个代码版本。这个看似普通的代码提交&#xff0c;却悄然开启了一场重塑大语言模型&#xff08;LLM&#xff09;应用开发范式的技术革命。彼时&#xff0c;距离ChatGPT引爆全球人工智能浪…...

【现代深度学习技术】现代循环神经网络04:双向循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

重塑数学边界:人工智能如何引领数学研究的新纪元

目录 一、人工智能如何重新定义数学研究的边界 &#xff08;一&#xff09;数学与AI的关系&#xff1a;从基础理论到创新思维的回馈 &#xff08;二&#xff09;AI的创造力&#xff1a;突破传统推理的局限 &#xff08;三&#xff09;AI对数学研究的潜在贡献&#xff1a;创…...

链表的回文结构题解

首先阅读题目&#xff1a; 1.要保证是回文结构 2.他的时间复杂度为O(n)、空间复杂度为O(1) 给出思路: 1.首先利用一个函数找到中间节点 2.利用一个函数逆置中间节点往后的所有节点 3.现在有两个链表&#xff0c;第一个链表取头节点一直到中间节点、第二个链表取头结点到尾…...

xLua笔记

Generate Code干了什么 肉眼可见的&#xff0c;在Asset文件夹生成了XLua/Gen文件夹&#xff0c;里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用&#xff0c;发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…...

【Hive入门】Hive与Spark SQL深度集成:通过Spark ThriftServer高效查询Hive表

目录 引言 1 Spark ThriftServer架构解析 1.1 核心组件与工作原理 1.2 与传统HiveServer2的对比 2 Spark ThriftServer部署指南 2.1 环境准备与启动流程 2.1.1 前置条件检查 2.1.2 服务启动流程 2.2 高可用部署方案 2.2.1 基于ZooKeeper的HA架构 3 性能优化实战 3.…...

快速掌握--cursor

Cursor - The AI Code Editor 官网下载安装 详细教程&#xff1a;cursor 下载安装使用&#xff08;保姆教程&#xff09;_cursor下载-CSDN博客 不知道为啥&#xff0c;第一次给我用的是繁体回答 然后改了一下询问方式 codebase就是告诉ai可以从整个项目中找答案&#xff0…...

Linux之基础开发工具(yum,vim,gcc,g++)

目录 一、软件包管理器 1.1、什么是软件包 1.2、yum具体操作 1.2.1、查看软件包 1.2.2、安装软件 1.2.3、卸载软件 1.2.4、安装源 二、编辑器vim 2.1、vim的基本概念 2.2、vim的基本操作 2.3、vim正常模式命令集 2.4、vim末行模式命令集 2.5、替换模式 2.6、视图…...

【计算机视觉】三维重建: OpenMVS:工业级多视图立体视觉重建框架

深度解析OpenMVS&#xff1a;工业级多视图立体视觉重建框架 技术架构与核心算法1. 系统架构设计2. 核心算法解析稠密点云重建表面重建网格优化 实战全流程指南环境配置硬件要求编译安装&#xff08;Ubuntu&#xff09; 数据处理流程输入准备&#xff08;OpenMVG输出&#xff09…...

C++负载均衡远程调用学习之异步消息任务功能与连接属性

目录 1.LarV0.11-异步消息机制的event_loop增添属性分析 2.LARS 3.LarV0.11异步消息发送机制的实现及测试 4.LarV0.11异步消息任务机制bug修复和效果演示 5.LarV0.12链接参数属性的绑定 1.LarV0.11-异步消息机制的event_loop增添属性分析 ## 4) 事件触发event_loop ​ …...

内存性能测试方法

写于 2022 年 6 月 24 日 内存性能测试方法 - Wesley’s Blog dd方法测试 cat proc/meminfo console:/ # cat proc/meminfo MemTotal: 3858576 kB MemFree: 675328 kB MemAvailable: 1142452 kB Buffers: 65280 kB Cached: 992252 …...

游戏引擎学习第256天:XBox 控制器卡顿和修复 GL Blit 伽玛问题

回顾并为今天定下基调 今天的主要任务是让我们的性能分析工具正常工作&#xff0c;因为昨天已经完成了结构性工作。现在&#xff0c;剩下的工作大部分应该是调试和美化。性能分析工具现在应该已经基本可用了。昨天我们在这个方面取得了很大的进展。 接下来&#xff0c;我们将…...

4.29-4.30 Maven+单元测试

单元测试&#xff1a; BeforeAll在所有的单元测试方法运行之前&#xff0c;运行一次。 AfterAll在所有单元测试方法运行之后&#xff0c;运行一次。 BeforeEach在每个单元测试方法运行之前&#xff0c;都会运行一次 AfterEach在每个单元测试方法运行之后&#xff0c;都会运行…...

Android 端如何监控 ANR、Crash、OOM 等严重问题

在移动互联网时代&#xff0c;Android 应用已经成为我们生活中不可或缺的一部分。从社交聊天到在线购物&#xff0c;从娱乐消遣到办公学习&#xff0c;几乎每个人的手机里都装满了各式各样的应用。然而&#xff0c;作为开发者&#xff0c;咱们得面对一个残酷的现实&#xff1a;…...

Spring Boot 微服务打包为 Docker 镜像并部署到镜像仓库实战案例

案例项目素材可以拉取我github上的&#xff1a; https://github.com/AcademicTECHNERD/SpringCoudEurekaDemo 下面的案例将把我的product-service&#xff08;也就是提供者&#xff09;打包为镜像 执行maven命令&#xff1a; mvn clean package -DskipTests在根目录加一个dock…...

springAop代理责任链模式源码解析

目录 两次匹配 Bean 后置处理器中的匹配 方法调用时的匹配 Bean后置处理器中Advisor匹配流程 方法调用时的匹配 Jdk cglib 小小总结 Advisor 收集与排序 责任链执行过程 两次匹配 Bean 后置处理器中的匹配 在 Bean 初始化过程中&#xff0c;Spring 会通过 Bean 后置…...

ElasticSearch深入解析(九):Object、Nested、Flattened类型

文章目录 一、Object 类型&#xff1a;默认的嵌套对象处理方式核心原理典型场景关键限制 二、Nested 类型&#xff1a;解决嵌套数组的关联查询核心原理典型场景使用示例注意事项 三、Join 类型&#xff1a;跨文档的父子关联核心原理典型场景使用示例注意事项 四、Flattened 类型…...

list的迭代器详讲

1.list的迭代器就是封装了节点指针的类 2.迭代器失效 迭代器失效即迭代器封装的节点指针无效 。因为 list 的底层结构为带头结点的双向循环链表 &#xff0c;因此 在 list 中进行插入时是不会导致 list 的迭代 器失效的&#xff0c;只有在删除时才会失效&#xff0c;并且失效的…...

动态规划之多状态问题1

题目解析&#xff1a; 也就是给一个预约数组&#xff0c;选择一些数字&#xff0c;让其总和最大&#xff0c;但不能选择相邻的两个数字 算法原理&#xff1a; 依旧可以根据经验题目 以dp[i]位置结尾时&#xff0c;巴拉巴拉 根据题目要求补充完整&#xff0c;dp[i]&#xff…...

音视频开源项目列表

音视频开源项目列表 一、多媒体处理框架 通用音视频处理 FFmpeg - https://github.com/FFmpeg/FFmpeg 最强大的音视频处理工具库支持几乎所有格式的编解码提供命令行工具和开发库 GStreamer - https://gitlab.freedesktop.org/gstreamer/gstreamer 跨平台多媒体框架基于管道…...

论微服务架构及其应用

试题四 论微服务架构及其应用 微服务提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终价值。每个服务运行在其独立的进程中&#xff0c;服务与服务间采用轻量级的通信机制互相沟通。在微服务架构中&#xff0c;每个服务…...

Spring Cloud与Service Mesh集成:Istio服务网格实践

文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…...

Day109 | 灵神 | 148.排序链表 | 归并排序

Day109 | 灵神 | 148.排序链表 | 归并排序 148. 排序链表 - 力扣&#xff08;LeetCode&#xff09; 以下是灵神的题解&#xff0c;笔者认为这题只要可以看懂就好了 两种方法&#xff1a;分治和迭代 文章目录 Day109 | 灵神 | 148.排序链表 | 归并排序前置题目方法一&#x…...

[更新完毕]2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析

完整内容请看文章最下面的推广群 分布式能源接入配电网的风险分析 摘要 随着可再生能源渗透率的不断提升&#xff0c;分布式光伏发电在配电网中的大规模接入给传统电力系统运行带来了新的挑战。光伏发电固有的间歇性和波动性特征&#xff0c;加之配电网拓扑结构的复杂性&…...