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

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题

面试题概述

  • 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。
  • 提供四个回答方向,准备其中一个方向即可。
    在这里插入图片描述

1、设计模式应用方向

  • 以登录为例,未用设计模式时登录逻辑在一个业务类中,需求变更(如登录方式增减或更换)需频繁修改业务层代码。
  • 采用工厂设计模式和策略模式后,解决了频繁修改业务层代码的问题,具体实现可参考相关案例,其他设计模式介绍方式类似。

2、线上 bug 方向

  • 项目上线后可能出现测试环境未暴露的问题,如运行一段时间后 CPU 飙高、内存泄露、线程死锁等,线上调试困难。
  • 介绍时需按问题、解决过程、最终解决方案的逻辑进行,可参考 DVM 和多线程课程案例。

3、调优方向

  • 调优时最好给出指标数据,如接口调优前后的访问耗时。
  • 重点讲述调优中间过程,可涉及 SQL 优化(加索引)、添加缓存、采用集群或高可用方案等。

4、组件封装方向

  • 分布式锁和接口幂等可封装为小型工具或组件供多项目使用,支付和事务可封装为通用服务,但难度较高且需考虑高可用和通用性。
  • 有经验可详细讲述,无经验可参考网上文章,实在想不到可从其他三个方向入手。

总结强调

  • 此面试题高频出现,需提前准备,选择一个方向深入准备能体现技术水平。

具体问题

设计模式应用案例

在一个电商项目的用户登录功能开发中,最初的设计非常简单直接。登录逻辑全部集中在一个业务类 UserLoginService 中,代码如下:

