偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

細(xì)說(shuō).NET的七種緩存

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

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

一、什么是緩存

  1. 緩存能干什么

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

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

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

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

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

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

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

  1. 緩存狀態(tài)

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

  • 緩存生命周期

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

 

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

 

  •  緩存范圍

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

  • 物理范圍  

 

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

 

  • 邏輯范圍   

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

二、.NET 中的緩存

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

  1. Asp.net 緩存

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

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

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

Tip:

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

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

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

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

  • 更新頻率和時(shí)間已知的頁(yè)面(如顯示股票價(jià)格的頁(yè)面);

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

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

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

  • 多個(gè)用戶使用的頁(yè)面片斷;

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

  • 開(kāi)銷(xiāo)很大的頁(yè)面片斷;

  • 多個(gè)頁(yè)面共同使用的頁(yè)面片斷。

  1. Remoting Singleton 緩存

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

  1. Memory-Mapped File

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

  1. SQL Server 緩存

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

  • 易于實(shí)現(xiàn);

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

  • 方便的共享;

  • 持久保留;

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

當(dāng)然,缺點(diǎn)也是顯而易見(jiàn)的:

  • 需要安裝SQL Server,對(duì)小型應(yīng)用來(lái)說(shuō)不合適;

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

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

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

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

  1. Asp.net session state

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

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

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

  • 進(jìn)程外模式State Server:

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

  • SQL server模式:

該模式類(lèi)似于 SQL Server 緩存 ,這里不多講解。

  1. 客戶端緩存

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

  • Hidden Field

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

  • View State

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

  • Hidden Frame

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

  • Cookies

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

  • Query String

這種方法只可以在使用 HTTP GET 方式調(diào)用URL時(shí)使用,服務(wù)端可直接讀取,而且所有瀏覽器都可以使用,但是因?yàn)槭窃?URL 中顯示出來(lái),所以很容易被篡改,而且有長(zhǎng)度限制,字符不能超過(guò) 255個(gè)字符。

三、總結(jié)

通過(guò)上述的講解,相信大家已經(jīng)理解了緩存的使用,我們?cè)谑褂脮r(shí)應(yīng)注意使用的場(chǎng)景和使用的方法。

作者介紹:

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

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

 

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

2025-05-13 08:20:58

2022-05-10 08:08:01

find命令Linux

2009-07-24 10:36:08

ASP.NET控件

2010-10-15 10:02:01

Mysql表類(lèi)型

2025-01-21 08:00:00

限流微服務(wù)算法

2019-09-06 09:00:00

開(kāi)發(fā)技能代碼

2020-01-14 11:09:36

CIO IT技術(shù)

2013-01-07 10:14:06

JavaJava枚舉

2025-01-15 10:46:23

開(kāi)發(fā)JavaScript集合

2019-10-29 06:30:31

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

2021-07-16 09:55:46

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

2017-06-02 09:52:50

2017-08-31 14:57:53

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

2017-06-14 16:44:15

JavaScript原型模式對(duì)象

2010-08-31 10:57:36

2014-05-13 09:56:24

數(shù)據(jù)挖掘

2021-04-28 09:27:56

MySQLInnoDB數(shù)據(jù)庫(kù)

2022-05-27 15:19:38

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

2023-02-14 10:37:43

API端點(diǎn)版本

2017-12-15 09:05:16

Linux終端高手Bash shell
點(diǎn)贊
收藏

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