C# 高速緩存 Cache緩存, 防止多次讀取數據庫


在進行項目設計的時候會出現對重復 數據的重用 可能會用cookie 和 session, 但是對於安全性和性能方面都不是最實用的!

Cache的概述及用法和幫助類:

  Cache 即高速緩存.那么cache是怎么樣提高系統性能與運行速度呢?是不是在任何情況下用cache都能提高性能?是不是cache用的越多就越好呢?

  Cache 是怎么樣工作的?

  Cache 是分配在服務器上的一個公共的內存片。

  所謂公共指的cache只要一創建是任何一個客戶端瀏覽器都可以通過后台代碼訪問到它,它面向的是所有用戶,相對而言session也是服務器上的一 段內存,但他面向的是單個用戶。它是服務器的一段內存塊,也就是說每個cache一經創建就占用了服務器資源的。所以從這點來說我們就可以說:並不是 cache越多越好。  

  cache 是有時間限制的,超過了服務器設定的過期時間,它就會被服務器回收。

  cache 可以存放任何對象

     Cache支持裝箱/拆箱操作。如你可以把一個DataSet對象ds通過Cache.Insert(“dsCache”,ds)的方式存到Cache中,可以通過拆箱操作 DataSet ds = (DataSet)Cache[“dsCache”]來訪問它。

     Cache 一般用於數據較固定,用的較頻繁的地方。

    Cache是有時間限制的。超過了服務器設置的過期時間,就會被服務器回收。當cache被回收后對應的內存塊就會被清空,再次通過cache[“cachekey”]訪問對象時返回的就是null值。

web站點中緩存的重要性毋庸置疑。我想很多.net開發人員在開發web應用系統的時候優先考慮使用的緩存並不是第三方緩存解決方案(比如 分布式緩存memcached、redis等等),而應該是.net framework已經提供的多種緩存解決方案。下面談談對.net framework中緩存的認識。

 

1、System.Web.Caching.Cache

 

估計大部分做過asp.net開發的人都用過這個命名空間下的緩存,我們可以直接使用HttpContext.Current.Cache實例而不 用實例化。當然這個命名空間下的Cache類是允許您實例化的,需要定制自己的緩存系統的當然可以完全自己控制如何初始化這個類。我在園子里看到過有很多 文章介紹Cache的CRUD輔助類庫大多數都是針對System.Web.Caching.Cache。

 

需要說明的是,我們還可以通過該命名空間下的HttpRuntime.Cache實現web、控制台、winform等不同表現形式下的緩存,而且 完全無需自己實例化。HttpRuntime.Cache是之前個人開發中使用比較多的一個類,現在比較偏愛.net framework4.0中的增強型的緩存類MemoryCache。

 

2、Output Cache

 

眾所周知,輸出緩存主要分頁面輸出緩存和頁面部分緩存。說白了,就是緩存整個頁面的html或者部分html,沒什么值得討論的。

 

3、System.Runtime.Caching

 

現在開發中使用最多的類MemoryCache出自這個命名空間,使用前需要引用using System.Runtime.Caching。MemoryCache繼承自ObjectCache, IEnumerable, IDisposable,其中ObjectCache是個抽象類。用過MemoryCache的人都知道,這個MemoryCache有一個屬性叫 Default,通常可以像下面這樣使用:

 

private static ObjectCache memCache = MemoryCache.Default;

當然我們也完全可以通過public MemoryCache(string name, NameValueCollection config = null)構造函數初始化緩存對象。

 

 

cache與session,cookie的區別:

 

session把數據保存在服務器端,每一個用戶都有屬於自己的Session,與別人的不沖突

就是說,你登陸系統后,你的信息(如賬號、密碼等)就會被保存在服務器上一個單獨的session中,當你退出系統后服務器就會丟掉這個session,你的數據也就沒了,必須再次登陸,如果登陸超時也會被丟掉,要看人家系統是怎么設置的了

Cookie同session一樣是保存你個人信息的,不過是保存在客戶端,也就是你使用的電腦上,並且不會被丟掉,除非你刪除瀏覽器Cookie

