【NET】高级开发面试题总结(2025)

面试要求汇总

1.熟悉winform优先、要求具备一定图形算法能力。
2.熟悉TCP/IP、EtherCAT、CAN、RS485、RS232网络协议,熟练掌握网络编程技术及多线程技术、进程处理技术,具有很强的编码、调试和解决问题能力;
3.对并发(多线程、并行计算)、I0有深入的理解,能够根据业务需求权衡不同的技术路线
4.精通C#语言,精通Task、异步编程、LNQ语法、委托和C#各版本新特性,有C/S架构设计经验和多用户并发编程经验;
5.精通wpf界面设计,精通组件式开发框架,熟悉Prism/mvvmLight框架,熟悉各种第三方控件/库,如DevExpress、SciChart等;
6.熟悉Tcp/Udp通信,了解DDS/反射内存1394/1553/FC/CAN总线等:
7.实现串口/1394/1553/CAN(总线等航电系统开发经验)等信号数据采集、存储与解析曲线绘制、场景回放等:
8.了解车载总线协议如CAN、UDS、XCP 以太网等协议;熟悉CANoe/CANape等车载软件者优先。
9.对Amazon Web Services,Azure, 阿里云有深入了解,且有项目经验。
10.离线数仓构建、实施流处理、用户点击量分析、Hadoop、Hive、Kafka、Spark、Flink 百万级?

面试问题总结

一、某科技(成都)有限公司
1.自我介绍:开发过的项目以及所在公司、采用了哪些技术?
2.IO管理包含哪几个核心模块?

答:
(1)、设备驱动程序(Driver)
功能:设备驱动程序是IO管理的核心组件,它负责控制和管理硬件设备,使操作系统能够与这些设备进行通信和数据交换。
类型:根据设备的不同,设备驱动程序可以分为多种类型,如磁盘驱动程序、打印机驱动程序、网络通信驱动程序等。

(2)、中断处理(Interrupt Handling)
功能:中断处理模块负责处理来自硬件设备的中断信号。当中断发生时,中断处理模块会暂停当前正在执行的程序,转而执行相应的中断处理程序,以响应设备的需求。
机制:中断处理通常包括中断请求、中断响应、中断处理和中断返回等步骤。

(3)、缓冲技术(Buffer Management)
功能:缓冲技术用于在数据输入和输出过程中暂时存储数据,以减少数据传输的延迟和提高数据传输的效率。
类型:缓冲技术可以分为单缓冲、双缓冲和循环缓冲等多种类型。

(4)、设备分配与回收
功能:设备分配与回收模块负责在多个进程之间分配和回收硬件设备资源。它确保每个进程在需要时都能获得所需的设备资源,并在使用完毕后及时释放资源。
策略:设备分配策略通常包括先来先服务、优先级分配等。

(5)、错误处理(Error Handling and Recovery)
功能:错误处理模块负责检测和处理在IO过程中发生的错误和异常情况。它确保系统能够及时发现并纠正错误,以保证数据的完整性和系统的稳定性。
方式:错误处理通常包括错误检测、错误报告和错误恢复等步骤。

(6)、IO调度(IO Scheduler)
功能:IO调度模块负责根据设备的优先级和当前系统的负载情况,对IO请求进行调度和排序。它确保系统能够高效地处理IO请求,以提高系统的整体性能。
算法:IO调度算法有多种,如先来先服务(FCFS)、最短寻道时间优先(SSTF)、电梯算法(SCAN)等。

3.NET微服务后台如何做负载均衡?

答:负载均衡(Load Balance)是指将并发的用户请求通过一定规则平衡、分摊到多台服务器上进行执行,以此达到压力分摊、数据并行的效果。负载均衡可以提高系统的可用性、性能和安全性,是微服务架构中不可或缺的组件。
(1)、DNS层负载均衡
通过智能解析域名,将用户请求分配到不同的服务器或集群上。
这种方式简单但不够灵活,且负载均衡的粒度较粗,通常用于全局负载均衡或作为其他负载均衡方式的补充。

(2)、LVS层负载均衡
LVS(Linux Virtual Server)是一种基于Linux系统的四层负载均衡解决方案。
它通过修改数据包的目标地址和端口,将用户请求转发到后端服务器,然后再将响应数据包转发回用户。
LVS支持多种工作模式和调度算法,可以根据不同的场景进行选择和组合使用。
但LVS只能实现四层的负载均衡和路由转发,不能实现七层的内容分发和应用逻辑处理。

