C语言指针深入详解(五):回调函数、qsort函数
目录
一、回调函数
1、使用回调函数改造前
2、使用回到函数改造后
二、qsort使用举例
1、使用qsort函数排序整型数据
2、使用qsort排序结构数据
三、qsort函数模拟实现
结语
🔥个人主页:艾莉丝努力练剑
🍓专栏传送门:《C语言》
🍉学习方向:C/C++方向
⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平
前言:前面几篇文章介绍了c语言的一些知识,包括循环、数组、函数、VS实用调试技巧、函数递归、操作符等,在这篇文章中,我将继续介绍指针的一些重要知识点!由于指针的内容较多,博主将会分为六篇博客介绍,这是第五篇啦!对指针感兴趣的友友们可以在评论区一起交流学习!
一、回调函数
回调函数是什么?回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数
时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
在我们平常写的计算机的实现的代码中,有些代码是重复出现的,虽说执行计算的逻辑是区别的,但是输入输出操作是冗余的,有没有办法,简化一些呢?
这些重复出现只有调用函数的逻辑是有差异的,要想简化它们,我们可以把调用的函数的地址以参数的形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这里其实使用的就是回调函数的功能。
1、使用回调函数改造前
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int mul(int a, int b)
{return a * b;
}int div(int a, int b)
{return a / b;
}int main()
{int x, y;int input = 1;int ret = 0;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("输入操作数:");scanf("%d %d", &x,&y);ret = add(x, y);printf("ret = %d\n",ret);break;case 2:printf("输入操作数:");scanf("%d %d", &x,&y);ret = sub(x, y);printf("ret = %d\n",ret);break;case 3:printf("输⼊操作数:");scanf("%d %d", &x,&y);ret = mul(x, y);printf("ret = %d\n",ret);break;case 4:printf("输入操作数:");scanf("%d %d", &x,&y);ret = div(x, y);printf("ret = %d\n",ret);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}
2、使用回调函数改造后
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int mul(int a, int b)
{return a * b;
}int div(int a, int b)
{return a / b;
}void calc(int(*pf)(int, int))
{int ret = 0;int x, y;printf("输⼊操作数:");scanf("%d %d", &x, &y);ret = pf(x, y);printf("ret = %d\n", ret);
}int main()
{int input = 1;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d", &input);switch (input){case 1:calc(add);break;case 2:calc(sub);break;case 3:calc(mul);break;case 4:calc(div);break;case 0:printf("退出程序\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}
二、qsort使用举例
1、使用qsort函数排序整型数据
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>//qosrt函数的使用者得实现一个比较函数 int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
2、使用qsort排序结构数据
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1struct Stu //学生
{char name[20];//名字 int age;//年龄
};
//假设按照年龄来比较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//strcmp - 是库函数,是专门用来比较两个字符串的大小的
//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//按照年龄来排序
void test2()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//按照名字来排序
void test3()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{test2();test3();return 0;
}
三、qsort函数模拟实现
使用回调函数,模拟实现qsort(采用冒泡的方式)。
注意:这里第一次使用void* 的指针,讲解 void* 的作用。
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}void _swap(void* p1, void* p2, int size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *((char*)p1 + i);*((char*)p1 + i) = *((char*)p2 + i);*((char*)p2 + i) = tmp;}
}void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
{int i = 0;int j = 0;for (i = 0; i < count - 1; i++){for (j = 0; j < count - i - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){_swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}
}
int main()
{int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
结语
往期回顾:
C语言指针深入详解(一):内存和地址、指针变量和地址、指针变量类型的意义、指针运算
C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用
C语言指针深入详解(三):数组名理解、指针访问数组、一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组
C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表
结语:本篇文章就到此结束了,本文为友友们分享了一些指针相关的重要知识点,如果友友们有补充的话欢迎在评论区留言,下一期我们将继续介绍指针剩下的一些重要知识点,感谢友友们的关注与支持!
相关文章:
C语言指针深入详解(五):回调函数、qsort函数
目录 一、回调函数 1、使用回调函数改造前 2、使用回到函数改造后 二、qsort使用举例 1、使用qsort函数排序整型数据 2、使用qsort排序结构数据 三、qsort函数模拟实现 结语 🔥个人主页:艾莉丝努力练剑 🍓专栏传送门:《…...
# YOLOv5:目标检测的新里程碑
YOLOv5:目标检测的新里程碑 在计算机视觉领域,目标检测一直是研究的热点和难点之一。近年来,随着深度学习技术的飞速发展,目标检测算法也取得了显著的进步。YOLO(You Only Look Once)系列算法以其高效的实…...
beanstalk一直被重新保留(reserved 状态)消息删除
说明:wallet是我的tube 完整流程示例 暂停 tube(防止任务被重新保留)pause-tube wallet 300踢回并删除任务kick 100000 # 踢回所有 reserved 任务 delete 183723 # 删除目标任务恢复 tube(取消暂停)pause-tu…...
NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
引言 自然语言处理(NLP)作为人工智能的重要分支,致力于让机器理解、生成和操作人类语言。无论是机器翻译、情感分析还是聊天机器人,其底层逻辑都离不开数学工具的支持。概率论与统计学是NLP的核心数学基础之一,它们为…...
塔能智能照明方案——贵州某地区市政照明改造实践
在城市市政建设中,照明系统作为城市基础设施的重要组成部分,其能耗问题日益凸显。传统市政照明设备能耗高、运维效率低,成为城市绿色发展的阻碍。塔能科技针对这一痛点,为贵州某地区量身打造智能照明改造方案,通过技术…...
Mybatis的逆向工程Generator
Mybatis的逆向工程 什么是逆向工程 generator 简单点说,就是通过数据库中的单表,自动生成java代码。 Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\po类) 企业开发中&#…...
Runtime Suspend 专项训练
Q1. 什么是 Runtime PM?与 System Suspend 有什么区别? 答: Runtime PM(运行时电源管理)是 Linux 内核为单个设备提供的自动挂起机制。其核心思想是在设备空闲期间,关闭其时钟、电源、总线连接等资源&…...
香港科技大学(广州)智能制造理学硕士招生宣讲会——深圳大学专场
深圳大学专场宣讲会 时间:5月22日(星期四)19:00-20:00 地点:深圳大学沧海校区致原楼1101 🎓主讲嘉宾: 汤凯 教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/TANG-Kai/mektang …...
使用MacPro 安装flutter开发环境 详细教程
Mac 有 英特尔芯片 和 苹果芯片,故安装路径可能略有不同,但是思路 大致一样,以下内容仅供小伙伴们参考: 首先下载环境安装的软件,并推荐使用稳定版本。 gralde 8.5 点击下载 android studio 点击下载 jdk 点击下载…...
常见的 API 及相关知识总结
常见的 API 及相关知识总结 一、Math 类 Math 类提供了许多用于数学计算的静态方法和常量。 常见方法总结 方法描述Math.abs()返回一个数的绝对值Math.ceil()返回大于或等于给定数字的最小整数Math.floor()返回小于或等于给定数字的最大整数Math.round()对一个数进行四舍五…...
7-Zip软件下载与使用攻略:如何使用7z格式解压缩更高效?
在数字化文件管理中,压缩与解压缩工具的选择至关重要。7-Zip是一款广受欢迎的开源软件,以其高效的压缩率和多种格式支持而备受推崇。然而,解压专家作为另一款优秀的解压缩软件,同样值得关注。本文将为您推荐7-Zip的下载渠道&#…...
第 84 场周赛:翻转图像、字符串中的查找与替换、图像重叠、树中距离之和
Q1、[简单] 翻转图像 1、题目描述 给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转,即逆序。 例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转…...
SkyReels-V2:开启无限时长电影生成新时代
AI 在视频生成领域的突破尤为引人注目,为内容创作带来了全新的可能性。而 SkyReels-V2 的问世,更是如同一场革命,彻底颠覆了人们对视频生成技术的认知,开启了无限时长电影生成的新时代。 一、背景与挑战 回顾视频生成技术的发展…...
教师可用的申报书——基于GAI的小学数学课堂跨学科支架设计与实践
课题申报书:基于GAI的小学数学课堂跨学科支架设计与实践 (一)立项依据与研究内容 1. 项目的立项依据 1.1 研究意义 2025年《教育强国建设规划纲要》明确提出“推动学科融合发展”,《信息化标准建设行动计划(2024-2027年)》强调技术赋能教育创新。小学数学作为基础学科,…...
79、modelsim单独仿真altera带IP核的文件
1.编译 quartus 仿真库(如果有就不用编译了) 编译完成后 sim 文件夹中产生一个 verilog_libs 文件夹,打开文件夹 以上便是编译产生的库,将库添加到 modelsim 中也就是观察此文件中的 modelsim.ini 与 modelsim 安装目录下此…...
将 Workbook 输出流直接上传到云盘
如果不想将 Excel 文件保存到本地,而是希望直接将输出流上传到云存储(如阿里云OSS、腾讯云COS、七牛云等),可以采用以下方法: 文章目录 1. 创建内存中的 Excel 输出流2. 上传到云存储的通用方法3. 具体云服务实现示例…...
【LINUX操作系统】日志系统——自己实现一个简易的日志系统
经过一段时间的操作系统的学习,现在是时候让读者朋友们利用学过的技术知识自己完成一个简单的日志系统。认识、了解日志系统既是对已有多线程知识的运用,也是进一步提升项目技术能力的必须步骤。 1. 什么是日志 ⽇志认识 计算机中的⽇志是记录系统和软件…...
HTML页面渲染过程
前言 文章很长,凡是我觉得好的东西统统都塞进来了。看了很多的文章,有些说法甚至都不统一,所以还动用了AI搜索。总之希望这篇文章能有点用,如有错误,欢迎指正。 浏览器介绍 浏览器的主要组件包括: 界面…...
【八股战神篇】Java虚拟机(JVM)高频面试题
目录 专栏简介 一 请解释Java虚拟机(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 对象创建的过程了解吗 延伸 1.Java 创建对象的四种常见方式 三 什么是双亲委派模型 延伸 1.双亲委派机制的作用: 2.双亲委派模型…...
微店商品详情接口开发指南
接口概述 微店商品详情接口(/api/v1/product/detail)用于获取商品的完整信息,包括标题、价格、库存、SKU、主图等数据,支持OAuth2.0鉴权。 点击获取key和secret 请求方式 GET https://open.weidian.com/api/v1/product/detail …...
拦截指定注解(FeignClient),补偿重试
拦截指定注解(FeignClient),补偿重试;对代码无入侵 避免正常调用和重试逻辑调用重复插入; 根据自己的业务需求 插入新数据时 是否需要删除之前的旧数据,防止数据覆盖 import cn.hutool.core.util.ObjectUti…...
使用 GitHub Pages 部署单页面应用教程
## 简介 GitHub Pages 是 GitHub 提供的一个静态网站托管服务,可以免费托管个人、项目或组织页面。本教程将指导您如何部署一个单页面应用到 GitHub Pages。 ## 前提条件 - 拥有 GitHub 账号 - 已安装 Git - 已安装 Node.js(如果使用前端框架&#x…...
day16-17-磁盘管理
1. 磁盘分类 磁盘接口 硬盘 大小 sata接口 机械硬盘、固态硬盘 机械:4tb 10k性能要求不高 sas接口 机械硬盘、固态硬盘 机械:900G 15k性能好,容量低 pcie-e接口 固态硬盘 tb级别 4tb 8tb 性能要求高,数据库,…...
【神经网络与深度学习】扩散模型之通俗易懂的解释
引言: 扩散模型(Diffusion Models)是近年来深度学习领域的一项重要突破,尤其在生成式人工智能(Generative AI)中展现了惊人的能力。它的核心思想类似于一个孩子学习搭建乐高城堡的过程——先拆散࿰…...
Linux Bash 中 $? 的详细用法
Bash (Bourne Again SHell) 是使用最广泛的 SHell 脚本语言之一,因为它与 Unix 和 Linux 系统兼容。它提供了许多内置函数和变量,使脚本编写更高效,更不容易出错。其中一个变量是 $?, 它是 Bash 脚本错误处理的一个组成部分。这个…...
嵌入式培训之系统编程(一)标准IO、文件操作
目录 一、系统编程概述 二、标准IO (一)(以计算机为中心)标准IO (二)io的分类 (三)man命令 三、文件读写操作 (一)文件操作步骤 (二&#…...
NVIDIA Earth-2 AI 天气模型 DLI 课程:解锁全球风云的未来之匙
电影闲聊引发思索之言: 曾几何时,当我们闲聊起那些描绘美国气候的大电影时(龙卷风-后天等美国大片),仿佛被带入了一个个奇幻而真实的气象世界。从狂风暴雨到烈日炎炎最后到冰天雪地,电影里的场景让我们对气…...
至此(day1-day4)代码详解(ai辅助整理)
至此(day1-day4)代码详解 ipl10.nas ; 第一阶段引导程序 ; 功能:读取磁盘数据并跳转到第二阶段加载程序 ; 编译参数:nask -o ipl10.bin ipl10.nasCYLS EQU 10 ; 预设读取柱面数(实际值由BIOS决定)ORG…...
STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率
导言 通过优化代码算法,在串口空闲中断回调里不需要暂时关闭DMA接收,达到提高串口接收的效率。在IDLE接收中断里关闭DMA接收会导致接收过程中有数据丢失风险(关DMA的瞬间如果有数据到来,会丢帧!)。 回顾一…...
conda 设置env后,环境还是安装在c盘的解决方式:
1|设置 envs 文件夹权限 右键【envs】文件夹,选择【属性】 选择【安全】,点击【编辑】 选中【Users(用户名\Users)】,选中运行所有权限,如图所示 点击【确认】,确保修改被保存 2、环境变量path设置 选择【高级系统设置…...
设计模式 - 工厂模式
简单工厂模式 public class CoffeeFactory {public Coffee get(string coffeeType) {Coffee coffee null;if ("American".equals(coffeeType)) {coffee new AmericanCoffee();} else if ("Latte".equals(coffeeType)) {coffee new LatteCoffee();}retur…...
动态规划-LCR 090.打家劫舍II-力扣(LeetCode)
一、题目解析 本题与打家劫舍的最大区别在于房子不是线性分布的了,而是首尾相连的环形分布,即如果偷了第一间房子,那么最后一间房子就不能偷了,因为它们是相连的。 二、算法原理 在分析之前我们可以先讨论上面提到的第一间房子偷…...
2025 年暑假 LBE 大空间市场火爆程度预测:技术驱动与消费升级下的增长引擎
一、市场爆发的底层逻辑 根据 DeepSeek 行业报告显示,2025 年 LBE 大空间市场将呈现结构性爆发,核心驱动力来自三大技术突破: 空间计算能力跃迁:上海移动已开通全球最大规模商用 5G-A 3CC 网络,主城区及十大重点场景…...
【AI 大模型】盘古大模型简介 ( 创建空间 | 体验模型 | 部署模型 )
文章目录 一、盘古大模型简介1、创建空间2、体验模型3、部署模型 总结 : 盘古大模型 是 开发部署 盘古基础模型 , 或 在 盘古模型 基础上进行 微调训练 的 大模型 的平台 , 是 开发训练 大模型的平台 ; 不适合 中小企业 和 个人开发者 开发 大模型应用 ; 一、盘古大模型简介 1、…...
2025年护网行动蓝队防御全解析:构建智能动态防御体系
2025年,随着网络攻击手段的智能化、混合化升级,护网行动中的蓝队防御已从传统的被动防护转向“动态感知、智能研判、主动反制”的立体化模式。如何在攻防不对称的对抗中实现“看得见、防得住、溯得清”?本文将结合前沿技术与实战经验…...
【Java高阶面经:微服务篇】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战
一、熔断抖动的本质剖析与核心成因 1.1 熔断机制的核心价值与抖动危害 熔断机制作为微服务弹性架构的核心组件,通过模拟电路断路器逻辑,在服务出现异常时自动阻断请求链,防止故障扩散引发雪崩。但频繁的“熔断-恢复-熔断”抖动会导致: 用户体验恶化:请求成功率波动大,响…...
HTML回顾
html全称:HyperText Markup Language(超文本标记语言) 注重标签语义,而不是默认效果 规则 块级元素包括: marquee、div等 行内元素包括: span、input等 规则1:块级元素中能写:行内元素、块级元素(几乎什么都能写) 规则2:行级元素中能写:行内元素,但不能写:块…...
Leetcode百题斩-字典树
208. Implement Trie (Prefix Tree)[medium] 做完了哈希,来看看数据结构,做做字典树。字典树在搜索方面的作用还是蛮大的,主要是能实现前缀联想以及正确性匹配相关的功能。 字典树又名前缀树,顾名思义就是维护字符串的前缀。这个…...
大数据Spark(五十九):Standalone集群部署
文章目录 Standalone集群部署 一、节点划分 二、搭建Standalone集群 1、将下载好的Spark安装包上传解压 2、配饰spark-env.sh 3、配置workers 4、将配置好的安装包发送到node2、node3节点上 5、启动Standalone集群 三、提交任务测试 Standalone集群部署 Standalone 模…...
Vue 3 ~ 3.5 版本useTemplateRef使用
注意,useTemplateRef版本要在 3.5 以后才可使用,版本低的 ref 替代问题也不大~ 2024 年 9 月 1 日发布的 组合式 API:辅助 | Vue.js,引入一个小小的新 API useTemplateRef(),它用于访问实际的 DOM 节点。 …...
使用F5-tts复刻音色
最近第一人称视角的视频很火,想试试看复刻一下电视剧中某个角色的音色。看了下字节的API,嗯。。。138元一个音色,还不包括合成语音的费用,算了还是看看开源项目吧。 随便搜了搜,发现了两个项目一个是openvoice&#x…...
使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体(附完整源码)
文章目录 一、为什么要用代理IP?(重要!)二、环境准备(5分钟搞定)三、爬虫核心代码解析(含反反爬技巧)四、数据清洗的3个关键步骤五、训练AI智能体的实战技巧六、法律风险防范(必须看!…...
[软件工程]第二章题目汇总
1 [单选题] 原型化模型是( )。 A、适用于客户需求被明确定义的情况 B、很难产生有意义产品的一种冒险模型 C、提供一个精确表述的形式化规格说明 D、适用于客户需求难以清楚定义的情况 2 [单选题] 下列关于增量模型的说法正确的是( &…...
Java EE进阶1:导读
1.发展历程 2.学习内容 前⾯的课程中,学习的是Java基础,JavaEE主要学习Java的应用,也就是学习Java在企业中是如何应用的 Java更多场景是业务开发,更狭义点可以理解为web开发.所以咱们的学习也是围绕着如何使用Java来做web开发 2.1 什么是Web开发? web(…...
Unity自定义shader打包SpriteAtlas图集问题
Unity打包图集还是有一些坑的,至于图集SpriteAtlas是什么请参考我之前写的文章:【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程_spriteatlas 使用-CSDN博客 问题: 今天碰到的问题是,shader绘制的时候,因…...
系统集成项目管理工程师学习笔记之启动过程组
第十章 启动过程组 制定项目章程 定义 制定项目章程是编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程。 正式批准的项目文件 作用 1、明确项目与组织战略目标之间的直接联系 2、确立项目的正式地位 3、展示组织对项目的承诺 本过程仅开展一…...
vscode 常用调试
一、文件执行 python script.py {"name": "Python 调试程序: 当前文件","type": "debugpy","request": "launch","program": "${file}","console": "integratedTerminal"…...
Java 07异常
异常 指的是程序在编译和执行的过程中,出现的非正常的情况; 当然语法错误并不属于错误异常体系 最大的Throwable; 分为两个:Error ExceptionError 严重级别问题 常见的 堆内存溢出 栈内存溢出Exception 分为两个子类 RuntimeException 运…...
2025年PMP 学习二十三 16章 高级项目管理
2025年PMP 学习二十三 16章 高级项目管理 文章目录 2025年PMP 学习二十三 16章 高级项目管理高级项目管理战略管理战略管理的组成要素:企业战略转化为战略行动的阶段: 组织战略类型战略组织类型组织级项目管理OPM(公司项目管理) 组…...
【Java高阶面经:微服务篇】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略
一、CAP理论在服务注册与发现中的落地实践 1.1 CAP三要素的技术权衡 要素AP模型实现CP模型实现一致性最终一致性(Eureka通过异步复制实现)强一致性(ZooKeeper通过ZAB协议保证)可用性服务节点可独立响应(支持分区存活)分区期间无法保证写操作(需多数节点可用)分区容错性…...