2021年.Net中级开发工程师面试题
心之所向,勇往直前!
记录面试中的那些小事。面试题只是一道门,最好还是走进屋里看看。
正文
请解释什么是强类型、弱类型
强类型:指定明确的数据类型,如: int a = 1
弱类型:没有指定明确的数据类型,会在程序运行的时候解析数据类型,如: var a = 1
你是如何保证系统是高可用的(结合自己项目讲解最好,不一定需要行业内很复杂的方案)
高可用就是减少程序停机的可能性,常用做法是负载均衡 + 集群。
a. nginx负载均衡 + 前后端分离 + api微服务 + 集群
b. redis可以启用哨兵模式或者cluster
c. mq集群
d. 数据库主从
什么情况下会产生死锁
当两个进程同时竞争相同资源时,如在a中获取1号资源后加锁再获取2号资源,同时b先获取2号资源加锁,再去获取1号资源,两者会进入死锁状态。
a. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用
b. 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放
c. 占有申请条件:进程自己已经至少保持一个资源,又请求其他资源,但是这个资源被其他进程占有,而且又不释放自己已经占有的资源
d. 循环等待条件:发生死锁时,必定会形成一个进程——资源的环路。
如何避免死锁的发生?
a. 尽量让事务按顺序执行。
b. 将大事务拆成多个小事务执行
c. 读写分离
d. 避免编写需要用户交互的事务
什么是乐观锁、悲观锁?
乐观锁:假设数据一般情况不会造成冲突,通过给数据添加version列来实现并发控制
悲观锁:数据库锁,具有极强的独占、排他性。比较少用。
- 共享锁:也称读锁,多个事务中只能读不能改
- 排他锁:也称写锁,获取到锁的事务拥有读和写的权限,其他事务不能再获取资源的一切锁
什么是脏读、幻读、不可重复读,如何避免?
脏读:指一个事务中访问到了另外一个事务未提交的数据,当事务a出现回滚时,事务b的读取到的将是脏数据(被事务a修改过的)
幻读:指一个事务中两次相同的查询,得到的数据量不一致
不可重复读:指一个事务两次相同的查询,得到的结果不一致
你都了解哪些orm?
entity framework,dapper,nhibernate
你都了解哪些mq?
a. activemq
b. rocketmq
c. rabbitmq
d. kafka
一般什么业务场景下会使用mq
使用mq是为了解耦、异步、消峰。
a. 系统只能承受2000人并发,但出秒杀活动时出现5000并发,此时使用队列可让多余的请求等待。
b. 有多个系统需要同时获取相同数据的时候
如何保证mq的幂等性(不会重复消费)
a. 在写库时先查询一次是否已经存在,存在则update
b. 如果是set到redis中具有天然幂等性
c. 主键唯一
如何保证mq的可靠性(不会丢失数据)
a. 生产阶段:要捕获消息发送错误,并重发消息
b. 储存阶段:数据持久化,集群
c. 消费阶段:确认业务逻辑都完成后再发送确认消息
mq消息积压如何处理
a. 部分业务可以采取限流操作,减少消息的产生
b. 对broker进行扩容处理
c. 增加消费端
你都了解哪些数据库?
a. access:基于windows的关系型小型数据库。数据量大会出现性能问题
b. sqlite:开源、轻量级嵌入式数据库、简单配置、无需安装
- 不支持高并发
- 适用数据量小
c. mysql: 关系型、体积小、查询速度快,支持上千万数据量查询
- 不是完全开源免费
d. sqlserver:功能全面,商业型数据库,windows server部署时优先选用
e. oracle:功能全面,商业型数据库,大型项目/linux部署优先选用
f. mongodb:开源、文档型nosql数据库,查询性能极高,有丰富的社区支持
- 不支持事务
- 占用磁盘
知道数据库索引类型有哪些吗?
a. 聚集索引:聚集索引全表只能有一个,比如主键
b. 非聚集索引:可以有多个
使用索引的优缺点
a. 优点:提升查询速度
b. 缺点:增加维护成本,降低增、删、改速度
你了解过哪些缓存技术?
a. redis
- 单线程
- 支持多种数据类型:list、set、hash、string、zset
- 支持持久化rdb和aof两种模式
- 支持事务
b. memcached
- 多线程
- 支持key-value型
- 不支持持久化,可靠性低
- 通过cas命令保证数据一致性
结语
本篇到此结束,如果有任何疑问或者指正,请发表在评论区。