public class UserLoginService {public boolean login(String username, String password) {// 直接在该方法中进行数据库查询验证if ("admin".equals(username) && "123456".equals(password)) {return true;}return false;}
}

随着业务发展,需要支持多种登录方式,如手机号验证码登录、第三方平台登录(微信、支付宝)等。每次增加新的登录方式,都需要在 login 方法中添加大量的条件判断逻辑,导致代码越来越臃肿,维护成本急剧上升。例如添加手机号验证码登录:

public class UserLoginService {public boolean login(String identifier, String credential) {if (identifier.matches("^1[3 - 9]\\d{9}$")) {// 手机号验证码登录逻辑,查询数据库验证验证码if ("validCode".equals(credential)) {return true;}} else if ("admin".equals(identifier) && "123456".equals(credential)) {// 用户名密码登录逻辑return true;}return false;}
}

为解决这个问题,引入了工厂设计模式与策略模式。首先定义一个登录策略接口 LoginStrategy

public interface LoginStrategy {boolean login(String identifier, String credential);
}

然后分别实现用户名密码登录策略类 UsernamePasswordLoginStrategy 和手机号验证码登录策略类 PhoneCodeLoginStrategy

public class UsernamePasswordLoginStrategy implements LoginStrategy {@Overridepublic boolean login(String username, String password) {// 实际数据库查询验证逻辑if ("admin".equals(username) && "123456".equals(password)) {return true;}return false;}
}
public class PhoneCodeLoginStrategy implements LoginStrategy {@Overridepublic boolean login(String phone, String code) {// 实际数据库查询验证逻辑if ("13800138000".equals(phone) && "validCode".equals(code)) {return true;}return false;}
}

接着创建一个登录策略工厂类 LoginStrategyFactory

public class LoginStrategyFactory {public static LoginStrategy getLoginStrategy(String loginType) {if ("usernamePassword".equals(loginType)) {return new UsernamePasswordLoginStrategy();} else if ("phoneCode".equals(loginType)) {return new PhoneCodeLoginStrategy();}return null;}
}

最后,修改业务类 UserLoginService,通过工厂获取相应的登录策略:

public class UserLoginService {public boolean login(String loginType, String identifier, String credential) {LoginStrategy strategy = LoginStrategyFactory.getLoginStrategy(loginType);if (strategy!= null) {return strategy.login(identifier, credential);}return false;}
}

通过这种方式,当需要添加新的登录方式时,只需要创建新的策略类并在工厂类中添加相应的获取逻辑,无需修改业务层的核心代码,大大提高了代码的扩展性和维护性。

线上 bug 处理案例

在一个大型的在线教育平台项目上线一段时间后,运维人员反馈系统出现 CPU 使用率持续飙高的情况,导致部分课程直播卡顿,严重影响用户体验。由于线上环境复杂,难以在测试环境复现相同问题,增加了调试难度。

首先,利用 jstack 命令获取当前 Java 进程的线程堆栈信息,通过分析堆栈信息,发现有一个线程一直在执行某个方法 calculateCourseScore,该方法用于计算课程的综合得分,代码如下:

public class CourseScoreCalculator {public double calculateCourseScore(List<StudentAnswer> answers) {double totalScore = 0;for (StudentAnswer answer : answers) {// 复杂的计算逻辑,包含多层嵌套循环for (int i = 0; i < answer.getOptions().size(); i++) {for (int j = 0; j < answer.getOptions().get(i).getSubOptions().size(); j++) {totalScore += answer.getOptions().get(i).getSubOptions().get(j).getScore();}}}return totalScore;}
}

从代码逻辑上看,多层嵌套循环导致计算量过大,在高并发情况下容易使 CPU 使用率飙升。针对这个问题,对计算逻辑进行了优化。通过减少不必要的循环嵌套,将部分重复计算的逻辑提取出来,优化后的代码如下:

public class CourseScoreCalculator {public double calculateCourseScore(List<StudentAnswer> answers) {double totalScore = 0;for (StudentAnswer answer : answers) {List<Option> options = answer.getOptions();for (Option option : options) {List<SubOption> subOptions = option.getSubOptions();for (SubOption subOption : subOptions) {totalScore += subOption.getScore();}}}return totalScore;}
}

同时,监控系统资源,发现数据库查询操作也占用了较多资源。通过对数据库查询语句进行分析,发现部分查询没有使用合适的索引。例如,在查询学生课程学习记录时,原 SQL 语句为:

SELECT * FROM student_course_record WHERE student_id = 12345;

student_course_record 数据量较大,而 student_id 字段没有添加索引,导致查询效率低下。为 student_id 字段添加索引:

CREATE INDEX idx_student_id ON student_course_record(student_id);

经过这些优化措施,再次监控系统,CPU 使用率恢复到正常水平,线上直播卡顿问题得到解决。

系统调优案例

在一个电商订单系统中,有一个查询订单详情的接口 getOrderDetail,调优前该接口的平均响应时间为 2 秒,严重影响用户体验。为了提升系统性能,对该接口进行了优化。

首先,对接口涉及的 SQL 查询语句进行分析。原 SQL 语句为:

SELECT * FROM orders 
JOIN order_items ON orders.order_id = order_items.order_id 
JOIN products ON order_items.product_id = products.product_id 
WHERE orders.order_id = 12345;

通过 EXPLAIN 关键字分析查询执行计划,发现 JOIN 操作效率较低,因为相关表没有合适的索引。为 orders 表的 order_id 字段、order_items 表的 order_idproduct_id 字段、products 表的 product_id 字段添加索引:

CREATE INDEX idx_order_id_orders ON orders(order_id);
CREATE INDEX idx_order_id_order_items ON order_items(order_id);
CREATE INDEX idx_product_id_order_items ON order_items(product_id);
CREATE INDEX idx_product_id_products ON products(product_id);

经过索引优化后,SQL 查询效率得到显著提升。同时,考虑到订单数据相对稳定,添加缓存机制。使用 Redis 作为缓存,在查询订单详情时,首先从 Redis 中查询是否有缓存数据,如果有则直接返回,避免了数据库查询。代码实现如下:

public OrderDetail getOrderDetail(long orderId) {OrderDetail orderDetail = (OrderDetail) redisTemplate.opsForValue().get("order:" + orderId);if (orderDetail!= null) {return orderDetail;}// 如果缓存中没有,从数据库查询orderDetail = orderDao.getOrderDetail(orderId);if (orderDetail!= null) {redisTemplate.opsForValue().set("order:" + orderId, orderDetail);}return orderDetail;
}

经过上述优化,该接口的平均响应时间从 2 秒缩短到了 500ms,系统性能得到了大幅提升。

组件封装案例

