自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

細說.NET的七種緩存

原創(chuàng)
開發(fā) 后端
在項目開發(fā)中緩存可以說是一直的存在,但是緩存技術(shù)具體該怎么用用在哪里,對于大多數(shù)開發(fā)人員來說并不知道,甚至有些開發(fā)人員認為緩存使用過于復(fù)雜。那么通過這篇文章各位讀者可以充分理解緩存的使用和原理。

【51CTO.com原創(chuàng)稿件】在項目開發(fā)中緩存可以說是一直的存在,但是緩存技術(shù)具體該怎么用用在哪里,對于大多數(shù)開發(fā)人員來說并不知道,甚至有些開發(fā)人員認為緩存使用過于復(fù)雜。那么通過這篇文章各位讀者可以充分理解緩存的使用和原理。

一、什么是緩存

  1. 緩存能干什么

緩存可以提高系統(tǒng)性能、提高穩(wěn)定性和可用性。同樣緩存也可以減少交互的通信量、降低系統(tǒng)處理量和降低磁盤開銷。下面我針對前面所說的內(nèi)容從六條進行一個簡單的概述。

  • 提高系統(tǒng)性能:將數(shù)據(jù)緩存起來避免數(shù)據(jù)重復(fù)處理和傳輸,一般我們會將變化很少的數(shù)據(jù)存儲在緩存中,比如國家、省份和城市名稱;

  • 提高穩(wěn)定性:在大量請求對同一個數(shù)據(jù)或者邏輯多次調(diào)用時會造成很大的資源浪費,甚至?xí)斐上到y(tǒng)不穩(wěn)定。這時我們可以將這些資源緩存起來,每次請求時都從緩存中讀取,這樣就提高了系統(tǒng)的穩(wěn)定性;

  • 提高可用性:當(dāng)數(shù)據(jù)系統(tǒng)服務(wù)出現(xiàn)問題時,通過緩存可以繼續(xù)向請求端提供數(shù)據(jù)服務(wù),只不過這時的數(shù)據(jù)有可能是過時的;

  • 減少通信量:緩存數(shù)據(jù)能有效減少在進程和機器間的傳輸量;

  • 降低處理量:將處理好的數(shù)據(jù)緩存起來,可以避免同樣的數(shù)據(jù)二次處理;

  • 降低磁盤訪問次數(shù):將數(shù)據(jù)緩存起來,每次需要數(shù)據(jù)時先訪問緩存,如果存在就返回緩存的數(shù)據(jù),如果不存在那么就訪問存儲在磁盤上的數(shù)據(jù)。通過這種操作可以有效的降低磁盤的訪問量。

  1. 緩存狀態(tài)

所謂緩存狀態(tài)是應(yīng)用系統(tǒng)在一個時間點上數(shù)據(jù)的狀態(tài),這些數(shù)據(jù)有可能是持久化到數(shù)據(jù)庫中,也有可能是臨時存儲在內(nèi)存中等等。在這一小節(jié)里我們將學(xué)習(xí)到緩存生命周期、范圍和陳舊數(shù)據(jù)如何處理。

  • 緩存生命周期

緩存生命周期一共有四種,分別如下表:    

 

生命周期 說明
Permanent State 永久有效:數(shù)據(jù)永不過期,數(shù)據(jù)永久存在
Process State 進程有效:在進程有效的生命周期內(nèi)數(shù)據(jù)有效
Session State 會話內(nèi)有效:在特定的會話內(nèi)數(shù)據(jù)有效
Message State 消息內(nèi)有效:在處理特定消息的時間段內(nèi)有效

 

  •  緩存范圍

緩存是有范圍的,總結(jié)起來說緩存范圍包含兩大類:物理范圍和邏輯范圍。這兩個范圍內(nèi)又包含了不同的詳細范圍。具體如下:

  • 物理范圍  

 

范圍 說明
Organization 在組織內(nèi)所有應(yīng)用都可以訪問緩存
Farm 在應(yīng)用場范圍內(nèi)所有的機器都可以訪問緩存
Machine 在一個機器內(nèi)可以訪問緩存
Process 在一個應(yīng)用進程內(nèi)可以訪問緩存
AppDomain 在一個應(yīng)用域內(nèi)可以訪問緩存

 

  • 邏輯范圍   

 

范圍 說明
Application 在一個應(yīng)用進程內(nèi)可以訪問緩存(同 Process)
Business Process 在特定業(yè)務(wù)流程內(nèi)可以訪問緩存
Role 特定角色可以訪問緩存
User 特定用戶可以訪問緩存

 

  • 緩存陳舊數(shù)據(jù)處理