(3)、Nginx层负载均衡
Nginx是一种基于C实现的高性能Web服务器和反向代理服务器。
它可以通过配置实现七层的负载均衡和反向代理。
Nginx支持多种负载均衡算法,如轮询、加权轮询、IP哈希、URL哈希等。
Nginx还可以实现静态资源服务、缓存服务、安全防护等功能。
但Nginx同样只能实现七层的负载均衡,不能实现四层的负载均衡和路由转发。

(4)、API网关层负载均衡
通过API网关中间件,如Kong,实现对微服务API的统一入口和管理。
API网关可以处理跨域请求、身份验证、流量控制、熔断降级等功能。
它还可以根据路由规则将请求转发到不同的微服务实例上,实现负载均衡。

(5)、服务注册中心层负载均衡
通过服务注册中心中间件,如Consul或Eureka,实现对微服务实例的发现和健康检查。
服务注册中心可以维护一个可用的微服务实例列表,并根据健康检查结果来过滤不可用的实例。
客户端可以通过服务注册中心获取可用的微服务实例列表,并根据一定的策略(如轮询、随机等)来选择要调用的实例。

(6)、RPC层负载均衡
通过RPC框架,如gRPC或WebApiClient,实现对微服务之间的远程调用和隐藏请求细节。
RPC框架通常内置了负载均衡机制,可以根据服务实例的负载情况、响应时间等因素来选择最优的实例进行调用。

(7)、中间件层负载均衡
通过与服务注册中心集成的中间件,如Fabio,实现对微服务地址列表的负载均衡请求转发。
这种方式通常用于更细粒度的负载均衡,如根据请求的路径、参数等信息来选择要调用的微服务实例。

4.异步编程有哪几种实现方式(Thread Task 信号量,多线程锁)?

(1)、异步方法 async Task wait
(2)、Task.Run方法 await Task.Run(()=>{});
(3)、Parallel并行编程,并行循环Parallel.For()、Parallel.Foreach()
(4)、通过事件(Event)异步调用

public class AsyncOperation
{
   
   
    public event EventHandler Completed;
 
    public void Start()
    {
   
   
        // 模拟异步操作
        Task.Delay(1000).ContinueWith(task => {
   
   
            OnCompleted(new EventArgs());
        });
    }
 
    protected virtual void OnCompleted(EventArgs e)
    {
   
   
        Completed?.Invoke(this, e);
    }
}
// 调用异步操作
var operation = new AsyncOperation();
operation.Completed += (sender, e) => {
   
   
    Console.WriteLine("异步操作完成!");
};
operation.Start();

(5)、使用异步委托(Async delegate)

public class AsyncOperation
{
   
   
    public async Task<int> StartAsync()
    {
   
   
        // 模拟异步操作
        await Task.Delay(1000);
        return 42;
    }
}
// 调用异步操作
var operation = new AsyncOperation();
var result = await operation.StartAsync();
Console.WriteLine($"异步操作完成,结果为:{
     
     result}");

(6)、使用异步的 LINQ(LINQ with async)

var numbers = Enumerable.Range(1, 10);
 
// 异步筛选出偶数
var evenNumbers = await Task.Run(() => numbers.Where(n => n % 2 == 0));
 
Console.WriteLine("筛选出的偶数为:");
foreach (var number in evenNumbers)
{
   
   
    Console.WriteLine(number);
}

5.Linq底层原理是采用了什么技术?
(1)、表达式树
(2)、Lambda表达式转译
(3)、扩展方法(Extension Methods)

6.项目开发中使用的分库分表工具(ShardingSphere-Proxy)
1、ShardingShpere
2、MyCat

7.项目开发中常用的设计模式有哪些?

(1)、单例模式
(2)、抽象工厂
(3)、建造者模式
(4)、原型模式
(5)、适配器模式
(6)、桥接模式
(7)、装饰模式
(8)、责任链模式

8.Hbase数据库、ClickHouse、Elasticsearch、MongoDB开发使用经验?
  • Hbase

    • 是什么: 建立在HDFS之上的分布式、可伸缩的NoSQL数据库。

    • 数据模型: 宽列存储。数据按行键排序存储,每行包含多个列族,列族下包含多个列。强一致性(单行内)。

    • 特点: 低延迟的随机读写访问(基于行键)、强一致性(单行)、高可扩展性、面向列族存储。Schema-on-Write(写入时定义模式)。

    • 性能: 低延迟的随机读写(毫秒级),适合实时访问特定行。但复杂查询(如多行范围扫描、JOIN)性能相对较差。存储成本中等。

    • 使用场景: 需要随机实时读写的场景(如用户画像、在线推荐系统的特征存储)、时序数据(如设备监控数据)、消息/通信记录、作为Hadoop生态的实时读写入口。

  • ClickHouse

    • 是什么: 一个开源的列式联机分析处理数据库管理系统。

    • 特点: 极致高性能的OLAP查询、真正的列式存储(不仅存储列式,计算也是向量化引擎)、数据压缩率高、支持实时数据插入、SQL支持良好(有特定方言)、线性可扩展、单表查询性能极佳。

    • 性能: 极低的查询延迟(亚秒到秒级),极高的吞吐量,特别擅长大宽表的聚合分析。对JOIN支持相对较弱(尤其是大表JOIN),更擅长星型/雪花模型的事实表查询。

    • 使用场景: 实时分析、用户行为分析、广告/营销分析、监控和遥测数据分析、BI报表、需要亚秒级响应的交互式仪表盘、时序数据分析(替代InfluxDB等)。

  • Elasticsearch

    • 是什么: 一个基于Apache Lucene构建的分布式、RESTful搜索和分析引擎。

    • 核心功能: 全文搜索、结构化搜索、分析、日志处理(ELK Stack核心)。数据模型是JSON文档。

    • 特点: 近实时搜索、强大的全文检索能力(分词、相关性评分)、灵活的Schema(动态映射)、聚合分析能力强大、水平扩展性好。

    • 性能: 低延迟的搜索和分析(毫秒到秒级),尤其擅长文本搜索和聚合。写入吞吐量高(近实时)。复杂JOIN和事务支持不是其强项。存储成本相对较高(因索引开销)。

    • 使用场景: 应用程序搜索(电商、内容平台)、日志和指标分析(ELK/EFK)、安全分析(SIEM)、全文检索、复杂文本分析、实时应用监控、需要灵活Schema和强大搜索/聚合的场景。

  • 用HDFS/S3存储原始数据湖。

  • 用Hive/Spark进行大规模ETL和批处理。

  • 用ClickHouse提供实时分析报表和用户行为分析。

  • 用Elasticsearch处理日志搜索、应用监控和安全分析。

  • 用HBase存储需要实时访问的用户特征或状态。

  • 用Snowflake构建企业级统一分析平台,融合湖仓能力。

  • 用Kafka作为实时数据流管道连接各个组件。

9.常见IoT物联网协议:ModBus、Bacnet、Opc UA、Can、Rs485、Rs232协议、MQTT协议
二、MySql数据库篇
1.MySql事务特性有哪些?

答:ACID
原子性(Atomicity):事务是一个不可分割的工作单位,事务中的所有操作要么全部成功,要么全部失败。如果其中一个操作失败,整个事务会被回滚到开始前的状态‌;
一致性(Consistency):事务必须保持数据库的一致性状态,即从一个有效状态转换到另一个有效状态。事务执行前后,数据库的完整性必须保持不变‌;
隔离性(Isolation):事务的隔离性确保一个事务的执行不受其他事务的影响。通过设置不同的隔离级别,可以控制事务间可见的数据修改程度。常见的隔离级别包括读未提交、读已提交、可重复读和串行化‌;
持久性(Durability):一旦事务提交,其对数据库的修改就是永久性的,即使系统发生故障也不会丢失。这意味着事务提交后的数据会永久保存在数据库中‌;

2.MySql中Innodb用的什么存储结构,B加数和B数有什么区别?

答:MySql中Innodb用的是B加数、B加数和B数的区别主要有2点,第一点区别是B加数的数据是存在于叶子结点的,非叶子节点只存储键(key)和指向子节点的指针,B数的数据是存放在所有的结点;
第二个区别是B加数的叶子节点它是一个双向链表;B加数的这样一个设计(减少存储空间),可以让数的高度变低,减少IO的次数。

3.MySql中存储引擎有哪些?

答:MySql中存储引擎有5个,那主要的是包括我们熟悉的InnoDB以及像MyISAM,还有就是MEMORY,还有MERGE、NDB

4.分库分表会带来哪些问题?有哪些成熟的分库分表中间件?