  1. 分布式锁封装
    在一个分布式电商库存扣减系统中,为了保证库存扣减的原子性,避免超卖现象,需要使用分布式锁。封装了一个简单的分布式锁工具类 DistributedLockUtil,使用 Redis 实现分布式锁。代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Component
public class DistributedLockUtil {@Autowiredprivate RedisTemplate<String, String> redisTemplate;public boolean tryLock(String lockKey, String requestId, int expireTime) {return redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS);}public void unlock(String lockKey, String requestId) {if (requestId.equals(redisTemplate.opsForValue().get(lockKey))) {redisTemplate.delete(lockKey);}}
}

在库存扣减业务代码中使用该分布式锁:

public class StockService {@Autowiredprivate DistributedLockUtil distributedLockUtil;public boolean deductStock(long productId, int quantity) {String lockKey = "stock:" + productId;String requestId = UUID.randomUUID().toString();if (distributedLockUtil.tryLock(lockKey, requestId, 10)) {try {// 检查库存并扣减int stock = stockDao.getStock(productId);if (stock >= quantity) {stockDao.deductStock(productId, quantity);return true;}} finally {distributedLockUtil.unlock(lockKey, requestId);}}return false;}
}

这个分布式锁工具类可以在多个电商相关项目中复用,保证了分布式环境下关键业务的一致性。

  1. 支付通用服务封装
    在一个综合性电商平台项目中,涉及多种支付方式,如微信支付、支付宝支付、银行卡支付等。为了提高代码的复用性和系统的可维护性,封装了一个支付通用服务 PaymentService

首先定义一个支付接口 PaymentProcessor

public interface PaymentProcessor {String processPayment(PaymentRequest request);
}

然后分别实现微信支付处理器 WeChatPaymentProcessor、支付宝支付处理器 AlipayPaymentProcessor 和银行卡支付处理器 BankCardPaymentProcessor

public class WeChatPaymentProcessor implements PaymentProcessor {@Overridepublic String processPayment(PaymentRequest request) {// 调用微信支付 API 进行支付处理// 返回支付结果return "微信支付成功";}
}
public class AlipayPaymentProcessor implements PaymentProcessor {@Overridepublic String processPayment(PaymentRequest request) {// 调用支付宝支付 API 进行支付处理// 返回支付结果return "支付宝支付成功";}
}
public class BankCardPaymentProcessor implements PaymentProcessor {@Overridepublic String processPayment(PaymentRequest request) {// 调用银行卡支付 API 进行支付处理// 返回支付结果return "银行卡支付成功";}
}

接着创建支付服务类 PaymentService,通过策略模式选择具体的支付处理器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class PaymentService {private Map<String, PaymentProcessor> paymentProcessorMap = new HashMap<>();@Autowiredpublic PaymentService(WeChatPaymentProcessor weChatPaymentProcessor,AlipayPaymentProcessor alipayPaymentProcessor,BankCardPaymentProcessor bankCardPaymentProcessor) {paymentProcessorMap.put("wechat", weChatPaymentProcessor);paymentProcessorMap.put("alipay", alipayPaymentProcessor);paymentProcessorMap.put("bankCard", bankCardPaymentProcessor);}public String processPayment(PaymentRequest request) {String paymentType = request.getPaymentType();PaymentProcessor processor = paymentProcessorMap.get(paymentType);if (processor!= null) {return processor.processPayment(request);}return "不支持的支付方式";}
}

在订单支付业务中使用该支付服务:

public class OrderService {@Autowiredprivate PaymentService paymentService;public String payOrder(Order order) {PaymentRequest request = new PaymentRequest();request.setPaymentType(order.getPaymentType());request.setAmount(order.getTotalAmount());return paymentService.processPayment(request);}
}

通过这种方式,将支付相关的复杂逻辑封装在 PaymentService 中,其他业务模块只需调用该服务即可,提高了系统的通用性和可维护性,同时也方便扩展新的支付方式。


总结

设计模式应用