緩存是數(shù)據(jù)的快照,但是由于數(shù)據(jù)源可以被修改,所以緩存就存在陳舊的特點。利用這個特性將數(shù)據(jù)陳舊的負面影響最小化是緩存狀態(tài)數(shù)據(jù)的一個重要任務(wù)。一般我們從如下兩個方面來定義哪些數(shù)據(jù)是陳舊數(shù)據(jù):

  • 主數(shù)據(jù)更改的可能性:時間越長主數(shù)據(jù)被修改的可能性就越大,因此我們可以設(shè)置時間點來更新緩存數(shù)據(jù);

  • 舊數(shù)據(jù)的影響程度:緩存數(shù)據(jù)不更新或更新不及時是否對整個系統(tǒng)或者核心業(yè)務(wù)有影響。

根據(jù)上面的兩個標準,我們將緩存數(shù)據(jù)的可接受程度定義為容忍度,容忍度分為無法容忍和一定程度容忍。所謂無法容忍,就是當(dāng)主數(shù)據(jù)更新時緩存數(shù)據(jù)必須馬上更新。而一定程度的容忍是指允許在一定時間段內(nèi)緩存數(shù)據(jù)和主數(shù)據(jù)不同。

  1. 應(yīng)考慮的東西

在使用緩存時,我們應(yīng)從 5 個方面考慮:

  • 過期策略:定義緩存數(shù)據(jù)多久失效、在什么情況下失效;

  • 安全性:如何保證緩存的數(shù)據(jù)不被其他沒有權(quán)限的進程、方法訪問;

  • 管理:定義緩存的最大容量、過期策略和清理策略等;

  • 數(shù)據(jù)格式與訪問方法:選擇線程安全、可序列化和可規(guī)格化的緩存方案以及方法;

  • 內(nèi)容加載:內(nèi)容如何加載,是在應(yīng)用程序啟動時就提前加載,還是使用到時先從主數(shù)據(jù)獲取數(shù)據(jù),之后再放在緩存里。

二、.NET 中的緩存

.NET 中的緩存有七種,分別是:Asp.net 緩存、 Remoting Singleton 緩存、 Memory-Mapped File 、SQL Server 緩存、靜態(tài)變量緩存、 Asp.net session state 和 客戶端緩存 。下面我分別來詳細講解一下。

  1. Asp.net 緩存

對于 Asp.Net 開發(fā)人員來說,經(jīng)常需要把常用數(shù)據(jù)存儲到內(nèi)存中。方法無非就是三種,其中最常用的是 Session 對象Application 對象 。這兩種方式都是以鍵值對的形式緩存數(shù)據(jù)。它倆的唯一區(qū)別是 Session 對象保存的是和單個用戶有關(guān)的數(shù)據(jù),而 Application 對象存儲的是和應(yīng)用程序有關(guān)的數(shù)據(jù),每個用戶都可以訪問。除了這兩種方法,還有另一種方法不是很常用,但是要比上述方法方便。這個方法就是 Cache 對象 ,它是 Asp.Net 中專門用于緩存數(shù)據(jù)的,它的應(yīng)用范圍是整個應(yīng)用程序域。生命周期和應(yīng)用程序一樣,當(dāng)應(yīng)用程序啟動時 Cache 對象創(chuàng)建,當(dāng)應(yīng)用程序關(guān)閉時 Cache 對象也隨之消失。它具有專門用于緩存管理的特性,下面我們就來看一下 Cache 的講解(Session 對象 和 Application 對象 因為用的較多因此這里不講解)。 Cache 對象位于命名空間 System.WebCaching 中,它除了可以存儲鍵值對外,還可以存儲 .NET 框架的對象。一般情況下我們使用 HttpContext 類的 Cache 屬性或 Page 對象的 Cache 屬性來得到 Cache 的引用。我們使用 Cache 時首先需要考慮的是依賴和過期策略。 Asp.Net 中的依賴和過期策略包含如下兩種:

  • File Dependency :文件依賴,當(dāng)硬盤上的一個或多個文件更改時,強制移除緩存數(shù)據(jù)。

  • 基于時間的過期策略:按照預(yù)先定義的時間策略使數(shù)據(jù)失效,參數(shù)可以是絕對時間,也可以是相對時間。

