iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

介紹

這裡說的快取是,伺服器通常拿資料的時候可能會去跟資料庫索取資料,而快取會將曾經索取過的資料存放到記憶體中,當下次再拿資料的時候就可以直接從記憶體中拿取,讓回應時間變短。

基礎原理架構

建構一個static 的類別(靜態字典)

//私有化為了安全,靜態為了常駐內存 Dictionary保存多個keyValuePair
privatic static Dictionary<string,object> CustomCacheDictionary = new Dictionary,string,object>();

public static void Add(string key,object value)
{
 CustomCachDictionary[key] = value;
}

public static T Get<T>(string key)
{
  return (T)CustomCachDicitionary[key];
}

public static bool Contains(string key)
{
    return CustomCacheDicitionary.ContainsKey(key);
}

要使用就只需要,先用if判斷Contains 內存使否已經有包含資料
如果沒有再從資料庫抓取 並把資料偷過Add方法傳入Dictionary
如果有就直接重內存抓取透過Get方法

快取實作範例

這裡簡單示範一下最常使用到的 MemoryCache lib

注意Key 跟data 不能給null 會有Exception

MemoryCache => 快取物件
CacheItemPolicy =>用來設定快取的回收時間

實作步驟:

  1. 建立ObjectCache
  2. 檢查cache中是否包含key
  3. 建立CacheItemPolicy物件設定存活時間
  4. 將資料加入到快取(cache.Add)
//命名空間 System.Runtime.Caching
ObjectCache cache = MemoryCache.Default;

//要查詢的key
string cacheKey = "FileContents";
//判斷快取是否有這組key的資料
if (cache.Contains(cacheKey)) 
{
    //取得快取中的資料
    var data = cache[cacheKey];
}
else 
{
    //CacheItemPolicy 物件來提供快取專案的收回和到期詳細資料
    var policy = new CacheItemPolicy();
    //設定快取存活時間
    policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(1);
    //新增資料到快取裡面
    cache.Add(new CacheItem(cacheKey, "測試資料"), policy);
}

移除快取資料 =>Remove(key)

cache.Remove(cacheKey);

搭配泛型取得資料方式

/// <summary>
/// 取得快取資料
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T Get<T>(string key)
{
    if (cache.Contains(key))
    {
        return (T)cache[key];
    }
    else
    {
        return default(T);
    }
}

關於各級快取、本地快取原理和實現、快取更新和快取應用之後會專門寫一篇文章跟大家講解

本篇已同步發表至個人部落格
https://moushih.com/2022ithome27/


上一篇
玩轉C#之【爬蟲】
下一篇
玩轉C#之【SignalR】
系列文
玩轉C# 進階學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言