成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

細說.NET的七種緩存

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

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

一、什么是緩存

  1. 緩存能干什么

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

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

  • 提高穩定性:在大量請求對同一個數據或者邏輯多次調用時會造成很大的資源浪費,甚至會造成系統不穩定。這時我們可以將這些資源緩存起來,每次請求時都從緩存中讀取,這樣就提高了系統的穩定性;

  • 提高可用性:當數據系統服務出現問題時,通過緩存可以繼續向請求端提供數據服務,只不過這時的數據有可能是過時的;

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

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

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

  1. 緩存狀態

所謂緩存狀態是應用系統在一個時間點上數據的狀態,這些數據有可能是持久化到數據庫中,也有可能是臨時存儲在內存中等等。在這一小節里我們將學習到緩存生命周期、范圍和陳舊數據如何處理。

  • 緩存生命周期

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

 

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

 

  •  緩存范圍

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

  • 物理范圍  

 

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

 

  • 邏輯范圍   

 

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

 

  • 緩存陳舊數據處理

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

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

  • 舊數據的影響程度:緩存數據不更新或更新不及時是否對整個系統或者核心業務有影響。

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

  1. 應考慮的東西

在使用緩存時,我們應從 5 個方面考慮:

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

  • 安全性:如何保證緩存的數據不被其他沒有權限的進程、方法訪問;

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

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

  • 內容加載:內容如何加載,是在應用程序啟動時就提前加載,還是使用到時先從主數據獲取數據,之后再放在緩存里。

二、.NET 中的緩存

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

  1. Asp.net 緩存

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

  • File Dependency :文件依賴,當硬盤上的一個或多個文件更改時,強制移除緩存數據。

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

Tip:

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

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

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

  • 經常被請求但不改變的靜態頁面;

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

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

  • 從Web Service返回的結果。

有時存儲整個頁面會導致內存使用過大,這時候就應該使用頁面片斷緩存技術。但是頁面片段緩存技術并不是任何時候都適用,只有如下幾種情況適用:

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

  • 包含靜態數據的頁面片斷;

  • 開銷很大的頁面片斷;

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

  1. Remoting Singleton 緩存

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

  1. Memory-Mapped File

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

  1. SQL Server 緩存

將緩存的數據存儲在數據庫里也是常用的方法,它的優點如下:

  • 易于實現;

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

  • 方便的共享;

  • 持久保留;

  • 支持大數據量。

當然,缺點也是顯而易見的:

  • 需要安裝SQL Server,對小型應用來說不合適;

  • 重新構造數據的性能和讀取數據庫的性能比較;

  • 網絡負擔大。

  1. 靜態變量緩存

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

  1. Asp.net session state

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

  • 進程內模式InProc:

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

  • 進程外模式State Server:

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

  • SQL server模式:

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

  1. 客戶端緩存

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

  • Hidden Field

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

  • View State

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

  • Hidden Frame

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

  • Cookies

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

  • Query String

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

三、總結

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

作者介紹:

朱鋼,筆名喵叔,國內某技術博客認證專家,.NET高級開發工程師,7年一線開發經驗,參與過電子政務系統和AI客服系統的開發,以及互聯網招聘網站的架構設計,目前就職于一家初創公司,從事企業級安全監控系統的開發。

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2025-05-13 08:20:58

2009-07-24 10:36:08

ASP.NET控件

2022-05-10 08:08:01

find命令Linux

2010-10-15 10:02:01

Mysql表類型

2025-01-21 08:00:00

限流微服務算法

2019-09-06 09:00:00

開發技能代碼

2020-01-14 11:09:36

CIO IT技術

2013-01-07 10:14:06

JavaJava枚舉

2025-01-15 10:46:23

開發JavaScript集合

2019-10-29 06:30:31

告警疲勞網絡安全安全風險

2017-06-14 16:44:15

JavaScript原型模式對象

2017-06-02 09:52:50

2017-08-31 14:57:53

數據庫MySQLJOIN

2021-07-16 09:55:46

數據工具軟件

2010-08-31 10:57:36

2017-12-15 09:05:16

Linux終端高手Bash shell

2022-05-27 15:19:38

架構師溝通認知

2020-07-23 10:20:28

物聯網工業物聯網技術

2020-07-15 14:56:35

欺騙性防御網絡威脅網絡攻擊

2021-04-28 09:27:56

MySQLInnoDB數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕免费在线 | 精品国产一区久久 | 99精品一区 | 中文字幕专区 | 亚洲精品视频在线看 | 国产精品久久久久久亚洲调教 | 久久久久久久久久久久久9999 | 97日日碰人人模人人澡分享吧 | 国产欧美精品一区二区色综合朱莉 | 黄色片视频网站 | 一区二区三区四区不卡视频 | 国产精品久久久久久久久久软件 | 久久精品亚洲一区二区三区浴池 | 欧美高清视频一区 | 天天看夜夜 | 操操日| 99爱免费 | 久久1区 | 久久久亚洲一区 | 免费国产视频在线观看 | 日本网站在线看 | 国产蜜臀97一区二区三区 | 九九热在线观看视频 | 国产中文区二幕区2012 | 国产日韩精品视频 | 二区av | 日韩一区二区av | 亚洲欧美自拍偷拍视频 | 91亚洲精品在线观看 | 国产99久久久国产精品下药 | 精品99久久 | 国产成人综合av | 91九色porny首页最多播放 | 国产精品免费看 | 日本aa毛片a级毛片免费观看 | 成人深夜福利 | 欧美精品在线免费 | 国产一区二区视频免费在线观看 | 国产精品一区二区不卡 | 中文字幕三区 | 成人区一区二区三区 |