提升分布式系统响应速度:分布式系统远程调用性能提升之道
目录
一、远程调用直接案例分析
二、并行调用
(一)核心思想
(二)并行调用的实现方式
1. 基本思路
2. 代码示例
3. 关键点说明
4.线程池配置建议
三、数据异构
(一)场景重提
(二)数据异构的优点与挑战
(三)数据一致性优化
1.双写策略
2.消息队列异步更新
3.定期同步
(四)缓存管理策略优化
1.缓存预热
2.缓存穿透防护
3.缓存过期策略
(五)数据架构设计
(六)总结:异构存储的优化效果
四、混合策略
(一)设计理念
1.数据分类处理
2.场景动态决策
(二)详细实现
1. 数据分类存储
2. 并行调用与缓存结合
3. 数据异构的定时更新
(三)优点分析
(四)可能的挑战及优化建议
五、总结
干货分享,感谢您的阅读!
在现代分布式系统中,接口的响应时间和系统吞吐量是衡量系统性能的重要指标。随着互联网应用规模的不断扩大,尤其是在高并发和海量数据处理的场景下,如何优化远程调用的性能,已成为开发者面临的关键挑战。尤其是在需要通过多个外部服务获取数据的业务场景中,接口的性能瓶颈往往导致系统响应时间的显著延长,影响用户体验和业务效率。
本篇文章将深入探讨如何通过并行调用、数据异构存储以及混合策略来优化接口的性能。我们将通过具体的业务案例分析,展示如何利用现代编程语言的并发工具(如 Java 的 CompletableFuture
)和高效的数据存储技术(如 Redis)来解决性能瓶颈。此外,文章还将讨论如何根据不同的数据特性和业务需求,灵活选择优化策略,确保在提升性能的同时,兼顾系统的可靠性与数据一致性。
无论是在进行性能调优还是架构设计时,本文提供的方法和策略都能够为开发者提供宝贵的参考,帮助他们打造高效、可扩展的分布式系统,满足日益增长的业务需求。
一、远程调用直接案例分析
在某些业务场景中,一个接口可能需要调用多个外部服务来获取数据。例如,用户信息查询接口需要返回以下信息:
- 用户服务:提供用户名称、性别、等级、头像(耗时 200ms)。
- 积分服务:提供用户积分信息(耗时 150ms)。
- 成长值服务:提供用户成长值信息(耗时 180ms)。
由于每个服务独立部署且通过网络调用,使用串行方式获取数据会导致总耗时为 200ms + 150ms + 180ms = 530ms。串行调用导致接口响应时间受所有服务调用耗时的累加影响,系统性能随远程接口数量增加呈线性下降,无法满足高效的数据返回需求。
针对远程调用的性能优化,并行调用和数据异构是两个主要的方向,当然混合也是常规操作。
二、并行调用
在分布式系统中,用户信息查询接口需要汇总多个服务的数据(用户服务、积分服务、成长值服务)。如串行调用所示,总耗时为所有服务调用时间的累加,导致性能瓶颈。基本问题可总结为:每次调用必须等待上一个任务完成,整个流程被拉长。
(一)核心思想
并发调用多个服务,同时发起请求,让所有任务“并行执行”。这样,总耗时只取决于最慢的远程接口。其明显优势在于:
- 显著缩短响应时间:将总耗时从 串行模式的累加,优化为 最长任务耗时。
- 提升系统吞吐量:并行化降低了单个接口的延迟,高并发下性能更加优越。
如图所示,通过并行调用,多个服务可以同时处理,最终耗时仅为最长的任务。
(二)并行调用的实现方式
1. 基本思路
并行调用可以通过多线程完成,Java 提供了多种并发工具:
- 在 Java 8 之前:通过
Callable
+Future
实现。 - 在 Java 8 及之后:推荐使用更优雅的
CompletableFuture
。
2. 代码示例
以 CompletableFuture
为例,实现并行调用多个服务:
public UserInfo getUserInfo(Long id) throws InterruptedException, ExecutionException {final UserInfo userInfo = new UserInfo(); // 存储汇总数据的对象// 使用 CompletableFuture 并行调用多个服务CompletableFuture<Void> userFuture = CompletableFuture.runAsync(() -> getRemoteUserAndFill(id, userInfo), executor); // 用户服务调用CompletableFuture<Void> bonusFuture = CompletableFuture.runAsync(() -> getRemoteBonusAndFill(id, userInfo), executor); // 积分服务调用CompletableFuture<Void> growthFuture = CompletableFuture.runAsync(() -> getRemoteGrowthAndFill(id, userInfo), executor); // 成长值服务调用// 等待所有任务完成CompletableFuture.allOf(userFuture, bonusFuture, growthFuture).join();return userInfo; // 返回汇总的用户信息
}
3. 关键点说明
-
CompletableFuture.runAsync()
:非阻塞地提交任务,多个服务的调用可以同时进行。 -
CompletableFuture.allOf()
:等待所有任务完成后再继续执行。 -
线程池管理:使用自定义线程池
executor
,避免线程资源耗尽或无限制创建线程。
4.线程池配置建议
并行任务的性能优化需要合理配置线程池,以平衡系统性能和资源消耗。
-
线程池配置示例:
ExecutorService executor = new ThreadPoolExecutor(10, // 核心线程数50, // 最大线程数60L, // 空闲线程存活时间TimeUnit.SECONDS,new LinkedBlockingQueue<>(100), // 阻塞队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略 );
-
注意事项:
- 核心线程数应根据服务器 CPU 核心数和业务量合理设置。
- 阻塞队列防止任务过载。
- 使用拒绝策略处理任务积压时的逻辑。
这部分更优的思考可见:
CompletableFuture回调机制的设计与实现
探索CompletableFuture:高效异步编程的利器
通过将串行调用优化为并行调用,我们显著提升了接口的响应速度,同时保证代码逻辑的清晰性和扩展性。
三、数据异构
为了优化远程调用性能,可以将多源数据通过异构存储的方式提前合并到一个统一的存储介质(如 Redis),直接通过用户 ID 查询。
(一)场景重提
这里我强调一下:对于高并发场景,可以通过 数据冗余与异构 优化远程调用性能,将多服务的数据聚合到缓存中,减少实时远程调用次数。对于之前的场景优化后,基本图如下:
这种方法可以避免实时调用多个服务接口,从而显著减少接口响应时间,特别适用于高并发场景。
(二)数据异构的优点与挑战
类别 | 内容 |
---|---|
优点 | |
极快的响应速度 | 数据预先存储于 Redis 等高性能缓存中,接口查询只需一次读取。 |
减少对远程服务的依赖 | 减轻远程服务的调用压力,降低服务不可用时的风险。 |
适配高并发场景 | 缓存层能高效处理大量请求,显著提升系统性能。 |
挑战 | |
数据一致性问题 | 数据库与缓存间存在延迟更新或失败时,会导致数据不一致。 |
数据冗余管理 | 冗余数据需要周期性更新或刷新,增加维护成本。 |
缓存穿透或失效风险 | 缓存未命中时,可能需要查询远程服务或数据库,影响性能;若高并发场景下出现缓存失效,可能导致服务瞬间崩溃。 |
针对上述问题,我们可以从以下几个方面进行优化设计。
(三)数据一致性优化
数据库更新后,Redis 中的缓存数据可能未能及时同步,导致查询到的内容是旧数据。我们可以思考按如下方式解决:
1.双写策略
当数据库更新时,同时更新缓存。确保写入缓存的操作与数据库事务绑定,如使用消息队列保障最终一致性。
2.消息队列异步更新
更新数据库时,向消息队列(如 Kafka、RabbitMQ)发布更新事件,异步消费事件更新 Redis。
- 优势:解耦服务,减少直接更新缓存的压力。
- 缺点:存在短暂的数据延迟。
3.定期同步
通过定时任务(如 Quartz 或 Spring Schedule)批量同步缓存与数据库。
- 优势:适合非实时性要求的数据,降低频繁更新的压力。
- 缺点:数据同步延迟,适用场景有限。
(四)缓存管理策略优化
高并发场景下可能遇到缓存失效或穿透问题。基本问题我们大致可以按如下思路解决:
1.缓存预热
在服务启动或高峰前,将热门用户数据预加载到 Redis,减少首次查询时的冷启动延迟。
2.缓存穿透防护
对无效用户 ID 返回默认值或空对象,避免频繁查询数据库。或者使用布隆过滤器(Bloom Filter)对合法用户 ID 进行快速校验。
3.缓存过期策略
对缓存设置合理的 TTL(Time To Live),并根据用户活跃度动态调整。热数据可使用延长过期策略,冷数据自动过期。
缓存这部分主要的思路可见:
具体内容基础 | 对应详细知识和解法链接 |
工程级复杂缓存难题 | 全面击破工程级复杂缓存难题 |
探析缓存穿透问题 | 高并发场景下的缓存穿透问题探析与应对策略 |
探析缓存雪崩 | 高并发场景下的缓存雪崩探析与应对策略-CSDN博客 |
探析缓存击穿 | 高并发场景下的缓存击穿问题探析与应对策略-CSDN博客 |
热key识别与实战解决 | 优化分布式系统性能:热key识别与实战解决方案_热key识别框架-CSDN博客 |
探析缓存热点key | 高并发场景下的热点key问题探析与应对策略_热点账户高并发解决方案-CSDN博客 |
探析大 Key 问题 | 高并发场景下的大 Key 问题及应对策略-CSDN博客 |
(五)数据架构设计
将缓存中的数据结构设计为统一对象,包含用户的完整信息,减少查询时的拼装操作。例如:
{"userId": 110111,"name": "张彦峰","gender": "male","level": 10,"avatar": "/img/avatar.png","bonus": 1200,"growth": 500
}
技术实现:
- 使用 Redis 的 Hash 数据结构存储用户信息。
- 对于更新频率较低的用户数据,可以存储为 JSON 字符串。
示例代码:
// 缓存写入
public void saveUserToCache(UserInfo userInfo) {String cacheKey = "user:info:" + userInfo.getId();redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(userInfo), 1, TimeUnit.HOURS);
}// 缓存读取
public UserInfo getUserFromCache(Long userId) {String cacheKey = "user:info:" + userId;String cachedData = redisTemplate.opsForValue().get(cacheKey);if (cachedData != null) {return JSON.parseObject(cachedData, UserInfo.class);}return null; // 缓存未命中
}
(六)总结:异构存储的优化效果
通过上述优化,数据异构方案可以达到以下效果:
- 性能大幅提升:接口响应时间仅需 Redis 查询时间(通常为亚毫秒级别)。
- 一致性可控:使用消息队列与定时任务结合,确保数据库与缓存数据的一致性。
- 可靠性增强:通过缓存穿透防护、缓存预热等手段,避免高并发带来的性能问题。
在实际应用中,可以根据业务场景选择合适的策略组合,既满足性能需求,又能降低数据一致性问题带来的风险。
四、混合策略
在实际业务场景中,仅采用 并行调用 或 数据异构 单一策略,往往难以全面满足需求。通过结合两种方式,既能保证数据的实时性,也能提升系统性能。这种 混合策略 充分利用两者的优点,适配多种业务场景。
(一)设计理念
1.数据分类处理
- 高实时性数据:需要最新的数据,比如交易状态、实时库存等。这类数据适合 并行调用,从源服务获取实时数据。
- 低更新频率或热点数据:如用户基本信息(头像、昵称)、商品的静态信息等,适合通过 数据异构 存储在缓存中,避免频繁调用远程服务。
2.场景动态决策
针对接口调用时的数据需求,可以根据实际情况动态决定使用并行调用还是异构数据。例如,用户信息接口中,头像和积分可通过 Redis 快速获取,而成长值需从实时服务查询。
(二)详细实现
以下是结合两种策略的技术实现步骤和示例。
1. 数据分类存储
利用数据特性划分:
- 将低更新频率或热点数据提前异构到 Redis 缓存中。
- 高实时性数据保留从服务实时查询的逻辑。
示例:用户信息接口的缓存设计
Redis 缓存示例
Key: user:{userId}:info
Value: { name: "张三", avatar: "url", level: "高级" }Key: user:{userId}:score
Value: { points: 1200, growth: 300 }
2. 并行调用与缓存结合
在接口实现中,优先查询缓存,对于需要实时性的数据,进行并行调用。
示例代码(Java 使用 CompletableFuture)
public UserInfo getUserInfo(Long userId) throws InterruptedException, ExecutionException {final UserInfo userInfo = new UserInfo();// 从缓存中获取低实时性数据CompletableFuture<Void> cacheFuture = CompletableFuture.runAsync(() -> {Map<String, Object> cacheData = redisService.getUserCache(userId);if (cacheData != null) {userInfo.setName((String) cacheData.get("name"));userInfo.setAvatar((String) cacheData.get("avatar"));userInfo.setLevel((String) cacheData.get("level"));}}, executor);// 并行调用远程服务,获取高实时性数据CompletableFuture<Void> scoreFuture = CompletableFuture.runAsync(() -> {Map<String, Object> scoreData = remoteScoreService.getScore(userId);userInfo.setPoints((Integer) scoreData.get("points"));userInfo.setGrowth((Integer) scoreData.get("growth"));}, executor);CompletableFuture.allOf(cacheFuture, scoreFuture).join();return userInfo;
}
3. 数据异构的定时更新
为保证缓存的数据一致性,可设置数据异构的同步策略:
- 消息队列(MQ)同步:当源数据更新时,通过 MQ 通知缓存更新。
- 定时任务刷新:定期批量刷新缓存,适合不频繁变化的数据。
示例:定时任务刷新缓存
@Scheduled(fixedRate = 60000) // 每分钟刷新一次
public void refreshUserCache() {List<Long> userIds = userService.getActiveUserIds();for (Long userId : userIds) {User user = userService.getUserFromDatabase(userId);redisService.updateUserCache(userId, user);}
}
(三)优点分析
- 性能优化:
- 低实时性数据通过缓存快速返回,大幅减少远程调用次数。
- 并行调用最大限度缩短高实时性数据的响应时间。
- 实时性与一致性兼顾:实时性数据保持最新,低频更新数据通过异构存储提供稳定支持。
- 扩展性强:混合策略适用于大多数场景,可动态调整缓存策略和远程调用策略。
(四)可能的挑战及优化建议
挑战 | 优化建议 |
---|---|
数据一致性问题 | - 使用 MQ 或定时任务,确保缓存与源数据的同步。 |
缓存设计复杂度 | - 合理设计缓存结构,使用分层缓存(如 Redis + 本地缓存)。 |
高并发场景下的热点问题 | - 对热点数据启用 缓存预热 和 本地热点缓存,减少集中访问压力。 |
并行调用的线程池管理 | - 为线程池设置合理的大小,避免线程池资源耗尽或频繁创建销毁线程。 |
混合策略充分发挥了并行调用和数据异构的优点。在高并发、复杂数据需求的场景下,通过动态选择数据获取方式,既能满足性能要求,又能兼顾数据实时性,是一种实用且灵活的优化方案。
五、总结
本文探讨了接口性能优化的多种策略,结合并行调用、数据异构存储与混合策略,提供了高效的解决方案来提升分布式系统中的接口响应速度。通过具体的案例分析和技术实现,能够清晰地看出不同优化方案如何应对实际中的性能瓶颈。
-
并行调用:通过并行化请求多个远程服务,可以大幅缩短接口响应时间,减少系统延迟。使用
CompletableFuture
等工具,能够高效管理并发任务,确保多个服务能够同时响应,从而提升系统吞吐量。 -
数据异构存储:将多源数据存储在高性能缓存(如 Redis)中,可以有效减少远程调用次数,特别适合高并发场景。通过优化缓存管理和确保数据一致性,我们能够大幅提升数据访问的效率。
-
混合策略:在实际业务中,单一的优化策略往往无法满足所有需求。通过结合并行调用与数据异构存储,可以在确保数据实时性的同时,提升系统性能。这种混合策略不仅能够有效应对多样化的业务需求,还能在不同的场景下灵活调整优化方式,达到最佳的性能表现。
总的来说,通过合理的架构设计、优化手段和策略组合,我们可以显著提升接口性能,减轻远程服务压力,降低系统延迟。面对复杂的业务场景,优化策略的灵活应用以及对缓存、并行度等方面的合理配置,能够保证系统在高并发、高负载的情况下依然稳定高效运行。
随着互联网应用的不断发展和业务复杂性的增加,性能优化将会是一个持续的课题。通过对上述策略的不断优化与完善,企业可以在性能和用户体验之间找到最佳平衡点。
相关文章:
提升分布式系统响应速度:分布式系统远程调用性能提升之道
目录 一、远程调用直接案例分析 二、并行调用 (一)核心思想 (二)并行调用的实现方式 1. 基本思路 2. 代码示例 3. 关键点说明 4.线程池配置建议 三、数据异构 (一)场景重提 (二&…...
通过MinIO+h2non/imaginary 搭建自己的阿里云OSS
安装MinIO Docker部署MinIO对象存储服务 图片访问地址:http://192.168.153.138:9000/public/su7_1.jpg 安装h2non/imaginary Docker部署h2non/imaginary 处理图片地址:http://192.168.153.138:7000/resize?urlhttp://192.168.153.138:9000/public/su…...
.NET 9 AOT的突破 - 支持老旧Win7与XP环境
引言 随着技术的不断进步,微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中,一个特别引人注目的亮点是 AOT( Ahead-of-Time)支持,它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...
iOS与Windows间传文件
想用数据线从 windows 手提电脑传文件入 iPhone,有点迂回。 参考 [1],要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机,界面: 点左侧栏「文件」,不是就直接可以传,而是要通过某个应用传…...
ospf协议(动态路由协议)
ospf基本概念 定义 OSPF 是典型的链路状态路由协议,是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 ( RFC2328 );针对 IPv6 协议使用 OSPF Version 3 ( RFC2740 )。…...
直击高频编程考点:聚焦新版综合编程能力考查汇总
目录 一、业务性编程和广度能力考查 (一)基本定义 (二)必要性分析 二、高频考查样题(编程扩展问法) 考题1: 用java 代码实现一个死锁用例,说说怎么解决死锁问题?(高…...
爬虫框架快速入门——Scrapy
适用人群:零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy? Scrapy 是一个基于 Python 的网络爬虫框架,它能帮助你快速爬取网站上的数据,并将数据保存到文件或数据库中。 特点: 高效:支…...
Springfox、Swagger 和 Springdoc
Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成 API 文档的工具,但它们之间有显著的区别和演进关系: 1. Swagger 简介 Swagger 是一个开源项目,旨在为 RESTful APIs 提供交互式文档。最早由 SmartBear 开发,…...
Css、less和Sass(SCSS)的区别详解
文章目录 Css、less和Sass(SCSS)的区别详解一、引言二、CSS 简介1.1、CSS 示例 三、Less 简介2.1、Less 特性2.2、Less 示例 四、Sass(SCSS)简介3.1、Sass 特性3.2、SCSS 示例 五、总结 Css、less和Sass(SCSSÿ…...
新能源汽车充电基础设施短板问题多,如何实现高效、综合、智能化管理?
随着城市经济的发展,人民生活水平的提升,新能源汽车保有量快速增长,而日益增长的新能源汽车需求与充电基础设施建设不平衡的矛盾日益突出。由于停车泊位充电基础设施总量不足、布局待优化、利用效率低、建设运营存在短板问题等原因࿰…...
DBA面试题-1
面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…...
LAN,WAN,VLAN,WLAN,VPN了解笔记
局域网LAN---公司的内部网络就是局域网LAN。 提供有线连接的接口允许局域网内的设备(如台式电脑、网络打印机、网络存储设备等)通过以太网线连接到路由器并与其他局域网设备进行通信实现设备之间的数据传输和资源共享一种私有的网络相对其他网络传输速度…...
1.2 算法和算法评价
1.2.1 算法的基本概念 算法:对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。 算法的五个重要特性 “好”的算法的五个目标 1.2.2 算法效率的度量 一、时间复杂度 算法的时间复杂度是指一个算法每行…...
各大常见编程语言应用领域
不同编程语言因其特性和设计目标而适用于不同的应用领域。以下是一些常见编程语言及其主要应用领域: 1. Python 数据科学与人工智能:Python 在数据分析、机器学习、深度学习等领域广泛使用,因其丰富的库(如 NumPy、Pandas、Tens…...
【FFT】数据点数是否一定为2的n次方?不补零会如何处理?
一般来说,FFT的数据点个数为以2为基数的整数次方(采用以2为基的FFT算法,可以提升运算性能),但是并没有要求FFT的数据点个数一定为2的n次方。 因此针对数据点数不是以2为基数的整数次方,有两种处理方法&…...
shell脚本小练习#003:查找并拷贝目录
实例1: # 从当前执行脚本的路径位置开始向上搜索一个名为sourceProject目录名 # 并将这个文件目录的路径名称打印出来#!/bin/bashfunction find_dir() {local current_dir$PWDwhile [[ $current_dir ! "/" ]]; doif [[ -d "${current_dir}/sourcePr…...
frp内网穿透
目录 1,准备公网服务器 2,下载安装frp服务端 3,服务端安装 2)编辑服务端配置文件fprs.toml 3)配置启动服务 4)启动服务 5 )设置开机启动服务 6)查看服务启动状态 3,…...
Android电视项目焦点跨层级流转
1. 背景 在智家电视项目中,主要操作方式不是触摸,而是遥控器,通过Focus进行移动,确定点击进行的交互,所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大,在一些复杂页面中会存…...
时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法
目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =...
转载 为nautilus安装rabbitvcs
# 添加 rabbitvcs 的 ppa 源 sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt update # 安装 rabbitvcs sudo apt install rabbitvcs-cli rabbitvcs-core rabbitvcs-gedit rabbitvcs-nautilus # 注销后重新登录,右键即可使用 # 解决 RabbitVCS 无法自动保存…...
OpenCV 模板匹配全解析:从单模板到多模板的实战指南
简介:本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤,包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义,阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法࿰…...
手机控制载货汽车一键启动无钥匙进入广泛应用
移动管家载货汽车一键启动无钥匙进入手机控车系统, 该系统广泛应用于物流运输、工程作业等货车场景,为车主提供了高效、便捷的启动和熄火解决方案,体现了科技进步对物流行业的积极影响 核心功能:简化启动流程,提…...
Springboot——SseEmitter流式输出
文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发,看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后,一次性返回。 而是片段式的处理…...
【人工智能数学基础篇】线性代数基础学习:深入解读矩阵及其运算
矩阵及其运算:人工智能入门数学基础的深入解读 引言 线性代数是人工智能(AI)和机器学习的数学基础,而矩阵作为其核心概念之一,承担着数据表示、变换和运算的重任。矩阵不仅在数据科学中广泛应用,更是神经…...
idea 自动导包,并且禁止自动导 *(java.io.*)
自动导包配置 进入 idea 设置,可以按下图所示寻找位置,也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly:自动帮我们优化导入的包Optimize imports on the fly:自动去掉一些没有用到的包 禁止导…...
奇怪的编码2
1.当铺密码 当铺密码的标志是“田由中人工大王夫井羊” 口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9 解密脚本: s 田由中人工大王夫井羊 codeinput("请输入当铺密码:") code code.split(" ") w for i in code:k…...
AI服务器从HBM到CXL的技术变革
AI服务器从HBM到CXL变革 本文探讨了AI产业的新范式,特别是服务器变革。传统服务器价格通常在1万美金以内,而搭载8张H100算力卡的DGX H100AI服务器价值高达40万美金(约300万人民币)。这一变化将对AI产业产生深远影响。 自然语言和图形处理依赖大量存储器…...
将自定义 AWS S3 快照存储库连接到 Elastic Cloud
作者:来自 Elastic Annie Hansen, Stef Nestor 在本博客中,我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud(企业版)中,Elastic 在其 found-snapshots 存储…...
Java 多线程编程核心要点全解析:深度探秘关键方法与同步机制
1.Thread 类中的start() 和 run() 方法有什么区别? 在Java编程语言中,Thread 类的 start() 和 run() 方法有重要的区别: start() 方法: 当你调用 start() 方法时,它会启动一个新的线程,并且这个新线程会…...
个人博客接入github issue风格的评论,utteranc,gitment
在做个人博客的时候,如果你需要评论功能,但是又不想构建用户体系和评论模块,那么可以直接使用github的issue提供的接口,对应的开源项目有utteranc和gitment,尤其是前者。 它们的原理是一样的:在博客文章下…...
搞个项目之-esp32-cam ov2640模组搭建图像视频项目
开发版的介绍: 1、开发板使用的是:ESP32-CAM 2、摄像头模组:OV2640 3、烧录底座:ESP32-CAM开发板烧录座 4、mirco usb线,四线30cm 5、开发版的原理图像 项目前期的准备工作 一、安装arduino arduino官网地址地址…...
【FPGA开发】Vivado自定义封装IP核,绑定总线
支持单个文件的封装、整个工程的封装,这里用单个文件举例。 在文件工程目录下,自建一个文件夹,里面放上需要封装的verilog文件。 选择第三个,指定路径封装,找到文件所在目录 取个名,选择封装IP的路径 会…...
Leetcode51:N 皇后
题目描述: 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问…...
C#面向对象之访问限制,类基础,继承
文章目录 1 访问限制1.1 简介 2 类基础讲解2.1 类定义2.2 构造函数2.2.1 构造函数2.2.2 静态构造函数2.2.3 初始化顺序2.2.4 对象初始化器 2.3 析构函数2.4 类的静态成员2.5 匿名对象2.5.1 定义2.5.2 匿名对象的创建 3 继承3.1 基类和派生类3.2 基类初始化3.3 Partial类3.3.1 定…...
科研小白成长记41——享受大起大落
一直内心对自己的定位是喜欢安安静静生活的人,但是朋友提醒我我的生活一直都是出于各种冒险之中,从GAP申博,到GAP找工作,都不是一个乐于安于现状的人会做出来的。仔细想想不无道理,既然如此,那就如享受安静…...
正则表达式笔记
一、基本正则 常见元字符 元字符说明^以某个字符开头$以某个字符结尾.匹配任意单字符*对前一项进行0次或者多次重复匹配{m,n}将前一项字符重复m-n次,{m,},{,n},{m,n}[]对方括号内的单字符进行匹配[^]不匹配方括号内的单字符^[]匹配以某个字符开头的行(…...
解决本地运行SuperPoint_SLAM报错ERROR: flag ‘flagfile‘ was defined more than once
解决本地运行SuperPoint_SLAM报错ERROR: flag flagfile was defined more than once 起因使用LD_DEBUG排查链接过程用ldd查看各自链接的库解决办法问题解决 起因 在之前本地编译了opencv-3.4.2,当时因为contrib模块需要gflags,重新下载了一个gflags在本…...
springboot信息化在线教学平台的设计与实现(代码+数据库+LW)
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足,创建了一个计算机管理信息化在线教学平台的方案。文章介绍了信息化在线教…...
maxun爬虫工具docker搭建
思路来源开源无代码网络数据提取平台Maxun 先把代码克隆到本地(只有第一次需要) git clone https://github.com/getmaxun/maxun.git 转到maxun目录 cd maxun 启动容器 docker-compose --env-file .env up -d 成功启动六个容器 网址 http://local…...
高效 Python Web 开发:FastAPI 入门与实践
高效 Python Web 开发:FastAPI 入门与实践 目录 ✨ 1. 安装与环境配置 📦 安装 FastAPI 和 Uvicorn🗂️ 项目目录结构和初始化🚀 创建一个简单的 FastAPI 项目 🛠️ 2. FastAPI 路由与请求处理 🛣️ 基本…...
C++中的函数重载
函数重载是指在同一个作用域(通常是一个类或者一个命名空间)内,可以有多个同名函数,但是这些同名函数的参数列表(参数的个数、类型或者顺序)不同。当调用这个函数名时,编译器会根据传入的实际参…...
达梦数据库常用指令都是工作中常用的
达梦数据库连接配置文件名称 cd /etc/dm_svc.conf查询 sql 日志记录是否开启:0 关闭,1/2/3开启); select SF_GET_PARA_VALUE(1,SVR_LOG)union ALL select SF_GET_PARA_VALUE(2,SVR_LOG);关闭 sql 日志记录功能 call SP_SET_PARA_VALUE(1,SVR_LOG,0);开…...
【2024最新】基于Springboot+Vue的就业信息管理系统Lw+PPT
作者:计算机搬砖家 开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:Java精选实战项…...
linux一键部署apache脚本
分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …...
修改MySQL数据库密码报1290
修改MySQL数据库密码报1290 错误 如下: alter user ‘root’‘localhost’ identified by ‘root’; ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 需要刷新下配置 flush privileg…...
OpenCV4.8 开发实战系列专栏之 17 - 图像直方图
大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。 专栏代码全部基于C 与Python双语演示,领学习资料(Free) & 进专栏答疑群, VX: OpenCVXueTang_Asst 本文关键知识点:图…...
Linux下如何安装JDK
在Linux系统上安装JDK(Java Development Kit),通常包括下面步骤: 下载JDK安装包解压安装包配置环境变量等 在介绍安装之前,先厘清一些常用问题。 Linux 下Java 安装到哪个目录比较好? 在Linux系统下&am…...
实时数据开发|Flink如何实现不同数据源输入--DataSource模块
DataStream 编程模型 Flink定义DataStream API让用户灵活且高效的编写流式应用。主要分为3部分:DataSource模块,Transformation模块以及DataSink模块。 DataSource模块,主要定义了数据接入功能,将外部数据接入至flink࿰…...
使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet
文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中,我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG(检索增强生成)应用 这个效果确实很差。 我们一起来看看,该怎么改进。 今天我们就尝试一下&…...
GPT模型:改变世界的AI魔法师
目录 一、什么是GPT?它是怎么来的? 二、GPT能干啥?(它简直无所不能!) 三、想用GPT?这点开发技巧你一定要知道! 第一步:用OpenAI API搭建自己的GPT服务 第二步&#x…...