Tip:

  1. Cache 對象根據(jù)緩存項的優(yōu)先級來決定先移除哪些緩存數(shù)據(jù),可以在代碼中指定緩存項的優(yōu)先級。指定優(yōu)先級使用 CacheItemPriority 枚舉項中的值。

  2. Asp.Net 不提供緩存的刷新,但是我們可以使用 Response.Cache.SetExpires 方法設(shè)置數(shù)據(jù)失效日期為當(dāng)前日期,就可以刷新緩存了。

在 Asp.Net 中我們也可以進行輸出緩存,輸出緩存主要用于緩存頁面。將頁面請求的響應(yīng)放入緩存中,以后對這個頁面的請求就會從從緩存中獲得。我們可以通過添加 Page 指令來實現(xiàn),也可以通過 HTTPCachePolicy 類來實現(xiàn)。在我們緩存頁面的時候需要考慮如下幾個方面:

  • 經(jīng)常被請求但不改變的靜態(tài)頁面;

  • 更新頻率和時間已知的頁面(如顯示股票價格的頁面);

  • 根據(jù)HTTP參數(shù),有幾個可能輸出的頁面(如根據(jù)城市的代號顯示該城市天氣情況的頁面);

  • 從Web Service返回的結(jié)果。

有時存儲整個頁面會導(dǎo)致內(nèi)存使用過大,這時候就應(yīng)該使用頁面片斷緩存技術(shù)。但是頁面片段緩存技術(shù)并不是任何時候都適用,只有如下幾種情況適用:

  • 多個用戶使用的頁面片斷;

  • 包含靜態(tài)數(shù)據(jù)的頁面片斷;

  • 開銷很大的頁面片斷;

  • 多個頁面共同使用的頁面片斷。

  1. Remoting Singleton 緩存

.Net 提供了跨應(yīng)用程序域、跨進程以及跨計算機的程序運行框架。服務(wù)器激活對象中 Singleton 類型任何時候都不會同時具有多個實例。在運行過程中如果存在實例,所有客戶端請求都由該實例提供服務(wù)。如果不存在,服務(wù)器將創(chuàng)建一個實例,所有的后繼請求都將由該實例來提供服務(wù)。

  1. Memory-Mapped File

Memory-Mapped File 允許應(yīng)用程序通過指針來訪問磁盤上的文件。這種方法在多個應(yīng)用程序共享內(nèi)存時,系統(tǒng)的性能會有明顯提升?;? Memory-Mapped File 的緩存方案可以用在應(yīng)用程序的每個層中,只不過由于使用 win32 API 調(diào)用,所以 只能以非托管代碼的方式運行。

  1. SQL Server 緩存

將緩存的數(shù)據(jù)存儲在數(shù)據(jù)庫里也是常用的方法,它的優(yōu)點如下:

  • 易于實現(xiàn);

  • 完善的安全模型和很高的健壯性;

  • 方便的共享;

  • 持久保留;

  • 支持大數(shù)據(jù)量。

當(dāng)然,缺點也是顯而易見的:

  • 需要安裝SQL Server,對小型應(yīng)用來說不合適;

  • 重新構(gòu)造數(shù)據(jù)的性能和讀取數(shù)據(jù)庫的性能比較;

  • 網(wǎng)絡(luò)負擔(dān)大。

  1. 靜態(tài)變量緩存

將數(shù)據(jù)存儲器聲明為靜態(tài)變量,并且提供維護接口,由于是在內(nèi)存中,這種方案可提供對緩存數(shù)據(jù)的直接、高速的訪問,當(dāng)沒有替代方案解決鍵值對的存儲且對速度要求很高時,可以使用靜態(tài)變量。使用這種方法保存的對象前提是它不經(jīng)常更改,但是由于沒有清理緩存機制,因此這種方法會造成很高的性能開銷,并且還要保證線程安全。因此該方法不推薦使用。

  1. Asp.net session state

基于HttpSessionState對象的asp.net session state來緩存單個用戶的會話狀態(tài)信息,解決了asp中會話狀態(tài)的很多限制。Asp.net session state有三種操作模式:

  • 進程內(nèi)模式InProc:

進程內(nèi)模式是唯一支持Session_End事件的session模式,當(dāng)用戶會話超時或中止時,可以運行Session_End中的事件處理代碼來清除資源。但是在 web 應(yīng)用中 aspnet_wp.exe 的多個實例在同一臺服務(wù)器上運行,因此進程內(nèi)模式不適用 web 應(yīng)用。

  • 進程外模式State Server:

