1. 程式人生 > WINDOWS開發 >C#快取載入資料與讀取

C#快取載入資料與讀取

#轉自:https://blog.csdn.net/qq_24025219/article/details/96734660

https://blog.csdn.net/nnn_net/article/details/53394603

https://www.cnblogs.com/xianyv/archive/2019/04/27/10682438.html

C#本地快取

1. 什麼是快取?
快取就是資料交換的緩衝區(又稱作Cache),當某一硬體要讀取資料時,會首先從快取中查詢需要的資料,找到了則直接執行,找不到的話則從記憶體中查詢。由於快取的執行速度比記憶體快得多,故快取的作用就是幫助硬體更快地執行。
因為快取往往使用的是RAM(斷電即掉的非永久性儲存),所以在用完後還是會把檔案送到硬碟等儲存器裡永久儲存。電腦裡最大的快取就是記憶體條了,最快的是CPU上鑲的L1和L2快取,顯示卡的視訊記憶體是給顯示卡運算晶片用的快取,硬碟上也有16M或者32M的快取。

其實,快取是CPU的一部分,它存在於CPU中

CPU存取資料的速度非常的快,一秒鐘能夠存取、處理十億條指令和資料(術語:CPU主頻1G),而記憶體就慢很多,快的記憶體能夠達到幾十兆就不錯了,可見兩者的速度差異是多麼的大

快取是為了解決CPU速度和記憶體速度的速度差異問題

記憶體中被CPU訪問最頻繁的資料和指令被複制入CPU中的快取,這樣CPU就可以不經常到象“蝸牛”一樣慢的記憶體中去取資料了,CPU只要到快取中去取就行了,而快取的速度要比記憶體快很多。

C#中的快取技術

1、HttpRuntime.Cache 相當於就是一個快取具體實現類,這個類雖然被放在了 System.Web 名稱空間下了。但是非 Web 應用也是可以拿來用的。

2、HttpContext.Cache 是對上述快取類的封裝,由於封裝到了 HttpContext ,侷限於只能在知道 HttpContext 下使用,即只能用於 Web 應用。

綜上所屬,在可以的條件,儘量用 HttpRuntime.Cache ,而不是用 HttpContext.Cache 。

Cache有以下幾條快取資料的規則。
第一,資料可能會被頻繁的被使用,這種資料可以快取。
第二,資料的訪問頻率非常高,或者一個數據的訪問頻率不高,但是它的生存週期很長,這樣的資料最好也快取起來。
第三是一個常常被忽略的問題,有時候我們快取了太多資料,通常在一臺X86的機子上,如果你要快取的資料超過800M的話,就會出現記憶體溢位的錯誤。所以說快取是有限的。換名話說,你應該估計快取集的大小,把快取集的大小限制在10以內,否則它可能會出問題。

1.cache的建立
cache.Insert(string key,object value,CacheDependency dependencies,DateTime absoluteExpiration,TimeSpan slidingExpiration)//只介紹有5個引數的情況,其實cache裡有很幾種過載
引數一:引用該物件的快取鍵
引數二:要插入快取中的物件
引數三:快取鍵的依賴項,當任何依賴項更改時,該物件即無效,並從快取中移除。null.">如果沒有依賴項,則此引數包含null。
引數四:設定快取過期時間
引數五:引數四的依賴項,如果使用絕對到期,null.">slidingExpirationparameter must beNoSlidingExpiration.">則slidingExpiration引數必須為NoSlidingExpiration

絕對過期時間即:超過設定時間即過期

相對過期時間:超過多少時間不呼叫就失效,單位為秒

2.銷燬cache
cache.Remove(string key)//key為快取鍵,通過快取鍵進行銷燬
3.呼叫cache
例如你存的是一個DataTable物件,呼叫如下: DataTable finaltable = Cache["dt"] as DataTable;
4.一般什麼時候選用cache
cache一般用於資料較固定,訪問較頻繁的地方,例如在前端進行分頁的時候,初始化把資料放入快取中,然後每次分頁都從快取中取資料,這樣減少了連線資料庫的次數,提高了系統的效能。

2. 本地快取的作用?
快取主要是為了提高資料的讀取速度。因為伺服器和應用客戶端之間存在著流量的瓶頸,所以讀取大容量資料時,使用快取來直接為客戶端服務,可以減少客戶端與伺服器端的資料互動,從而大大提高程式的效能。
1.減少IO操作,提高讀取速度,提高效能,減輕伺服器壓力。

3. 本地快取的程式碼及方法

技術分享圖片

獲取:

技術分享圖片

設定:

技術分享圖片

移除:

技術分享圖片

清空:

技術分享圖片

程式碼工具類:

using System;
using System.Web;
using System.Collections;
using System.Web.Caching;
 
public class CacheHelper
{
    /// <summary>
    /// 獲取資料快取
    /// </summary>
    /// <param name="cacheKey"></param>
    public static object GetCache(string cacheKey)
    {
        var objCache = HttpRuntime.Cache.Get(cacheKey);
        return objCache;
    }
    /// <summary>
    /// 設定資料快取
    /// </summary>
    public static void SetCache(string cacheKey,object objObject)
    {
        var objCache = HttpRuntime.Cache;
        objCache.Insert(cacheKey,objObject);
    }
    /// <summary>
    /// 設定資料快取
    /// </summary>
    public static void SetCache(string cacheKey,object objObject,int timeout = 7200)
    {
        try
        {
            if (objObject == null) return;
            var objCache = HttpRuntime.Cache;
            //相對過期
            //objCache.Insert(cacheKey,objObject,null,DateTime.MaxValue,timeout,CacheItemPriority.NotRemovable,null);
            //絕對過期時間
            objCache.Insert(cacheKey,null,DateTime.Now.AddSeconds(timeout),TimeSpan.Zero,CacheItemPriority.High,null);
        }
        catch (Exception)
        {
            //throw;
        }
    }
    /// <summary>
    /// 移除指定資料快取
    /// </summary>
    public static void RemoveAllCache(string cacheKey)
    {
        var cache = HttpRuntime.Cache;
        cache.Remove(cacheKey);
    }
    /// <summary>
    /// 移除全部快取
    /// </summary>
    public static void RemoveAllCache()
    {
        var cache = HttpRuntime.Cache;
        var cacheEnum = cache.GetEnumerator();
        while (cacheEnum.MoveNext())
        {
            cache.Remove(cacheEnum.Key.ToString());
        }
    }
}

呼叫方式:

public IEnumerable<CompanyModel> FindCompanys()
        {
            var cache = CacheHelper.GetCache("commonData_Company");//先讀取
            if (cache == null)//如果沒有該快取
            {
                var queryCompany = _base.CompanyModel();//從資料庫取出
                var enumerable = queryCompany.ToList();
                CacheHelper.SetCache("commonData_Company",enumerable);//新增快取
                return enumerable;
            }
            var result = (List<CompanyModel>)cache;//有就直接返回該快取
            return result;
        }

測試結果:

技術分享圖片

首次載入進來是為null,然後讀取資料庫,新增進快取,當前返回前臺的是從資料庫中取出的資料。

技術分享圖片

重新整理頁面,發現快取中已經有了讀出的30條資料,

技術分享圖片

然後接下來走,返回快取中的資料:

技術分享圖片