C#软件工程师、 .NET、 上位机软件开发工程师秋招面经八股汇总 及心得

博主从七月到十月底一共投了142家企业,流程走完的有9家,收到7个offer,目前三方已签,很满意签约的公司,现在把这几个月我遇到常见问题写下来,希望能帮助到大家。

心得:我碰到的八股都是基于我简历上的项目来的,比如我的温室监控系统用的tcp,面试官就会问这个;我用到了数据库,面试官就会问数据库优化以及你的优化方案。建议在自己的项目经历里写上自己拿手的关键词引导面试官去问,同时自己的项目准备几个优化方案,比如组网的方案、数据库优化方案(硬件层面、软件编写方面)、通信协议等等,等到面试官问你为什么这么做的时候就可以把几个方案一罗列,然后为什么选择这个(成本低、上手容易、功耗低啥的),比如我给我的温室监控系统项目写的(面试官就着你的项目冷不丁问个八股,我遇到的都是这样):

针对于整个系统的优化考虑:

1.首先是考虑系统的并发压力:主要是硬件终端与上位机之间的传输

每一个温室共有21个采集结点(8个温度采集节点(四个角的空气和土壤)、8个湿度(同温度一样)、5个光强(四个角和中心))和9个控制节点,为了方便节点管理和日后节点的增加,在底层方面我们采用的是星型结构来组网(问组网方式以及为什么用星型组网?星型:星型结构是以中央节点作为核心,其他节点都连接至中央节点上,这种结构的成本较高、可靠性较低,但是其延迟小、结构简单便于管理。,每个温室有一个中央节点,总中央节点与我们系统进行通信,这样在与硬件终端通信方面,我们只要创建一个线程来接收数据即可(多串口的话,每个串口都需要一个线程来传输),减少上位机与终端直接的并发量。(问为什么用lora,当时考虑物联网应用方面,一是nbIoT的频段要收钱;二是应用场景在室内,组网距离不大,数据量也不算大,lora更适合;三是lora设备的能耗更低)(考虑串并行的问题,我们对数据没有很高的时效性要求,节点每隔10分钟传输一次数据,更多的是考虑成本和稳定性问题,所以我们采用串行方式)(串口通信:RS-485,优点:支持多站,全双工,最大传输速率为10mbps)

在客户端和服务端的连接上,考虑到管理员人数和指令下达的需求,选用的是tcp方式(TCP与UDP区别?为什么用TCP?粘包了解过吗),用一个监听线程来监听客户端的连接请求,宏观上达到一对多的连接方式(下指令要互斥)。

2.对读写数据库的优化(被问的太多了,其实想想也正常,比较企业里数据管理很重要)(并发量、代码优化):

当高并发压力来袭的时候,通常不会是数据库先扛不住了,而是业务系统所在机器抗不住了,底层采用星型结构将底层数据的并发压力做到最低,这时候的关键就是我的系统处理每个业务请求的时候,他是会读写多次数据库的,所以业务系统的一次请求可能会导致数据库有多次请求,也正因为这样,所以此时可能你的数据库并发压力会到几千的样子(增加数据库的并发压力)。

对此我从架构和代码两个方面提出优化方案:

架构层面:

一、根据业务系统拆分多个数据库机器优化方案。第一个根据节点功能不同将数据库进行拆分,将采集信息和控制信息分开存储,减轻数据库机器的压力。

二、读写分离。给每个数据库挂一个从库,让主数据库基于binlog数据更新日志同步复制给从数据库,让主从数据库保持数据一致,然后我们的系统其实可以往主库里写入,在从库里查询,此时就又可以缓解原来的主数据库的压力了。

三、分库。分库分表,就是把主库拆分为多个库,每个库里放一个表的部分数据,然后用多个主库抗高并发写入压力,这样就可以再次分散我们的压力了。

代码方面:

一、在insert语句方面,一条语句插入多个值,拼接values使用StringBuilder(速度快但线程不安全,因为采用的底层结构特点,只需要一个接收线程即可)

二、关闭autocommit,设定一个任务集合,当任务达到一个阈值(比如50)的时候,手动提交。

但是数据写入间隔是五分钟,由于实际要求自动提交就可以了,只需要将一个温室的数据(温室id和其余数据)拼接成一条语句写入即可。

最大承载量方面没有精确计算,当时十个温室,运行一个月,每个5分钟一条数据,产生了快十万条数据,然后后面就没看了。

计算数据库大小:

单条数据大小:1*10+4*21+8=102个字节

温室id、21个采集节点、9个控制节点、时间

TINYINT (占1个字节)(用于温室id和控制节点(开关只用01(控制量)表示)(数据库没有bool类型))、float型(占4个字节)(21个采集结点)、datetime(占8个字节)(存储时间)

10个温室每隔五分钟采集一次数据,运行了一个月,大概产生快10万条数据,占存储空间10MB(查看表容量是10MB)

以下问题都是我在面试过程中遇到的八股,供大家参考:

一、值引用和地址引用的区别(值类型和引用类型什么区别)(简单记传值和传址)

1.值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。

2.值类型存取速度快,引用类型存取速度慢。

3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用

  • 28
    点赞
  • 207
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

健身版程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值