  • 主要内容:电商项目用户登录功能,从初始逻辑集中导致维护困难,到引入工厂与策略模式解决问题。
  • 核心概念:工厂设计模式用于创建对象,策略模式将算法逻辑封装。
  • 关键知识点:理解两种设计模式作用,明白如何结合使用提高代码扩展性与维护性。

总结

  • 设计模式可优化代码结构,解决业务变更时代码频繁修改问题。
  • 工厂模式负责对象创建,策略模式处理不同业务逻辑实现,二者结合使代码更灵活。

线上 bug 处理

  • 主要内容:在线教育平台上线后 CPU 飙高,通过分析线程堆栈和 SQL 语句定位并解决问题。
  • 核心概念:利用工具获取线程堆栈信息辅助定位问题,关注数据库索引对查询性能影响。
  • 关键知识点:掌握获取和分析线程堆栈方法,了解索引优化 SQL 查询原理。

总结

  • 线上 bug 因环境复杂难调试,需借助工具精准定位。
  • 优化代码逻辑和数据库查询,可有效解决性能问题。

系统调优

  • 主要内容:电商订单系统查询订单详情接口,从 2 秒响应优化到 500ms,通过 SQL 优化和缓存实现。
  • 核心概念:使用 EXPLAIN 分析查询执行计划,运用缓存减少数据库查询压力。
  • 关键知识点:学会分析查询执行计划,掌握缓存机制及应用场景。

总结

  • 系统调优需关注数据库查询和缓存策略,以提升接口响应速度。
  • 索引优化可提高 SQL 查询效率,缓存能快速返回常用数据。

组件封装

  • 分布式锁封装

    • 主要内容:电商库存扣减系统使用分布式锁保证原子性,封装基于 Redis 的分布式锁工具。
    • 核心概念:分布式锁确保分布式环境下操作一致性,Redis 提供实现方式。
    • 关键知识点:理解分布式锁原理,掌握基于 Redis 实现分布式锁方法。
  • 总结

    • 分布式锁用于解决分布式场景下数据一致性问题。
    • Redis 的 setIfAbsent 等操作可实现分布式锁基本功能。
  • 支付通用服务封装

    • 主要内容:电商平台多种支付方式,通过封装支付通用服务提高复用性与可维护性。
    • 核心概念:利用策略模式实现不同支付方式处理,封装复杂支付逻辑。
    • 关键知识点:理解策略模式应用,学会封装通用服务。
  • 总结

    • 策略模式可根据不同条件选择不同支付处理器。
    • 封装通用服务能提升代码复用,便于维护和扩展新支付方式。

相关文章:

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…...

Autoencoder(李宏毅)机器学习 2023 Spring HW8 (Boss Baseline)

1. Autoencoder 简介 Autoencoder是一种用于学习数据高效压缩表示的人工神经网络。它由两个主要部分组成: Encoder 编码器将输入数据映射到一个更小的、低维空间中的压缩表示,这个空间通常称为latent space或bottleneck。 这一过程可以看作是数据压缩,去除冗余信息,仅保留…...

Python的循环

Python的循环 Python的循环有两种&#xff0c;分别是for…in循环和while循环。 for…in 循环 假设我们要循环输出一个列表里的元素&#xff1a; names [张三,李四,王五] for name in names:print(name)执行这段代码后&#xff0c;会依次打印names的每一个元素&#xff1a;…...

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手&#xff1f; 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC&#xff0c;想必现目前多数通信工程师们都已经搞的差不多了&#xff08;不要再问FvM了&#xff09;&#xff1b;…...

Git | git stash命令详解

关注&#xff1a;CodingTechWork 引言 在日常开发中&#xff0c;使用Git版本控制系统时&#xff0c;可能会遇到需要暂时中断当前工作&#xff0c;去处理其他任务的情况。这时&#xff0c;如果直接切换分支&#xff0c;可能会导致当前的修改未提交而丢失或需要暂时保存修改的状…...

LeetCode hot100-100

287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。你设计的解决方案必须 不修改 数组…...

AWS re:Invent 2024 现场实录 - It‘s all about Scale

时隔五年&#xff0c;再度造访美国&#xff0c;也是同样的主题&#xff0c;参加在拉斯维加斯举行的 AWS re:Invent 大会。 会场 从 2012 起第一届开始&#xff0c;每年的 re:Invent 大会都放在拉斯维加斯&#xff0c;主会场也都放在威尼斯人酒店 (Venetian)。有小伙伴好奇这背…...

qt-C++笔记之自定义继承类初始化时涉及到parents的初始化

qt-C笔记之自定义继承类初始化时涉及到parents的初始化 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QWidget …...

[微服务]redis数据结构

介绍 我们常用的Redis数据类型有5种&#xff0c;分别是&#xff1a; StringListSetSortedSetHash 还有一些高级数据类型&#xff0c;比如Bitmap、HyperLogLog、GEO等&#xff0c;其底层都是基于上述5种基本数据类型。因此在Redis的源码中&#xff0c;其实只有5种数据类型。 …...

android四大组件之一——Service

目录 一、Service概述 二、生命周期 三、权限 四、进程生命周期 五、组件与绑定Service的通信方式 1.扩展 Binder 类 2.Messenger信使 3.AIDL 七、总结 场景使用区别 一、Service概述 Service 是应用组件&#xff0c;代表一个应用的长时间后台运行的操作&#xff0…...

PythonOpenCV图片识别

在windows下面&#xff0c;使用python opencv 进行识别&#xff0c;获取到坐标。 依赖安装&#xff1a; pip install opencv-python pip install numpy pip install pyautogui pip install pywin32代码&#xff1a; import cv2 import numpy as np import pyautogui import o…...

ASP.NET Core 中使用 Cookie 身份验证

在 ASP.NET Core 中使用 Cookie 身份验证&#xff0c;通常是为了实现用户的登录和授权。以下是配置 Cookie 身份验证的步骤。 1. 安装必要的 NuGet 包 首先&#xff0c;确保项目中包含 Microsoft.AspNetCore.Authentication.Cookies 包。你可以通过 NuGet 包管理器或命令行安…...

2021 年 3 月青少年软编等考 C 语言五级真题解析

目录 T1. 红与黑思路分析T2. 密室逃脱思路分析T3. 求逆序对数思路分析T4. 最小新整数思路分析T1. 红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的…...

LeetCode带环链表题深度解析(是否带环、寻找环的入口结点)

目录 一、链表是否带环 常规方法解析&#xff1a; 拓展问题&#xff1a;那么fast一次走三步&#xff0c;走四步...是否还会相遇&#xff1f; fast &#xff1a;3 &#xff0c;low &#xff1a;1 fast &#xff1a;4 &#xff0c;low &#xff1a;1 总结&#xff1a; 二、…...

Redis--20--大Key问题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key&#xff1f;在 Redis 中&#xff0c;大 Key 是指单个键值对的数据量非常大&#xff0c;可能包含大量数据。 2. Redis大Key的危害3.…...

如何使用Yarn Workspaces实现Monorepo模式在一个仓库中管理多个项目

Yarn Workspaces是Yarn提供的一种依赖管理机制&#xff0c;它支持在单个代码仓库中管理多个包的依赖。这种机制非常适合需要多个相互依赖的包的项目&#xff0c;能够减少重复依赖&#xff0c;加快依赖安装速度&#xff0c;并简化依赖管理。下面将详细介绍如何使用Yarn Workspac…...

测试ip端口-telnet开启与使用

前言 开发过程中我们总会要去测试ip通不通&#xff0c;或者ip下某个端口是否可以联通&#xff0c;为此我们可以使用telnet 命令来实现。 一、telnet 开启 可能有些人使用telnet报错&#xff0c;不是内部命令&#xff0c;可以如下开启&#xff1a; 1、打开控制面板&#xff…...

c#版本、.net版本、visual studio版本之间的对应关系

最近这几年一直没用过c#开发&#xff0c;都是从事Qt c开发工作&#xff0c;回想一下之前c#还要追溯到2019年&#xff0c;算算时间大概都已过去4&#xff0c;5年了&#xff0c;时间飞快。 2019真是个神奇的数字&#xff0c;vs2019是我用的时间最长的一个IDE&#xff0c;新冠起始…...

大语言模型训练

步骤 Self-Supervised Pre-Training&#xff0c;简称SPTSupervised Fine-Tuning&#xff0c;简称SFTLearning from Human Feedback&#xff0c;简称LfHF Self-Supervised Pre-Training 自监督预训练&#xff08;Self-Supervised Pre-Training&#xff0c;简称SPT&#xff09…...

ElasticSearch | Elasticsearch与Kibana页面查询语句实践

关注&#xff1a;CodingTechWork 引言 在当今大数据应用中&#xff0c;Elasticsearch&#xff08;简称 ES&#xff09;以其高效的全文检索、分布式处理能力和灵活的查询语法&#xff0c;广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES&#xff0c;用户…...

idea快捷键

IDEA常见快捷键 Ctrl A 全写 Ctrl C 粘贴 Ctrl V 复制 Ctrl F 搜索 Ctrl R 替换 Ctrl Z 撤销 Ctrl D 复制行 Ctrl X 删除行&#xff0c;并且被删除的行复制到剪贴板中 Ctrl Y 删除一行 Ctrl Shift Z 反撤销 IDEA重要快捷键 Ctrl / 单行注释&…...

2024年全国信息素养大赛-图形化编程-省赛-绘制正方和三角形

绘制正方和三角形 【编程实现】 使用自制积木&#xff0c;绘制正方形和三角形。 【具体要求】 *程序尽量简洁。 1.画出喜庆的红色图形。 2.先画正方形&#xff0c;再画三角形。 3.正方形和三角形不重叠。 4.正方形和三角形不超出背最中红框的范围。 题目程序演示可点击…...

二进制编码 和 Base64编码

我需要将音频数据存为字符串&#xff0c;不知道存为 二进制编码 和 Base64编码 以下内容来自 DeepSeek : 1. 二进制编码 优点&#xff1a; 高效&#xff1a;二进制编码直接存储原始数据&#xff0c;占用空间小&#xff0c;处理速度快。适合传输&#xff1a;在需要高效传输的…...

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…...

Kafka集群安装

Apache kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,是消息中间件的一种,用于构建实时数据管道和流应用程序。 Kafka官网:http://kafka.apache.org/ 安装环境: Kafka集群环境搭建,依赖于zookeep…...

EXCEL: (二) 常用图表

10. 图表 134-添加.删除图表元素 图表很少是一个单独的整体&#xff0c;而是由十几种元素/对象拼凑出来的。 学习图表就是学习当中各类元素的插删改。 ①图表中主要元素的定义 图表上的一个颜色就是一个系列&#xff0c;每个系列都对应原数据中的一列/一行值数据。 每个系…...

系统日志优化---自定义springboot-starter日志组件供各个服务使用

在优化项目时发现各个微服务都有各自的接口调用日志逻辑&#xff0c;比如每个服务都定义一个aop类拦截&#xff0c;十分冗余&#xff0c;其实是可以做成starter被各个服务引用使用&#xff0c;前提要先了解一下springboot自动装配原理 创建springboot工程&#xff0c;如果是jdk…...

《GB50348-2018 安全防范工程技术标准》:安防工程的权威指南

《GB50348-2018 安全防范工程技术标准》&#xff1a;安防工程的权威指南 【下载地址】GB50348-2018安全防范工程技术标准分享 GB50348-2018 安全防范工程技术标准本仓库提供的是《GB50348-2018 安全防范工程技术标准》的高清电子版资源 项目地址: https://gitcode.com/Open-s…...

RabbitMQ高级篇

目录 确保发送者的可靠 为什么需要确保发送者的可靠性 RabbitMQ 的发送者重连机制配置 springAMQP实现发送者确认 MQ的可靠性 为什么需要实现MQ的可靠性&#xff1f; 数据持久化 Lazy Queue 核心思想 总结RabbitMQ 如何保证消息的可靠性 持久化 Lazy Queue 消息…...

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener Scheduler 调度器scheduler是Quartz中的独立工作容器&#xff0c;所有的Trigger和Job都需要注册到scheduler中才能工作。我们可以通过SchedulerFactory来获取scheduler实例。如下&#xff1a; //1.获取默认的标准…...

服务器出现蓝屏现象的原因有什么?

当服务器定期出现蓝屏的现象&#xff0c;则会影响到企业业务的连续性&#xff0c;同时还可能会导致重要数据信息丢失和系统稳定性下降&#xff0c;是一种较为复杂的技术问题&#xff0c;本文就来探讨一下导致服务器出现蓝屏的原因都有什么。 服务器出现蓝屏有可能是硬件出现了故…...

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…...

探索数据存储的奥秘:深入理解B树与B+树

key value 类型的数据红黑树&#xff08;最优二叉树&#xff0c;内存最优&#xff09;&#xff0c;时间复杂度&#xff1a;O&#xff08;logn&#xff09;,调整方便&#xff1b;一个结点分出两个叉B树一个节点可以分出很多叉数据量相等的条件下&#xff1a;红黑树的层数很高&am…...

mac学习芋道源码记录

nodejs安装 v16.20.0 cd yudao-ui-admin-vue2 node install -g yarn yarn install npm run local改配置不然node install -g yarn报错 前往-前往文件夹-/Library 创建 /nodejs/node_global /nodejs/node_cache npm config set prefix /Library/nodejs/node_global npm c…...

CCF 赛事介绍

CCF 赛事介绍 中国计算机学会&#xff08;CCF&#xff09;举办了诸多具有影响力的赛事&#xff0c;面向不同年龄段与群体&#xff0c;各有其特色要求。 一、青少年编程启蒙类 CCF 编程能力等级认证&#xff08;GESP&#xff09;&#xff1a; 适合年龄&#xff1a;涵盖中小学…...

MySQL表的约束

目录 一、空属性 二、默认值 三、列描述 四、zerofill 五、主键 六、自增长 七、唯一键 八、外键 一、空属性 两个值&#xff1a;null&#xff08;默认的&#xff09;和not null(不为空) 数据库默认字段基本都是字段为空&#xff0c;但是实际开发时&#xff0c;尽可能…...

相互带节奏

有些单词在发音方面是相互带节奏的 【1】 broccoli n.西兰花Berklee n.伯克利 Berklee College of Music 伯克利音乐学院 【2】 college n.大学&#xff0c;学院colleague n.同事&#xff0c;僚 league n.联合会&#xff0c;联赛&#xff1b;联盟&#xff0c;同盟 【3】…...

秒懂虚拟化(二):服务器虚拟化、操作系统虚拟化、服务虚拟化全解析,通俗解读版

秒懂虚拟化&#xff08;一&#xff09;&#xff1a;从概念到网络、存储虚拟化全解析&#xff0c;通俗解读版-CSDN博客这篇文章学习了虚拟化的概念、网络虚拟化和存储虚拟化&#xff0c;本节将继续学习服务器虚拟化、操作系统虚拟化、服务虚拟化。 1、服务器虚拟化 服务器虚拟…...

ubuntu 配置OpenOCD与RT-RT-thread环境的记录

1.git clone git://git.code.sf.net/p/openocd/code openocd 配置gcc编译环境 2. sudo gedit /etc/apt/source.list #cdrom sudo apt-get install git sudo apt-get install libtool-bin sudo apt-get install pkg-config sudo apt-install libusb-1.0-0-dev sudo apt-get…...

优化 MySQL 的慢查询

文章目录 1. 分析慢查询日志2. 优化查询语句3. 优化表结构4. 调整服务器参数5. 数据库引擎选择6. 缓存策略7. 定期维护数据库 1. 分析慢查询日志 首先&#xff0c;要开启 MySQL 的慢查询日志&#xff0c;以便能够记录执行时间超过阈值的查询语句。可以通过修改 MySQL 配置文件…...

【机器学习】聚类评价指标之福尔克斯–马洛斯指数(Fowlkes–Mallows Index, FMI)

福尔克斯–马洛斯指数&#xff08;Fowlkes–Mallows Index, FMI&#xff09;是一种用于评估聚类结果与实际标签之间一致性的指标。FMI 值可以用于衡量聚类的准确性&#xff0c;特别是在有真值标签的监督评估场景中。 计算公式 FMI 的计算基于以下公式&#xff1a; 其中&#…...

vue3模板引用ref

1.访问模板引用 要在组合式 API 中获取引用&#xff0c;我们可以使用辅助函数 useTemplateRef() 只可以在组件挂载后才能访问模板引用 <script setup> import { useTemplateRef, onMounted } from vue// 第一个参数必须与模板中的 ref 值匹配 const input useTempla…...

20250111英语学习

place check in window seat; aisle seat boarding pass 登机牌 boarding pass depart from terminal C Gate 4 (Gate door entre to the plane) place : Check in window seat boarding pass 登机牌 depart from terminal C Gate 4 (Gate door entre to the plane) you…...

【Rust自学】11.6. 控制测试运行:并行和串行(连续执行)测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.6.1. 控制测试的运行方式 cargo test和cargo run一样&#xff0c;cargo test也会编译代码并生成一个二进制文件用于测试&#xff0c;…...

CSS3 弹性盒子

CSS3 弹性盒子 介绍 CSS3 弹性盒子&#xff08;Flexbox&#xff09;是一种用于布局设计的强大工具。它提供了一种更加高效的方式来对容器内的子元素进行排列、对齐和分配空间。Flexbox 的设计目标是提供一种统一的布局模型&#xff0c;能够适应不同屏幕尺寸和设备类型&#x…...

LabVIEW 系统诊断

LabVIEW 系统诊断是指通过各种工具和方法检测、评估、分析和解决 LabVIEW 程序和硬件系统中可能存在的故障和性能问题。系统诊断不仅涵盖软件层面的调试与优化&#xff0c;还包括硬件交互、数据传输、实时性能等方面的检查和分析。一个成功的系统诊断能够显著提升LabVIEW应用程…...

UE5中制作地形材质

在创作大场景内容时&#xff0c;地形的设计和优化是至关重要的一步。利用UE中的地形系统&#xff0c;开发者能够高效地创建复杂的地形形态&#xff0c;同时保持游戏的性能和视觉效果。 1.在创建地形之前&#xff0c;先新建一个地形使用的混合材质球&#xff0c;添加节点Landsc…...

【题解】AT_abc388_e AtCoder Beginner Contest ABC388 E Simultaneous Kagamimochi

题目大意 题目传送门——原题面链接 建议阅读本次比赛 C 题题面。 有 N N N 块米糕&#xff0c;按大小升序排列&#xff0c;第 i i i 块米糕的大小为 A i A_i Ai​。 现在定义“堆叠式米糕”如下&#xff1a; 首先&#xff0c;选出两个米糕 A A A 和 B B B&#xff0…...

2025年01月11日Github流行趋势

项目名称&#xff1a;xiaozhi-esp32 项目地址url&#xff1a;https://github.com/78/xiaozhi-esp32项目语言&#xff1a;C历史star数&#xff1a;2433今日star数&#xff1a;321项目维护者&#xff1a;78, MakerM0, whble, nooodles2023, Kevincoooool项目简介&#xff1a;构建…...

Uniapp中实现加载更多、下拉刷新、返回顶部功能

一、加载更多&#xff1a; 在到达底部时&#xff0c;将新请求过来的数据追加到原来的数组即可&#xff1a; import {onReachBottom } from "dcloudio/uni-app";const pets ref([]); // 显示数据function network() {uni.request({url: "https://api.thecatap…...