1. 程式人生 > >Zara精講C#.Cache、它和Redis區別是什麼???

Zara精講C#.Cache、它和Redis區別是什麼???

前言:今天在部落格園看到大佬在用Cache,非常不懂,原來它是搞快取的,原來我只知道Redis是搞這個的,才知道有這個玩膩。

  那它們的區別是什麼呢?? 區別: redis是分散式快取,是將資料隨機分配到不同伺服器的,catch屬於單機快取,只能本機訪問。

那Cache是如何工作的呢?

所謂公共指的cache只要一建立是任何一個客戶端瀏覽器都可以通過後臺程式碼訪問到它,它面向的是所有使用者,相對而言session也是伺服器上的一 段記憶體,但他面向的是單個使用者。它是伺服器的一段記憶體塊,也就是說每個cache一經建立就佔用了伺服器資源的。所以從這點來說我們就可以說:並不是 cache越多越好。cache 是有時間限制的,超過了伺服器設定的過期時間,它就會被伺服器回收。cache 可以存放任何物件。

如何操作Cache??

建立:在DotNet環境下通過Cache.Insert(string key,object o)方法建立。其中key 代表cache的ID,o代表存到cache裡的物件。

銷燬cache:通過方法Cache.Remove(string key), 其中key 代表cache的 ID.

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

最後附大佬封裝好的幫助類一份:

C#/CacheHelper:

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 List<string> GetCompanyList()
        {
            var cache = CacheHelper.GetCache("Company_List");
            if (cache == null)//如果不存在
            {
                //var queryCompany = _Project_BLL_GetCompanyList;
                var queryCompany = new List<string>()
                {
                    "Zara部落格工作室","中國網銀","部落格園"
                };
                CacheHelper.SetCache("companyData",queryCompany);//新增快取
                return queryCompany.ToList();
            }
            return (List<string>)cache; //如果有的話就直接返回了
        }