該模式使用指定的進程儲存狀態(tài)信息,使用該模式要保證你存儲的對象是可序列化的。在 web 應(yīng)用中使用時,必須保證 web.config 文件中的 <MachineKey> 元素在所有服務(wù)器上是唯一的。這樣所有的服務(wù)器使用同 樣的加密方式,才能訪問緩存中的數(shù)據(jù)。

  • SQL server模式:

該模式類似于 SQL Server 緩存 ,這里不多講解。

  1. 客戶端緩存

使用客戶端存儲頁面信息的方式來降低服務(wù)器的負擔(dān),雖然具有最低的安全保障和最有限的數(shù)據(jù)量,但卻有最快的性能。常用的客戶端緩存方法有如下五種:

  • Hidden Field

該方法也就是所謂的隱藏域,在頁面中放置一個 <input type="hidden"/> ,在其 value 屬性中存入需要緩存的值。這樣做的優(yōu)點是會和表單一起提交,而且所有瀏覽器都支持并且和服務(wù)端無關(guān)。但是同樣也具有缺點,不安全,任何人都可以修改,而且存儲結(jié)構(gòu)化數(shù)據(jù)不方便,內(nèi)容很多時會出現(xiàn)性能問題。

  • View State

這種方法和 Hidden Field 方法一樣,只不過這種方法對存儲的數(shù)據(jù)進行了加密,但是同樣具有 Hidden Field 的缺點。

  • Hidden Frame

使用Hidden Frame,避免了使用hidden field和使用view state時每次頁面回送時的緩存數(shù)據(jù)往返,優(yōu)點是可以加載大量數(shù)據(jù),可以緩存多個不同的數(shù)據(jù)。缺點同樣也很棘手,首先很多瀏覽器已經(jīng)開始不支持 Frame 了,而且客戶端可以看到隱藏的 Frame,并且大量的 Frame 會造成頁面加載很慢。

  • Cookies

Cookies 也可以存儲緩存數(shù)據(jù),可以很方便的存儲到客戶端瀏覽器中,并且支持過期策略,但是缺點也很明顯。首先容易被篡改,并且可存儲的 Cookie 數(shù)量有限,而且客戶端很有可能拒絕 Cookie 。

  • Query String

這種方法只可以在使用 HTTP GET 方式調(diào)用URL時使用,服務(wù)端可直接讀取,而且所有瀏覽器都可以使用,但是因為是在 URL 中顯示出來,所以很容易被篡改,而且有長度限制,字符不能超過 255個字符。

三、總結(jié)

通過上述的講解,相信大家已經(jīng)理解了緩存的使用,我們在使用時應(yīng)注意使用的場景和使用的方法。

作者介紹:

朱鋼,筆名喵叔,國內(nèi)某技術(shù)博客認證專家,.NET高級開發(fā)工程師,7年一線開發(fā)經(jīng)驗,參與過電子政務(wù)系統(tǒng)和AI客服系統(tǒng)的開發(fā),以及互聯(lián)網(wǎng)招聘網(wǎng)站的架構(gòu)設(shè)計,目前就職于一家初創(chuàng)公司,從事企業(yè)級安全監(jiān)控系統(tǒng)的開發(fā)。

【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】

 

責(zé)任編輯:龐桂玉 來源: 51CTO
相關(guān)推薦

2009-07-24 10:36:08

ASP.NET控件

2022-05-10 08:08:01

find命令Linux

2025-01-21 08:00:00

限流微服務(wù)算法

2010-10-15 10:02:01

Mysql表類型

2013-01-07 10:14:06

JavaJava枚舉

2019-09-06 09:00:00

開發(fā)技能代碼

2020-01-14 11:09:36

CIO IT技術(shù)

2025-01-15 10:46:23

開發(fā)JavaScript集合

2017-08-31 14:57:53

數(shù)據(jù)庫MySQLJOIN

2017-06-14 16:44:15

JavaScript原型模式對象

2017-06-02 09:52:50

2010-08-31 10:57:36

2021-07-16 09:55:46

數(shù)據(jù)工具軟件

2019-10-29 06:30:31

告警疲勞網(wǎng)絡(luò)安全安全風(fēng)險

2010-06-08 09:49:45

UML元件

2011-03-14 10:46:03

2023-12-22 14:27:30

2022-05-27 15:19:38

架構(gòu)師溝通認知

2020-07-23 10:20:28

物聯(lián)網(wǎng)工業(yè)物聯(lián)網(wǎng)技術(shù)

2014-05-13 09:56:24

數(shù)據(jù)挖掘
點贊
收藏

51CTO技術(shù)棧公眾號