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.">slidingExpiration parameter 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, objObject, 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條數據,


然后接下來走,返回緩存中的數據:

 


免責聲明!

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



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