1. .Net、C#、VisualStudio之间的关系是什么?
.Net一般指的是.Net Framework,提供了基础的.Net类,这些类可以被任何一种.Net编程语言调用,.Net Framework还提供了CLR、JIT、GC等基础功能。
C#是使用最广泛的支持.Net的编程语言。除了C#还有VB.Net、IronPython等。
VisualStudio是微软提供的用来进行.Net开发的集成开发环境(IDE),使用VisualStudio可以简化很多工作,不用程序员直接调用csc.exe等命令行进行程序的编译,而且VisualStudio提供了代码自动完成、代码高亮等功能方便开发。除了VisualStudio,还有SharpDevelop、MonoDevelop等免费、开源的IDE,其中微软提供的VisualStudio Express版是完全免费的IDE。
2. CTS、CLS、CLR分别作何解释
CTS:Common Type System 通用语言系统。Int32、Int16→int、String→string、Boolean→bool。每种语言都定义了自己的类型,.Net通过CTS提供了公共的类型,然后翻译生成对应的.Net类型。
CLS:Common Language Specification 通用语言规范。不同语言语法的不同。每种语言都有自己的语法,.Net通过CLS提供了公共的语法,然后不同语言翻译生成对应的.Net语法。
CLR:Common Language Runtime 公共语言运行库,就是GC、JIT等这些。有不同的CLR,比如服务器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相当于一个发动机,负责执行IL。
3. 类的访问修饰符有哪些?
类只能有public和internal两种访问修饰符。Public:公共成员,完全公开,没有访问限制。Internal:当前程序集内可以访问。
4. 类的成员有哪几种?他们的访问修饰符有哪些?
类的成员有:字段、属性、方法、事件。
类成员的访问修饰符包括:private、protected、public、internal。
5. 简述 private、 protected、 public、 internal 修饰符的访问权限?
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
6. 关键字ref、out、params的用法
ref:该关键字使参数按引用传递,其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。使用规则:定义方法时,在形参前必须加ref关键字;调用方法时,在实参前必须加ref关键字;调用方法前,ref实参必须已经被初始化。
out:该关键字也可以使参数按引用传递,其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。使用规则:定义方法时,在形参前必须加out关键字;调用方法时,在实参前必须加out关键字;调用方法前,out实参可以先不初始化,但在方法内部,必须修改out参数的值。
params:该关键字,可以指定在方法参数数目可变处采用数组型参数实现。使用规则:在定义方法时,在数组型参数前加params关键字;调用方法时即可以传递数组型变量,也可以依次传递多个参数。
7. 静态、非静态构造方法、静态、非静态字段的执行顺序是怎样的?
静态字段à非静态字段à静态构造方法à非静态构造方法
8. Readonly和const的异同点
const修饰的常量在声明的时候必须初始化;readonly修饰的常量则既可以在声明的时候初始化,也可以延迟到构造函数初始化。
const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候。
9. 什么是结构体?它和类有哪些差别?
结构是程序员自定义的数据类型,它非常类似于类。它内部可以有字段、属性和方法成员。其语法格式为:
访问修饰符 struct 结构名称
{
//结构成员
}
结构体和类的主要差别为:
结构体是值类型,类是引用类型;
类支持继承,结构体不支持继承;
结构体不能显示声明无参构造方法,类可以声明无参构造方法;
10. 什么是值类型和引用类型?请将常见的数据类型进行分类?
值类型的数据存储在内存的栈中;而引用类型的数据存储在托管堆中,并在栈中添加堆数据的指针或引用地址。
值类型:简单类型(int、double、float、bool、decimal、char、unit)、结构类型、枚举类型
引用类型:字符串、结构体、类、接口
11. 什么是装箱和拆箱?
装箱是指将值类型数据转换为引用类型;拆箱是指将引用类型转换为值类型。
装箱:int a = 5; object obj = a;
拆箱:string a = “5”; int b = (int)a;
12. 继承相关知识点汇总
l 一个类只能继承一个类,C#不支持类的多继承,但一个类可以继承多个接口。
l 创建子类对象时,首先会调用父类的构造方法,其次才执行子类的构造方法。
l 默认情况下,子类会调用父类无参的构造方法。
l 在调用子类构造方法时可以人为的显式调用父类的构造方法。
l 在子类中通过base关键字调用父类的成员。
l 可以通过is关键字判断某个对象是否是于指定类型兼容(对象所属的类或其祖先类是否是是指定的类型)。
13. 如果防止一个类被继承?
将该类声明为密封的(sealed)即可防止该类被继承。语法如下:
访问修饰符 sealed class 类名称
{
//类成员
}
14. 方法重写(override)和方法重载(overload)有什么区别?
方法重载是指在同一个类中多个方法间,方法名称一样但参数列表(参数个数、参数类型、参数顺序)不同。而方法重写是指子类的方法重写父类的方法。
15. 什么是抽象类?什么是抽象方法?
被abstract关键字修饰的类就是抽象类。被abstract关键字修饰的方法就是抽象方法。
抽象类、抽象方法的语法格式为:
访问限定符 abstract class 类名称
{
访问限定符 abstract 返回值类型 方法名(参数列表);
}
l 抽象类不能通过其构造方法创建实例对象,但可以通过其实现类实例化。
l 如果一个类中存在抽象方法,那么这个类必须是抽象类;一个抽象类可以没有抽象方法,并且抽象类中可以存在非抽象方法。
l 抽象类不能被sealed关键字修饰。
l 抽象方法不能有方法实现,也就是说不能有方法体。方法声明以分号结束。
l 抽象方法实际上是隐藏的virtual方法。
l 抽象类可以继承接口。
16. 什么是接口?接口的使用规则有哪些?
接口就是一组操作契约(属性、方法等)的集合。操作契约只能包含声明,不能包含实现部分。其语法格式如下:
访问限定符 interface 接口名称
{
//接口成员:成员不能有访问限定符
}
l 接口中的成员可以包括:属性、方法、索引器、事件。不能包括字段、构造方法。
l 接口可以有访问限定符,但其成员不能包含访问限定符。
l 接口可以继承接口,并且1个接口可以同时继承多个接口。
l 类继承接口后必须要实现接口中声明的属性或方法等等。
l 子类在继承父类的同时,还可以继承多个接口,基类或接口之间用逗号隔开。
l 抽象类可以继承接口。
17. is和as关键字有什么作用?
is:检查对象是否与指定类型兼容。as:用于在兼容的引用类型之间执行转换
18. as和强制类型转换有什么差别?
as用于在引用类型之间进行转换,而强制类型可以在任何类型间进行转换。
强制类型转换失败时,程序会抛出异常;as转换失败则不会抛出异常,直接返回null。
19. new关键字的用法有哪些?
用法一:用于创建对象时调用构造函数
用法二:子类隐藏父类的成员
用法三:泛型约束,表示泛型T必须要包含无参的公共构造方法,where T : new()
20. 进程和线程的区别?
计算机中一个正在运行的可执行程序的实例就是进程。一个进程可以包含多个线程。单个线程用于完成一个任务,而同时创建多个线程来完成多项任务,便是多线程。
二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。
用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。
21. 什么是序列化?
序列化是指将对象的状态转换为可以存储或传输的格式的过程。
22. 什么是反射?反射的命名空间是哪个?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例对象。
C#中和反射相关的命名空间是:System.Reflection。
23. 什么是自动属性、对象初始化器、集合初始化器?
自动属性是指:在通过属性封装字段时,无需定义字段和实现属性的get、set访问器,而由.NET框架自动生成。
如:
private string name;
public string Name
{
get{ return this.name; }
set{ this.name=value; }
}
等价于:
public string Name { get;set; }
对象初始化器是指:在调用类的构造方法创建对象时,同时为对象属性赋值。
如:StudentInfo stu = new StudentInfo(){ Name=”zhangsan”, Age=20 };
集合初始化器是指:在实例化一个集合对象的同时,为其指定元素。
如:
List<StudentInfo> list = new List<StudentInfo>()
{
new StudentInfo(){ Name=”zhangsan”, Age=20},
new StudentInfo(){Name=”lisi”, Age=25}
};
24. C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向一个函数的指针。
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法
面试聊:用Reflector查看.Net的类的内部实现,解决问题。
25. .NET Framework数据提供程序的5个核心对象
l Connection:主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,则无法从数据库中取得数据。
l Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。
l DataAdapter:数据适配器。它可以通过Command对象从指定数据源提取数据,并填充到DataSet 对象中。
l DataSet:数据集。可以视其为一个暂存区(Cache),其内部可以容纳多个DataTable,甚至可以将DataTable的主键以及DataTable之间的外键关联等存储起来,所以我们有时贴切的称之为“内存中的小型数据库”。
l DataReader:当我们只需要循序的读取数据时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,而且这些数据是只读的,并不允许对其进行修改等操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。
26. 如何从配置文件中读取数据库连接字符串
1. 为项目添加引用:System.Configuration.dll
2. 在类文件中引入命名空间:using System.Configuration;
3. 读取连接字符串:string connectionString = ConfigurationManager.Connectionstrings[“连接名称”].ConnectionString;
27. 什么是三层架构?
通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了“高内聚,低耦合”的思想。
表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。
业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。
三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。
优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点: 增加成本。
28. 什么是MVC开发模型
MVC(Model View Controller)模型-视图-控制器。
MVC是典型的平行关系,没有说谁在上谁在下的关系,模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证什么的应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离、分解关注点。
微软自08年推出asp.net mvc后至今经历了1.0、2.0、3.0、4.0几个版本。
MVC和三层的区别:MVC是三层中于UI层相关的技术。
29. 堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
30. 能用foreach遍历访问的对象的要求
需要实现IEnumerable接口或声明GetEnumerator方法的类型。
31. GC是什么? 为什么要有GC?
C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net中由GC进行垃圾回收像餐馆中店员去回收。
GC是垃圾收集器(Garbage Collection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。
要请求垃圾收集,可以调用下面的方法:GC.Collect()一般不需要手动调用GC.Collect()。当一个对象没有任何变量指向(不再能使用)的时候就可以被回收了。
基础知识:当没有任何变量指向一个对象的时候对象就可以被回收掉了,但不一定会立即被回收。
32. using关键字有什么用?什么是IDisposable?
1. using可以导入namespace命名空间。
2. using还可以实现非托管资源的释放。实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。
33. 谈谈你对Ajax的理解
Ajax主要用于在Web方面实现客户端向服务器发送异步请求,从而达到客户端局部刷新的目的。
Ajax主要涉及浏览器的一个核心组件XmlHttpRequest。并且因为浏览器的差异,对XmlHttpRequest对象的创建也有所差异。
现在我们在开发过程中一般都是使用一些封装了ajax功能的第三方框架来实现,比如Jquery、Extjs、AjaxPro等等。
34. 谈谈你对asp.net中视图状态(Viewstate)的理解
Web 应用程序是无状态的。每次从服务器请求网页时,都会创建网页类的一个新实例。这通常意味着在每次往返过程中将会丢失所有与该页面及其控件关联的信息。视图状态是 ASP.NET 页框架默认情况下用于保存往返过程之间页和控件值的方法。可以通过将页面或控件的EnableViewState属性设置为false来禁用视图状态。
35. Server.Transfer和Response.Redirect的区别是什么?
Server.Transfer仅是服务器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;Response.Redirect则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接,所以浏览器的地址栏中可以看到跳转后的链接地址。
Server.Transfer是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 这个过程中浏览器和Web服务器之间经过了一次交互。而Response.Redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求。这个过程中浏览器和Web服务器之间经过了两次交互。
36. 什么是sql注入?如何避免sql注入?
用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL语句。使用参数化的SQL就可以避免SQL注入。具体就是使用ADO.NET中的DbParameter类来处理用户提交的参数。
37. 数据库三范式是什么?
第一范式:表中每个字段都不能再分。
第二范式:满足第一范式并且表中的非主键字段都依赖于主键字段。
第三范式:满足第二范式并且表中的非主键字段必须不传递依赖于主键字段。
38. 什么是数据库事务?
事务具有四大特性:一致性、原子性、隔离性、持久性。
数据库事务是指:几个SQL语句,要么全部执行成功,要么全部执行失败。比如银行转账就是事务的典型场景。
数据库事务的三个常用命令:Begin Transaction、Commit Transaction、RollBack Transaction。
39. 列举ASP.NET 页面之间传递值的几种方式
Url传值。如:xxx.aspx?id=5&name=zhangsan Request.QueryString[“name”]
Session传值。
Application传值。
Cookie传值。
response. Redirect()
在当前页面内通过PreviosPage获取上一页面内控件值。
40. Session、Application、Cookie在存取值方面有什么区别?
Session将数据存储在服务器端,是用户级别的,用户仅能访问自己会话中的数据,易丢失。
Application将数据存储在服务器端,是全局的,所有用户均可访问。
Cookie将数据存储在客户端,易被窃取,不安全。
41. post、get的区别
1. get的参数会显示在浏览器地址栏中,而post的参数不会显示在浏览器地址栏中;
2. 使用post提交的页面在点击【刷新】按钮的时候浏览器一般会提示“是否重新提交”,而get则不会;
3. 用get的页面可以被搜索引擎抓取,而用post的则不可以;
4. 用post可以提交的数据量非常大,而用get可以提交的数据量则非常小(2k),受限于网页地址的长度。
5. 用post可以进行文件的提交,而用get则不可以。
42. 谈谈你对.net的GC的理解
GC是.Net的垃圾收集器,可以进行内存资源的回收,程序员无需关心资源的回收,当一个对象没有任何引用的时候就可以被回收了。一个对象可以被回收并不意味着一定会被立即回收,GC会选择时机进行回收。可以调用GC.Collect()让GC立即回收。GC不能回收非托管资源,对于非托管资源一般都实现了IDisposable接口,然后使用using关键字进行资源的回收。
43. 在Asp.net中Session存储数据有几种方式?
Session中的数据有三种存储方式:1.IIS进程(内存)中;2.Windows服务;3.数据库。
可以通过在web.config文件中通过sessionState配置节的mode属性指定。其值可以是:InProc、StateServer、SqlServer。默认为InProc,即值存储在IIS进程中。
44. ASP.NET中<%%>、<%=%>、<%#%>的区别是什么?
1. <%%>是执行<%%>中的C#代码;
2. <%=%>是将=后表达式的值输出到Response中;
3. <%#%>是数据绑定,一般用在ListView、GridView、Repeater等控件的绑定中。数据绑定分为:Eval(单向绑定)和Bind(双向绑定)。
45. HttpHandler和HttpModule有什么区别?
1. HttpHandler继承自IHttpHandler接口,HttpModule继承自IHttpModule接口;
2. 一个用户请求可以被多个HttpModule处理,但最终只能由一个HttpHandler处理;
3. HttpHandler能够拦截指定格式的URL请求,但HttpModule能够拦截所有的URL。
46. 什么是WebService?
WebService即:Web服务。它的主要目标是解决跨平台的可互操作性。为了实现这一目标,Web Service 完全基于XML(可扩展标记语言)、XSD(XML Schema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。
在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
1. XML:描述数据的标准方法.
2. SOAP:简单对象访问协议.
3. WSDL:Web服务描述语言.
4. UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。
47. JQuery提供了哪些选择器?
1. 一般选择器:ID选择器、类选择器、标记选择器;
2. 层次选择器;
3. 过滤选择器:基本过滤选择器、内容过滤选择器、可见性过滤选择器、属性过滤选择器;
4. 表单选择器;
48. JQuery提供了哪些动画函数?
Show、hide、toggole、slideUp、slideDown、slideToggle、fadeIn、fadeOut、animate、stop
49. 操作Excel有哪些解决方案?
1. 通过ADO.NET中的oledb操作Excel,要求目标计算机安装Jet组件;
2. 通过COM方式操作Excel,要求目标计算机一定要安装Office软件;
3. 使用Aspose.Cells操作Excel,目标计算机无需安装Office软件;
4. 通过OpenXml操作Excel,目标计算机无需安装Office软件;
50. 在网面中导入外部资源时经常会使用诸如:../、/等符号,他们有什么区别?
../表示从当前页面所属目录的上级目录算起;
/表示从当前应用程序的根路径算起;
51. 什么是代码隐藏技术?
code-Behind即:代码隐藏。在ASP.NET中通过ASPX页面指向CS文件的方法实现了显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。比如项目分工,美工和编程的可以个干各的,不用再像以前asp那样将代码和html代码混在一起,难以维护。code-Behind是基于部分类(Partial)技术实现的。
52. ASP.NET提供了哪些身份认证方式?
asp.net提供了3种认证方式:windows身份验证,Forms验证和Passport验证。
1. windows身份验证:IIS根据应用程序的设置执行身份验证.要使用这种验证方式,在IIS中必须禁用匿名访问。
2. Forms验证:用Cookie来保存用户凭证,并将 未经身份验证的用户重定向到自定义的登录页。
3. Passport验证:通过Microsoft的集中身份验证服务执行的,他为成员站点提供单独登录 和核心配置文件服务。
上述身份认证方式可以通过在Web.config中authentication配置节的mode属性设置。
53. 软件生命周期都包含哪些阶段?
需求分析、概要设计、详细设计、编码、测试、部署和实施
54. 什么是视图?
视图实际上是在数据库中通过Select查询语句从多张表中提取的多个表字段的虚拟表。
视图并不占据物理空间,所以通过视图查询出的记录并非保存在视图中,而是保存在原表中。
通过视图可以对指定用户隐藏相应的表字段,起到保护数据的作用。
在满足一定条件时,可以通过视图对原表中的记录进行增删改操作。
55. 什么是索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
索引分为:聚集索引、非聚集索引、唯一索引。一张表可以有多个唯一索引和非聚集索引,但最多只能有一个聚集索引。
合理的创建索引虽然能够提升查询速度,但降低了新增、删除操作的速度,同时会消耗一定的数据库物理空间。
56. 什么是存储过程?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
57. 什么是触发器?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
58. 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
解1:select top 10 * from A where id not in (select top 30 id from A)
解2:select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
解3:select * from (select *, Row_Number() OVER (ORDER BY id asc) rowid FROM A) as A where rowid between 31 and 40
59. 如何实现对HTML的编码和解码?
编码:Server.HtmlEncode(string html) <转< >转>
解码:Server.HtmlDecode(string html) <转< >转>
60. 如何实现对包含中文的URL进行编码和解码?
编码:Server.UrlEncode(string html)
解码:Server.UrlDecode(string html)
61. 如何在网页中实现定时器效果?
setInterval(function, time):每隔N毫秒均会指定指定的函数。
setTimeOut(function, time):等待N毫秒后仅仅执行1次目标函数。
62. 对于用户访问量庞大的业务系统,在提升访问速度方面你有哪些优化措施?
1. 对于某些页面内很少发生改变的可以通过页面缓存提升访问速度;
2. 对于较少发生变动的业务数据可以通过数据缓存和缓存依赖项保证访问速度和更新;
3. 从数据库层面进行优化:优化查询语句、合理建立表索引、数据表的水平和垂直拆分;
4. 可以通过服务器群集来对访问量分流相应;