缓存面试题: 第一部分






3.08/5 (24投票s)
一些缓存面试题:第一部分。
目录
- (B) 什么是 Application 对象?
- (I) Cache 对象和 Application 对象之间有什么区别?
- (I) 如何访问 Cache 对象
- (A) Cache 中有哪些依赖项及其类型?
- (A) 能否提供一个简单的代码示例,演示缓存中的文件依赖项?
- (A) 缓存中的回调是什么?
- (A) 什么是垃圾回收(scavenging)?
- (B) 使用 ASP.NET 的 Cache 对象有哪些不同的缓存类型?
- (B) 如何使用 ASP.NET Cache 对象缓存同一页面的不同版本?
- (A) 如何实现页面片段缓存(Page Fragment Caching)?
- (B) 能否比较 ASP.NET Session 和经典 ASP?
- (B) ASP.NET Session 有哪些存储模式?
- (A) Session End 事件是否在所有 Session 模式下都支持?
- (A) 配置 State Server 模式的步骤是什么?
- (A) 配置 SQL Server 模式的步骤是什么?
- (A) 在 ASP.NET 中,在哪里指定 Session 状态模式?
- (B) 还有哪些方法可以维护状态?
- (B) 使用隐藏字段(hidden fields)的优点和局限性是什么?
- (B) 什么是 ViewState?
- (A) ViewState 的性能是否会因用户控件(User Controls)而异?
- (B) 使用 ViewState 进行状态管理的优点和局限性是什么?
- (B) 如何使用隐藏框架(hidden frames)缓存客户端数据?
- (I) 使用隐藏框架的优点和局限性是什么?
- (I) 使用 Cookie 的优点和局限性是什么?
- (I) 什么是 QueryString,使用 QueryStrings 的优点和局限性是什么?
- (I) 如何在下一个页面中访问当前页面的 ViewState 值?
- (I) 能否在另一个应用程序中发布和访问 ViewState?
- (I) ASP.NET 2.0 中的 SQL 缓存依赖项(SQL Cache Dependency)是什么?
引言
在本节中,我们将重点介绍 .NET 缓存中的一个重要概念。
我之前发布的架构师面试题系列的前几部分
- 第一部分 - SoftArchInter1.aspx
- 第二部分 - SoftArch2.aspx
- 第三部分 - SoftArch3.aspx
- 第四部分 - SoftArch4.aspx
- UML 面试问题第一部分 SoftArch5.aspx
祝您求职愉快......
(B) 什么是 Application 对象?
Application
对象可在我们需要全局共享数据的情况下使用。
(I) Cache 对象和 Application 对象之间有什么区别?
Cache
对象和 Application
对象之间的主要区别在于,Cache
对象提供了缓存特有的功能,例如依赖项和过期策略。
(I) 如何访问 Cache 对象
Cache
对象定义在 System.Web.Caching
命名空间中。您可以通过 System.Web
命名空间中 HttpContext
类的 Cache
属性,或者通过 Page
对象的 Cache
属性来获取对 Cache
对象的引用。
(A) Cache 中有哪些依赖项及其类型?
当您将项添加到缓存时,可以定义依赖关系,以便在依赖项的特定活动下强制删除该项。例如,如果缓存对象依赖于某个文件,并且当文件数据发生更改时,您希望更新缓存对象。支持的依赖项如下:
- 文件依赖项:允许您在基于磁盘的文件或文件发生更改时使特定的缓存项失效。
- 基于时间的过期:允许您根据预设时间使特定的缓存项失效。
- 键依赖项:允许您在另一个缓存项更改时使特定的缓存项失效。
(A) 能否提供一个简单的代码示例,演示缓存中的文件依赖项?
Partial Class Default_aspx
Public Sub display Announcement()
Dim announcement As String
If Cache(“announcement”) Is Nothing Then
Dim file As New System.IO.StreamReader(Server.MapPath(“announcement.txt”))
announcement = file.ReadToEnd
file. Close()
Dim depends As New System.Web.Caching.CacheDependency (Server.MapPath(“announcement.txt”))
Cache.Insert(“announcement”, announcement, depends)
End If
Response.Write(CType(Cache(“announcement”), String))
End Sub
Private Sub Page_Init(ByVal sender As Object, _
By Val e As System.EventArgs) Handles Me. nit
display Announcement()
End Sub
End Class
上面给出的 display Announcement()
方法从 Web 目录的应用程序路径下的 Announcement.txt 文件中显示横幅文本。该方法首先检查缓存对象是否为 Nothing
,如果是,则继续从文件中加载缓存数据。每当文件数据发生更改时,缓存对象就会被删除并设置为 Nothing
。
(A) 缓存中的回调是什么?
缓存对象依赖于其依赖项,例如基于文件的、基于时间的等…当缓存依赖项发生更改时,缓存项会移除该对象。ASP.NET 提供了在项被从缓存中移除时执行回调方法的功能。
(A) 什么是垃圾回收(scavenging)?
当运行 ASP.NET 应用程序的服务器内存资源不足时,会根据缓存项的优先级移除缓存中的项。缓存项的优先级在添加项到缓存时设置。通过设置缓存项优先级控件,可以根据优先级移除被回收的项。
(B) 使用 ASP.NET 的 Cache 对象有哪些不同的缓存类型?
您可以使用两种类型的输出缓存来缓存要传输到 Web 浏览器并显示的信息:
页面输出缓存将页面的响应添加到缓存对象中。之后当页面被请求时,页面将从缓存中显示,而不是创建页面对象并显示它。如果站点相对静态,页面输出缓存效果很好。
如果页面的部分内容正在更改,则可以将静态部分包装成用户控件,并使用页面片段缓存来缓存这些用户控件。
- 页面输出缓存
- 页面片段缓存
(B) 如何使用 ASP.NET Cache 对象缓存同一页面的不同版本?
输出缓存功能通过 ASP.NET 页面头部的 OutputCache
属性来实现。以下是语法:
<%@ Output Cache Duration="20" Location="Server"
Vary By Param="state" Vary By Custom="minor version"
Vary By Header="Accept-Language"%>
- Vary By Param - 根据通过 HTTP POST/GET 发送的输入参数缓存不同版本。
- Vary By Header - 根据页面头部的内容缓存不同版本。
- Vary By Custom - 通过声明属性并重写 Get Vary By Custom 字符串处理程序,允许您自定义缓存处理页面变体的方式。
- Vary By Control - 根据控件中 ASP 对象属性的值缓存用户控件的不同版本。
(A) 如何实现页面片段缓存?
页面片段缓存涉及缓存页面的一个片段而不是整个页面。当页面的某些部分需要为每个用户请求动态创建时,这是比页面缓存更好的方法。您可以将 Web 窗体用户控件包装起来并缓存该控件,这样这些页面的部分就不需要每次都重新创建了。
(B) 能否比较 ASP.NET Session 和经典 ASP?
ASP.NET Session 会为每个用户会话状态进行缓存。它主要使用 HttpSessionState
类。以下是经典 ASP Session 的限制:
- ASP Session 状态非常依赖于 IIS 进程。因此,如果 IIS 重启,ASP Session 变量就会被回收。ASP.NET Session 可以独立于托管环境,因此即使 IIS 重启,ASP.NET Session 也可以被维护。
- ASP Session 状态没有内置的解决方案来处理 Web 场。ASP.NET Session 可以存储在状态服务器和 SQL Server 中,这可以支持多台服务器。
- ASP Session 仅在浏览器支持 Cookie 时才起作用。ASP.NET Session 可以与浏览器端 Cookie 一起使用,也可以独立于它使用。
(B) ASP.NET Session 有哪些存储模式?
- 进程内 (In Proc):在此模式下,Session 状态存储在 Aspnet_wp.exe 进程的内存空间中。这是默认设置。如果 IIS 重启或 Web 应用程序重启,则 Session 状态会丢失。
- 状态服务器 (State Server):在此模式下,Session 状态会被序列化并存储在一个单独的进程(Aspnet_state.exe)中;因此,状态可以存储在另一台计算机(状态服务器)上。
- SQL Server:在此模式下,Session 状态会被序列化并存储在 SQL Server 数据库中。
Session 状态可以在应用程序配置文件中的 <session State> 元素中指定。使用状态服务器和 SQL SERVER,Session 状态可以在 Web 场之间共享,但请注意,这会降低速度,因为 ASP.NET 需要在网络上反复序列化和反序列化数据。
(A) Session End 事件是否在所有 Session 模式下都支持?
Session End 事件仅在“进程内”模式下发生。状态服务器和 SQL Server 模式不支持 Session End 事件。
(A) 配置 State Server 模式的步骤是什么?
为了使状态服务器模式正常工作,请记住以下几点:
- 状态服务器模式下的 Session 数据存储在不同的进程中,因此您必须确保您的对象是可序列化的。
- Web.config 中的
<machine Key>
元素在所有服务器上必须相同。这确保了所有计算机之间的加密格式相同。 - IIS 元数据库(\LM\W3SVC\2)在场中的所有服务器上必须相同。
(A) 配置 SQL Server 模式的步骤是什么?
为了使 SQL Server 模式正常工作,请记住以下几点:
- SQL Server 模式下的 Session 数据存储在不同的进程中,因此您必须确保您的对象是可序列化的。
- IIS 元数据库(\LM\W3SVC\2)在场中的所有服务器上必须相同。
- 默认情况下,Session 对象存储在“TempDB”中;您可以运行 Microsoft 提供的 SQL 脚本来配置将其存储在“TempDB”之外。
注意:“TempDB”数据库在 SQL SERVER 计算机重启后会重新创建。如果您希望在每次重启后都维护 Session 状态,最好运行 SQL 脚本并将 Session 对象存储在“TempDB”数据库之外。
(A) 在 ASP.NET 中,在哪里指定 Session 状态模式?
<sessionState mode=”SQLServer”
stateConnectionString=”tcpip=192.168.1.1:42424"
sqlConnectionString=”data source=192.168.1.1; Integrated Security=SSPI”
cookieless=”false”
timeout=”20"
/>
上面是为 SQL SERVER 指定的示例 Session 状态模式。
(B) 还有哪些方法可以维护状态?
除了 Session 变量,您还可以使用以下技术来存储状态:
- 隐藏字段
- 视图状态(ViewState)
- 隐藏框架
- Cookie
- 查询字符串
(B) 使用隐藏字段的优点和局限性是什么?
使用隐藏字段的优点如下:
- 易于实现。
- 由于数据缓存在客户端,因此它们可以与 Web 场一起使用。
- 所有浏览器都支持隐藏字段。
- 不需要服务器资源。
隐藏字段的局限性如下:
- 它们可能被篡改,从而造成安全漏洞。
- 如果存储大量数据,页面性能会下降,因为数据存储在页面本身中。
- 隐藏字段不支持丰富结构,因为 HTML 隐藏字段是单值的。然后您必须使用分隔符等解决方法来处理复杂结构。
以下是如何在项目中实际实现隐藏字段的方法:
<input id="Hidden Value" type="hidden"
value="Initial Value" run at="server" NAME="Hidden Value">
(B) 什么是 ViewState?
ViewState 是一个内置结构,用于在同一页面的多个请求之间自动保留值。ViewState 在内部作为一个隐藏字段保存在页面上,但经过哈希处理,比开发人员实现的隐藏字段更安全。
(A) ViewState 的性能是否会因用户控件而异?
ViewState 的性能取决于其所应用的服务器控件的类型。Label
、TextBox
、CheckBox
、RadioButton
和 HyperLink
是与 ViewState 配合良好的服务器控件。DropDownList
、ListBox
、DataGrid
和 DataList
由于其大小和大量数据往返服务器而性能较差。
(B) 使用 ViewState 进行状态管理的优点和局限性是什么?
使用 ViewState 的优点如下:
- 不需要服务器资源,因为状态保存在页面代码的结构中。
- 简单性。
- 状态会自动保留。
- ViewState 中的值经过哈希处理、压缩和编码,因此比隐藏字段具有更高的安全性。
- ViewState 适用于在 Web 场配置中缓存数据,因为数据缓存在客户端。
使用 ViewState 的局限性如下:
- 由于 ViewState 存储在页面中,因此在存储大值时,页面加载和提交的性能会下降。
- 尽管 ViewState 以哈希格式存储数据,但由于它存储在页面中的隐藏字段中,因此仍可能被篡改。
如果直接查看页面输出源,也可以看到隐藏字段中的信息,这会带来潜在的安全风险。以下是存储 ViewState 值中值的示例代码:
this.View State["Enter Time"] = DateTime.Now.ToString();
(B) 如何使用隐藏框架缓存客户端数据?
这项技术是通过在页面中创建一个隐藏框架来实现的,该框架将包含您要缓存的数据。
<FRAMESET cols="100%,*,*">
<FRAMESET rows="100%">
<FRAME src="data_of_frame1.html"></FRAMESET>
<FRAME src="data_of_hidden_frame. html">
<FRAME src="data_of_hidden_frame.html"
frame border="0" no resize scrolling="yes">
</FRAMESET>
上面是隐藏框架的示例,其中第一个框架“data_of_frame1.html”是可见的,而其余框架通过将整个列部分分配给第一个框架而隐藏。将 100% 分配给第一个框架,其余框架因此保持隐藏。
(I) 使用隐藏框架的优点和局限性是什么?
使用隐藏框架的优点如下:
- 您可以缓存多个数据字段。
- 能够缓存和访问存储在不同隐藏窗体中的数据项。
- 能够访问存储在不同框架中的 JS 脚本® 变量值,如果它们来自同一站点。
隐藏框架的局限性如下:
- 并非所有浏览器都支持隐藏框架。
- 隐藏框架数据可能会被篡改,从而造成安全漏洞。
(I) 使用 Cookie 的优点和局限性是什么?
用于状态管理的 Cookie 的优点如下:
- 不需要服务器资源,因为它们存储在客户端。
- 它们轻便且易于使用。
Cookie 的局限性如下:
- 大多数浏览器对 Cookie 的大小限制为 4096 字节,尽管在当前可用的新浏览器和客户端设备版本中,对 8192 字节 Cookie 的支持越来越普遍。
- 一些用户禁用其浏览器或客户端设备接收 Cookie 的能力,从而限制了 Cookie 的使用。
- Cookie 可能会被篡改,从而造成安全漏洞。
- Cookie 可能会过期,从而导致不一致。
以下是实现 Cookie 的示例代码:
Request.Cookies.Add(New Http Cookie (“name”, “user1”))
(I) 什么是 QueryString,使用 QueryStrings 的优点和局限性是什么?
查询字符串(querystring)是附加到页面 URL 末尾发送到服务器的信息。
用于状态管理的 QueryStrings 的优点如下:
- 不需要服务器资源。查询字符串包含特定 URL 的 HTTP 请求。
- 所有浏览器都支持查询字符串。
QueryStrings 的局限性如下:
- 查询字符串数据对用户可见,从而导致安全问题。
- 大多数浏览器和客户端设备对 URL 长度都有限制,为 255 个字符。
以下是在 URL 中传递的示例“Login”查询字符串:http://www.querystring.com/login.asp?login=testing。然后可以使用 Request.QueryString(“login”)
来请求此查询字符串数据。
(I) 什么是绝对过期和滑动过期?
绝对过期允许您指定缓存的持续时间,从缓存激活时间开始。以下示例显示缓存指定了缓存依赖项,以及一分钟的过期时间。
Cache.Insert("announcement", announcement, depends, _
DateTime.Now.AddMinutes(1), Nothing)
滑动过期指定如果未在指定时间内发出请求,缓存将过期。每当有大量需要缓存的项时,滑动过期策略都很有用,因为此策略使您能够仅将最常访问的项保留在内存中。例如,以下代码指定缓存的滑动持续时间为一分钟。如果在访问缓存后 59 秒内发出请求,缓存的有效性将重置为另一分钟。
Cache.Insert("announcement", announcement, depends, _
DateTime.MaxValue, _TimeSpan.FromMinutes(1))
(I) 什么是跨页面发布(cross page posting)?
注意:这是 ASP.NET 2.0 中的一项新功能。
默认情况下,ASP.NET 页面中的按钮控件会回发到包含该按钮的同一页面,您可以在其中编写回发的事件处理程序。在大多数情况下,这是期望的行为,但有时您也希望能够发布到应用程序中的另一个页面。Server.Transfer
方法可用于在页面之间移动,但 URL 不会更改。相反,ASP.NET 2.0 中的跨页面发布功能允许您向应用程序中的另一个页面触发常规回发。在目标页面中,您可以访问启动回发的源页面中服务器控件的值。要使用跨页面发布,您可以设置 Button
、LinkButton
或 ImageButton
控件的 PostBackUrl
属性,该属性指定目标页面。在目标页面中,您可以使用 PreviousPage
属性检索源页面的值。默认情况下,PreviousPage
属性的类型为 Page
,因此您必须使用 FindControl
方法来访问控件。您还可以通过在目标页面中将 @Previous Page Type
指令设置为源页面的虚拟路径或类型名称来启用对源页面的强类型访问。以下是使用实现 IButtonControl
接口的控件实现跨页面回发的系统指南。
- 使用 VS.NET 设计器创建一个 Web 窗体并在其中插入一个
Button
控件。 - 将按钮的
PostBackUrl
属性设置为您要回发的 Web 窗体。
例如,在本例中,它是“nextpage.aspx”。
<asp: Button ID="Button1" run at="server"
PostBackUrl="~/nextpage.aspx" Text="Post to next page" />
当设置 IButtonControl
的 PostBackUrl
属性时,ASP.NET 框架会将相应的 HTML 元素绑定到一个名为 Web Form _Do Post Back With Options
的新 JavaScript 函数。ASP.NET 2.0 渲染的相应 HTML 将如下所示:
<input type="submit" name="Button1" value="Post to Page 2"
on click="java script: Web Form_ Do Post Back With Options (new Web Form_ Post Back Options("Button1",
",false”,"Page2.aspx", false, false))" id="Button1" />
(I) 如何在下一个页面中访问当前页面的 ViewState 值?
ViewState 是页面特定的;它包含有关嵌入在该特定页面上的控件的信息。ASP.NET 2.0 通过嵌入一个名为 __POST BACK
的隐藏输入字段来解决这个问题。仅当页面上存在 IButtonControl
且其 PostBackUrl
属性设置为非 null 值时,才会嵌入此字段。此字段包含发布者页面的 ViewState 信息。要访问发布者页面的 ViewState,您可以使用页面新的 PreviousPage
属性。
Page poster = this.Previous Page;
然后您可以从前一页找到任何控件并读取其状态。
Label poster Label = poster. find Control ("my Label");
string lbl = poster Label. Text;
这种跨页面回发功能还解决了将表单发布到多个页面的问题,因为理论上每个控件都可以指向不同的回发 URL。
(I) 能否在另一个应用程序中发布和访问 ViewState?
您可以发布到任何页面以及另一个应用程序中的页面。但是,如果您将页面发布到另一个应用程序,PreviousPage
属性将返回 null
。这是一个重要的限制,这意味着如果您想使用 ViewState,您将被限制在例如发布到同一虚拟目录中的页面。即使如此,这仍然是 ASP.NET 功能中一个非常可接受的补充。
(I) ASP.NET 2.0 中的 SQL 缓存依赖项(SQL Cache Dependency)是什么?
SQL 缓存依赖项是 ASP.NET 2.0 中的一项新功能,当数据库中的相关数据被修改时,它可以自动使缓存的数据对象(如 DataSet)失效。例如,如果您有一个绑定到数据库表的数据集,数据库表的任何更改都会使缓存的数据对象(可以是数据集或数据源)失效。
如需进一步阅读,请观看下面的面试准备视频和分步视频系列。