答:分库分表会带来一下几个问题
(1)、实物问题:分库分表后,假设2个表之前是存在于不同数据库中,那么本地事务就会失效,这时候就要用到分布式事务。
(2)、常见的跨库关联,比如跨节点的Join 的一个问题,要解决这样一个问题的话,可以采用2次查询的一个方式。
(3)、面临一些像排序的问题,比如跨节点的count、order by 、group by以及聚合函数的问题,要解决这些问题的话,我们可以在各个节点得到对应的数据,然后在程序段进行合并。
(4)、面临的一个分页的问题:分页问题的话主要有2种解决方案,第一就是我们可以通过在每个节点上得到对应的一个结果,然后在代码端进行一个分页,
或者说我们可以直接把这个问题抛给前段,但是前段会面临一个数据空的问题。
(5)、分库分表面临的是一个分布式ID,数据被切分之后的话,不能够依赖数据库自身的一个组件生成机制了。这时我们可以采用像UUID,或者雪花算法这些方式来生成分布式ID

分库分表中间件主要有2类:第一类主要是代理模式,代理模式的话需要一个代理服务器
第二种是非代理模式:常用的分库分表中间件有ShardingSphere、MyCAT、淘宝TDDL、360的像Atlas、 阿里的cobar(已逐渐被淘汰)。

5.MySql中的锁有哪些?

答:MySql中的锁分为乐观锁和悲观锁,我们常说的mysql锁主要集中在悲观锁,悲观锁又分为全局锁、表锁、行锁;表锁又分为共享读锁、表共享一个写锁,甚至说我们还有一项元数据锁,以及像意向锁
那行级锁包括像我们常见的一些行锁,包括行的共享锁、行的排它锁、以及像间隙锁、临键锁这些。

6.分布式系统中,多年以前的数据怎么处理?

答:很少会去查询3年前的数据,所以方案中采用冷热数据分离,冷数据(3年以前的数据)存放在elasticsearch、hadoop这些数据库中;3年以内的数据我们放在数据库里面进行存储。

7.分布式系统中,如何查询某一段时间的订单?

答:我们可以把数据放在ES、或者Hive(Hive是一个基于Hadoop一个数据仓库工具)这些数据库里面,这样就可以很方便的进行数据查询了。

8.MySql为什么加索引能加快查询速度?

答:索引的本质就是一个数据结构,数据结构有很多,比如各种树、Hash、哈希表;
数据结构有一个最大的用途就是提升数据查找的速度。

二、某科技(成都)有限公司

1、对多线程了解?Thread和Task有啥区别?

答:(1)基于不同的框架和API:
Thread是基于Windows操作系统提供的API实现。
Task则是基于.NET框架提供的TPL(Task Parallel Library)实现。

(2)默认执行线程池:
Thread默认使用前台线程。
Task默认使用后台线程。

(3)异步执行:
Thread不支持异步执行。
Task支持异步执行。

(4)异常处理:
Thread需要在每个线程中处理异常。
Task提供了更好的异常处理机制。

(5)任务调度器:
Thread没有任务调度器。
Task提供了任务调度器,可以控制任务的并发性和调度方式。

(6)返回值:
Thread没有返回值。
Task可以有返回值。

2、什么是缓存击穿、缓存穿透、缓存雪崩,如何解决?

答:(1). 缓存击穿
定义:某个热点数据在缓存中过期时,大量请求同时涌入数据库,导致数据库压力骤增。

解决方案:

永不过期:对热点数据设置永不过期,通过后台更新缓存。

互斥锁:缓存失效时,使用互斥锁确保只有一个请求访问数据库并更新缓存,其他请求等待。

(2). 缓存穿透
定义:大量请求查询不存在的数据,导致请求直接打到数据库,造成压力。

解决方案:

布隆过滤器:使用布隆过滤器快速判断数据是否存在,不存在则直接返回。

缓存空值:即使查询结果为空,也将空值缓存,并设置较短的过期时间。

(3). 缓存雪崩
定义:大量缓存同时失效,导致所有请求直接访问数据库,数据库压力过大甚至崩溃。

解决方案:

分散过期时间:为缓存设置随机的过期时间,避免同时失效。

高可用架构:使用分布式缓存或集群,确保部分节点失效时系统仍能运行。

限流降级:在缓存失效时,通过限流和降级保护数据库。

3、介绍一下GC垃圾回收机制?

答:(1)、基本概念
GC负责跟踪应用程序中不再使用的对象,并释放这些对象占用的内存。这种机制大大简化了内存管理任务,使得开发者能够更专注于编写业务逻辑代码,而无需过多关注内存分配和释放的细节。

(2)、工作原理
C#的垃圾回收器使用了一种称为“标记-清除”(Mark-and-Sweep)的算法,其工作原理如下:

标记阶段:垃圾回收器从根对象(通常是静态变量、线程栈上的局部变量、CPU寄存器中的引用等)开始,递归地访问这些对象引用的所有其他对象。被访问到的对象会被标记为“可达”或“存活”对象,表示这些对象仍然在使用中。
清除阶段:垃圾回收器会遍历堆内存,找到所有未被标记为可达的对象(即垃圾对象),并释放这些垃圾对象占用的内存空间,以供将来分配新的对象使用。
此外,在某些实现中,垃圾回收器还可能包括一个“压缩”阶段,即移动存活的对象,使它们重新从堆基地址开始连续排列,类似于磁盘空间的碎片整理。这样可以避免内存碎片问题,但移动对象会有一定的性能开销。

(3)、分代回收
C#的垃圾回收器是一种分代式垃圾回收器,它将对象按照其存活时间分为0代、1代和2代三个代数,每个代数有自己的内存区域。一般来说,0代对象的生命周期最短,2代对象的生命周期最长。垃圾回收器在进行垃圾回收时,会优先回收0代对象,然后是1代对象,最后是2代对象。这样可以提高垃圾回收的效率和性能。

(4)、并发回收
C#的垃圾回收器是一种并发式垃圾回收器,它可以在用户线程运行的同时进行部分垃圾回收工作,从而减少用户线程被暂停的时间。这有助于提高应用程序的响应速度和用户体验。
(5)、回收模式
C# GC有两种并发模式:工作站模式和服务器模式。工作站模式适用于单处理器或客户端应用程序,服务器模式适用于多处理器或服务器应用程序。此外,C# GC是一种可配置的垃圾回收器,它可以根据应用程序的需求和环境来调整垃圾回收的策略和参数。

4.MySql为什么要分区?分区语法怎么写?

答:在 MySQL 中,分区是一种将表的数据分割成更小、更可管理的部分的技术。分区可以提高查询性能、简化管理和维护,以及支持更高效的备份和恢复操作。MySQL 支持多种分区类型,包括 RANGE、LIST、HASH 和 KEY 分区。

  1. RANGE 分区
    RANGE 分区根据列值的范围将数据划分到不同的分区中。
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
)
PARTITION BY RANGE (column_or_expression) (
    PARTITION partition_name1 VALUES LESS THAN (value1),
    PARTITION partition_name2 VALUES LESS THAN (value2),
    ...
);
示例:

sql
CREATE TABLE sales (
    id INT,
    amount DECIMAL(10, 2),
    sale_date DATE
)
PARTITION BY RANGE (YEAR(sale_date)) (
    PARTITION p0 VALUES LESS THAN (2000),
    PARTITION p1 VALUES LESS THAN (2005),
    PARTITION p2 VALUES LESS THAN (2010),
    PARTITION p3 VALUES LESS THAN (2015),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);
  1. LIST 分区
    LIST 分区根据列值的列表将数据划分到不同的分区中。
sql
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
)
PARTITION BY LIST (column_or_expression) (
    PARTITION partition_name1 VALUES IN (value1, value2, ...),
    PARTITION partition_name2 VALUES IN (value3, value4, ...),
    ...
);
示例:

sql
CREATE TABLE customers (
    id INT,
    name VARCHAR(50),
    region VARCHAR(20)
)
PARTITION BY LIST (region) (
    PARTITION pNorth VALUES IN ('North', 'Northeast'),
    PARTITION pSouth VALUES IN ('South', 'Southeast'),
    PARTITION pEast VALUES IN ('East'),
    PARTITION pWest VALUES IN ('West'),
    PARTITION pOther VALUES IN ('Unknown')
);
  1. HASH 分区
    HASH 分区根据列值的哈希值将数据划分到不同的分区中。
sql
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
)
PARTITION BY HASH (column_or_expression)
PARTITIONS number_of_partitions;
示例:

sql
CREATE TABLE employees (
    id INT,
    name VARCHAR(50),
    department VARCHAR(50)
)
PARTITION BY HASH (id)
PARTITIONS 4;
  1. KEY 分区
    KEY 分区类似于 HASH 分区,但 MySQL 会自动管理分区键。
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
)
PARTITION BY KEY (column_or_expression)
PARTITIONS number_of_partitions;
示例:

sql
CREATE TABLE orders (
    order_id INT,
    customer_id INT,
    order_date DATE
)
PARTITION BY KEY (order_id)
PARTITIONS 4;
5.Linux用过哪些版本系统?做过哪些优化配置?

答:

echo "——>>> 关闭防火墙与SELinux <<<——"
sleep 3
systemctl stop firewalld
systemctl disable firewalld &> /dev/null
setenforce 0
sed -i '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪小白JIY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值