这些问题是我这半个月经常被问到的问题,今天做了一个总结,希望对找工作的小白能有些帮助。
一、基础问题
- 反射的概念及应用场景
概念:使用字符串的类名或者方法名, 通过反射创建相应的对象或者调用相应的方法
应用场景:单个接口对应多个实现,多个接口和多个实现类
- 委托
概念:委托类似方法指针,可以实现把方法当参数来使用,委托是引用类型。声明一个委托需要使用关键字 delegate
委托可以同时与多个方法绑定,这种特性叫做委托的多播性,与方法绑定的时候可以用+=来把方法添加到委托中
- 泛型
概念:泛型泛指任何类型, 它可以让你把类型当做参数来使用。它的出现主要是为了解决拆箱和装箱产生的性能问题。
- Ado五大对象
Connection(连接对象):与数据源建立连接。
DataAdapter(适配器对象):对数据源执行操作并返回结果,在DataSet与数据源之间建立通信,将数据源中的数据写入DataSet中,或根据DataSet中的数据绑定数据源。
DataSet(数据集对象):内存中的数据库,是数据表的集合,它可以包含任意多个数据表。
Command(命令对象):对数据源执行SQL命令并返回结果。
DataReader(数据流对象):取数据源的数据,只允许对将数据源以只读、顺向的方式查看其中所存储的数据。其常用于检索大量数据,DataReader对象还是一种非常节省资源的数据对象。
- 页面之间传值的方式
QyertString(就是url上面?xx=xxx&yy=yy)、Form表单、Session、Cookie、Application、Server.Transfer、window.localStorage(基于Html5)、Cache、数据库。
- 面向对象三大特性
封装:封装就是指把一些相同功能或者是特点放在一起,成为一个类或者方法等,以便容易的重用,并且更容易提升它们的安全性。
继承:子类继承父类,子类可以调用父类任意方法。
多态:态大概分为对象多态和行为多态对象多态就指的是重写和覆盖,就是父类被子类重写或者覆盖后表现出来的多种形态。
- .netcore依赖注入对象的三种生命周期
单例模式,服务在第一次请求时被创建,其后的每次请求都沿用这个已创建的服务。我们不用再自己写单例了。
Scoped
作用域模式,服务在每次请求时被创建,整个请求过程中都贯穿使用这个创建的服务。比如Web页面的一次请求。
Transient
瞬态模式,服务在每次请求时被创建,它最好被用于轻量级无状态服务
- 高并发
高并发是指大量的同时发生的事件。在互联网,一般是指大量的请求。它会引发访问慢,服务器压力大等很多问题。解决高并发可以从几个方面入手: 从客户端(浏览器端、或者手机端)、从服务端、从数据库层面。
怎么解决高并发:
(1)、加入缓存:如果是数据库压力大,而且对数据实时性要求不高可以考虑引入redis等缓存服务器,这个是解决高并发最常用的手段之一,因为redis是基于内存的,访问速度较快,而且利用缓存也可以把一些需要运算的并且比较固定的数据进行固化,这样也达到了提升请求速度的目的。
(2)负载均衡:如果是服务器压力大可以多台服务器负载均衡,(一般用nginx),均衡负载的时候,一定要注意用户的会话的一致性,比如Session。
(3)加入索引或者分表、分库、分服务:如果数据量特别大的话,并且查询比较多的话,可以考虑给合适的字段加索引, 在适合的情况下分表、分库、分服务。
分表可以用数据库自带的功能进行分表,SqlServer、MySql、Orcale等都自带对应的解决方案,这样分表的好处就是简单,方便。
也可以通过自己写算法进行分表、分库、分服务,比如使用HashMap算法。
还可以通过业务的分类不同进行分表、分库、分服务。
(4)如果是字段特别大,可以考虑引入全文检索,原理就是对大文本进行分词,并且建立索引。
总之解决高并发的主要手段就是分流并提升处理能力。
(5)在特殊业务逻辑下,可以引入消息队列,比如:秒杀业务、分布式事务
- MVC三层架构与原始三层的区别
MVC的目的则是实现Web系统的职能分工,即职责划分。
三层架构的目的着重点是:高内聚,低耦合”,即解耦。
其实职责划分也是解耦,但是三层架构侧重的是整体的一个解耦,而MVC侧重的是web系统的解耦。
- 五种访问修饰符
1.public:公有的 所有的类都可以访问
2.private:私有的 当前类内部可访问
3.protected:受保护的 当前类以及继承他的子类可访问
4.internal:内部的 只限于本项目内访问,其他的不能访问。
5.protected internal:内部保护访问 只能是本项目内部或子类访问 其他类不能访问
二、数据库(SQLserver)SQL的基本语法
1.左连接、右连接、内连接、全连接(左连接 ,右连接,内连接和全外连接的4者区别_灰太狼-优快云博客_左连接,右连接,内连接,外连接的区别)
left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。
full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。
原文链接:https://blog.youkuaiyun.com/weixin_39220472/article/details/81193617
2.Sql优化
3.视图和存储过程
存储过程就是将一组Sql存储起来,使其可以重用,它是预编译。存储过程经过第一次编译和Sql优化以后,再次调用就不需要再编译和优化,所以执行效率比较快。
存储过程的优点是:
预编译,先编译成机器语言, 在执行的时候就不需要在转换。执行速度很快
可以重复调用
节省网络流量
存储过程什么时候用?
当某些sql语句要重复多次调用的时候
当某些比较复杂的逻辑要在数据库层面进行执行和运算的时候
当sql语句比较大,需要做特殊性能优化的时候。
4.视图
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
创建视图语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
5.索引
索引分为聚集索引和非聚集索引,索引的主要目的就是提升查询效率
聚集索引一般都是主键,每行的数据都随着聚集索引一样的存储结构进行存储,所以聚集索引在每张表里只能有一个
非聚集索引是基于聚集索引的, 非聚集可以有多个.
有点类似我们书籍的目录,可以提升数据库的查询效率,但是要注意的是, 索引不能用于重复特别多和长度特别大的字段,索引的原理是二叉树、B树。
其实B树也是一种特殊的二叉树,主要是为了解决二叉树在数据量大的时候,层级太多的问题。
它会在一个叶子上放多个数据,这样它的层级就会低很多
索引不一定提升查询效率,索引适合建立在长度比较小、重复比较少、变化比较少的字段上
索引要在表数据量比较大的时候使用
索引会降低数据插入和更新的效率
https://www.cnblogs.com/caicz/p/11009507.htmlhttps://www.cnblogs.com/caicz/p/11009507.html
三、与数据库交互ORM框架
1.Ef
EF是微软推出的一种ORM框架,可以用面向对象的方式来操作数据库。有DBFirst、ModelFirst、CodeFirst三种模式,EF与实体映射的原理是反射。EF操作数据库大致有三步:
1.封装了数据库的统一入口,EF上下文;
2.把对实体的操作放入上下文中;
3.把对实体操作产生的变化生成Sql脚本执行到数据库中;
2.Dapper
开源的轻量级ORM框架,最大的优点就是执行效率快,因为它是直接对ADO.NET的Connection连接对象进行了扩展
3.EF与Dapper的区别
EF:重量级ORM的代表
优点:
1.面向对象的方式操作数据库。
2.能够摆脱sql,完全不用关心sql怎么写,可移植性强。
3.EF支持和适配了所有流行的关系型数据库,并且是面向接口的设计,并对事物,缓存(一级缓存)有良好的封装及配置。
4.支持code first。开发人员可以完全不用关心数据库,代码先行,极大的节约开发成本。
5.开发效率非常高,结合linq,开发速度极快。
6.可以跨数据库,只需要在配置文件中修改连接字符串就能轻松支持。
7.与vs结果的比较好。
缺点:
1.比较复杂,学习曲线大。
2.不适合统计查询系统,效率不是很高。
3.对于多表联查,一些复杂的查询实现比较复杂和困难,而且有可能要借助其他方案来实现。
4.自动生成的sql查询效率略低(效率低,数据量达到一定量级比较明显)
5.对于大量数据,高负载场景需要慎重使用。
6.实现良好的耳机缓存很困难,并且只能定制。
7.EF的Context上下文不是线程安全的,开发人员切记不应该在整个Service上使用一个Context上下文。
8.EF的性能表现比较一般。性能不如ADO,无法控制SQL语句的生成,频繁的插入操作不适用,EF不支持大数据Bulk插入。
Dapper:轻量级ORM的代表
优点:
1.开源,轻巧,单文件,上手容易
2.支持主流的关系型数据库,如SQLserver,MySql,Oracle等。
3.执行的效率高,Dapper的速度和原生的IDateReader接近,取列表的数据甚至超过了DateTable。Dapper的原理通过Emit反射IDataReader的序列队列来凯苏得到和产生对象。
缺点:
1.半自动的ORM,需要开发人员自己写实体
2.开发的世界成本高,较弱的LINQ支持
3.维护成本高,不支持code FIrst.开发人员除了维护好数据库中的表,还得维护好代码中表的映射对象。
转载 [屈先生 ]
本文如有瑕疵的地方,欢迎指点评论