Cache是保存系統上的信息的,因為從Cache中讀數據比較快,有些系統(網站)會把一些經常被使用的數據放到Cache里,提高訪問速度,優化系統性能 

session和cookie是面向單個用戶的,cache是面向的是所有用戶。

End。。。

 

Cachehelper類

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7 using System.Web;
  8 using System.Web.Caching;
  9 
 10 namespace 后端操作cookie
 11 {
 12 class CacheHelper
 13 { /// <summary>
 14 /// 獲取當前應用程序指定CacheKey的Cache值
 15 /// </summary>
 16 /// <param name="CacheKey">
 17 /// <returns></returns>y
 18 public static object GetCache(string CacheKey)
 19 {
 20 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 21 return objCache[CacheKey];
 22 }
 23 
 24 /// <summary>
 25 /// 設置當前應用程序指定CacheKey的Cache值
 26 /// </summary>
 27 /// <param name="CacheKey">
 28 /// <param name="objObject">
 29 public static void SetCache(string CacheKey, object objObject)
 30 {
 31 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 32 objCache.Insert(CacheKey, objObject);
 33 }
 34 
 35 
 36 /// <summary>
 37 /// 設置當前應用程序指定CacheKey的Cache值
 38 /// </summary>
 39 /// <param name="CacheKey">
 40 /// <param name="objObject">
 41 public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
 42 {
 43 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 44 objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
 45 }
 46 
 47 /// <summary> 
 48 /// 設置數據緩存 
 49 /// </summary> 
 50 public static void SetCache(string CacheKey, object objObject, int timeout = 7200)
 51 {
 52 try
 53 {
 54 if (objObject == null) return;
 55 var objCache = HttpRuntime.Cache;
 56 //相對過期 
 57 //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null); 
 58 //絕對過期時間 
 59 objCache.Insert(CacheKey, objObject, null, DateTime.Now.AddSeconds(timeout), TimeSpan.Zero, CacheItemPriority.High, null);
 60 }
 61 catch (Exception)
 62 {
 63 //throw; 
 64 }
 65 }
 66 /// <summary>
 67 /// 清除單一鍵緩存
 68 /// </summary>
 69 /// <param name="key">
 70 public static void RemoveKeyCache(string CacheKey)
 71 {
 72 try
 73 {
 74 System.Web.Caching.Cache objCache = HttpRuntime.Cache;
 75 objCache.Remove(CacheKey);
 76 }
 77 catch { }
 78 }
 79 
 80 /// <summary>
 81 /// 清除所有緩存
 82 /// </summary>
 83 public static void RemoveAllCache()
 84 {
 85 System.Web.Caching.Cache _cache = HttpRuntime.Cache;
 86 IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
 87 if (_cache.Count > 0)
 88 {
 89 ArrayList al = new ArrayList();
 90 while (CacheEnum.MoveNext())
 91 {
 92 al.Add(CacheEnum.Key);
 93 }
 94 foreach (string key in al)
 95 {
 96 _cache.Remove(key);
 97 }
 98 }
 99 }
100 /// <summary> 
101 /// 清除所有緩存
102 /// </summary> 
103 public static void RemoveAllCaches()
104 {
105 var cache = HttpRuntime.Cache;
106 var cacheEnum = cache.GetEnumerator();
107 while (cacheEnum.MoveNext())
108 {
109 cache.Remove(cacheEnum.Key.ToString());
110 }
111 }
112 /// <summary>
113 /// 以列表形式返回已存在的所有緩存 
114 /// </summary>
115 /// <returns></returns> 
116 public static ArrayList ShowAllCache()
117 {
118 ArrayList al = new ArrayList();
119 System.Web.Caching.Cache _cache = HttpRuntime.Cache;
120 if (_cache.Count > 0)
121 {
122 IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
123 while (CacheEnum.MoveNext())
124 {
125 al.Add(CacheEnum.Key);
126 }
127 }
128 return al;
129 }
130 
131 }
132 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM