婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > .NET 緩存模塊設計實踐

.NET 緩存模塊設計實踐

熱門標簽:電銷專用外呼線路 威力最大的電銷機器人 廣西房產智能外呼系統推薦 400電話唐山辦理 電銷外呼系統是違法的嗎 旅游地圖標注線路 地圖標注位置怎么弄圖 電話機器人鑰匙扣 漯河外呼調研線路

上一篇談了我對緩存的概念,框架上的理解和看法,這篇承接上篇講講我自己的緩存模塊設計實踐。 

基本的緩存模塊設計
最基礎的緩存模塊一定有一個統一的CacheHelper,如下: 

  public interface ICacheHelper
  {   
    T GetT>(string key);
        
    void SetT>(string key, T value);   

    void Remove(string key);        
  }

然后業務層是這樣調用的 

  public User Get(int id)
    {
      if (id = 0)
        throw new ArgumentNullException("id");

      var key = string.Format(USER_CACHE_KEY, id);
      var user = _cacheHelper.GetUser>(key);
      if (user != null)
        return user;

      return _repository.Get(id);
    }  

上面的代碼沒什么錯誤,但是實際運用的時候就產生疑問了,因為我一直強調緩存要保存"熱數據",那樣"熱數據"一定會有過期的時候,我們不可能另外寫一個去Set。所以干脆就結合到一起寫是比較合適的。 

public User GetV2(int id)
{
  if (id = 0)
    throw new ArgumentNullException("id");

  var key = string.Format(USER_CACHE_KEY, id);
  var user = _cacheHelper.GetUser>(key);
  if (user != null)
    return user;
    user = _repository.Get(id);
  if (user != null)
    _cacheHelper.Set(key, user);
    return user;
}

上面的代碼其實只是加了一個Set而已,就這樣的設計的話,每次一個Get需要的重復代碼實在是太多了,那么是不是應該更精簡?這時候吃點C#語法糖就很有必要了,語法糖偶爾吃點增進效率,何樂而不為? 

public User GetV3(int id)
{
   if (id = 0)
     throw new ArgumentNullException("id");

   var key = string.Format(USER_CACHE_KEY, id);
    return _cacheHelperV2.GetUser>(key, () => _repository.Get(id));      
}

//ICache GetT>實現
public T GetT>(string key, FuncT> fetch = null)
{
  T result = default(T);
  var obj = Cache.Get(key);
  if (obj is T)
  {
    result = (T)obj;
  }

  if(result == null)
  {
    result = fetch();

    if (result != null)
      Set(key, result);
  }

  return result;
}      

這里我直接把Set方法都包裝進了ICache.GetT>,附帶上Fetch Func。這樣就把公共的操作抽象到了一起,簡化了Cache的調用,完美的符合了我的想法。

緩存模塊設計進階
上一節里的ICache V3幾乎已經最精簡了,但是其實參考了ServiceStack.Redis之后,我發現了更加的抽象方式。很明顯上一節的所有代碼里,都是手動管理Key的,對于通常的對象Cache,這個Key還需要手動嗎?來上最后一份改進。 

public T GetT>(object id, FuncT> fetch = null)
{
  var type = typeof(T);
  var key = string.Format("urn:{1}:{2}", type.Name, id.ToString());//這里是關鍵,直接用TypeName來充當Key

  return Get(key, fetch);
}

public T GetT>(string key, FuncT> fetch = null)
{
  T result = default(T);

  var obj = Cache.Get(key);
  if (obj is T)
  {
    result = (T)obj;
  }

  if (result == null)
  {
    result = fetch();

    if (result != null)
      Set(key, result);
   }

   return result;
}

Get方法完全自動化管理了Key,然后調用的方式再次被精簡。

public User GetV4(int id)
{
   if (id = 0)
    throw new ArgumentNullException("id");

   return _cacheHelperV3.GetUser>(id, () => _repository.Get(id));
}

很明顯還少了最重要的Set啊,Set的時候這個Key獲取就要費一點事情了,最需要 解決的是如何獲取這個主鍵id的值。 

public class User
{
    [PrimaryKey] //這個Attribute是最重要的東西
    public int UserId { get; set;}

    public string UserName { get; set; }

    public string Cellphone { get; set; }
}
public void SetT>(T obj)
{
   //此處應該被緩存以提高反射的效率
   var type = typeof(T);
   var primaryKey = type.GetProperties()
        .FirstOrDefault(t => t.GetCustomAttributes(false)
          .Any(c => c is PrimaryKeyAttribute));//這里通過取PrimaryKeyAttribute來獲取ID的value
    var keyValue = primaryKey.GetValue(obj, null);      
    var key = string.Format("urn:{0}:{1}", type.Name, keyValue);

    var dt = DateTime.UtcNow.AddDays(1);//假設默認緩存1天
    var offset = new DateTimeOffset(dt);
    Cache.Set(key, obj, offset);
}

到這里,我想到的最終版本的ICache就完成了。這里還需要說明的是其實PrimaryKey可以更加靈活多變。很多時候一個Object的PrimaryKey是很復雜的,這時候設計Cache實體的時候可以變通下:

public class UserCacheEntity
{
    [PrimaryKey]
    public int ID
    {
      get
      {
        return string.Format("{0}:{1}", UserId, UserName);
      }
    }

    public int UserId { get; set; }

    public string UserName { get; set; }

    public string Cellphone { get; set; }
}

上面的方式幾乎可以自動管理常見的數據Cache了,唯一麻煩的是 需要自定義一個CacheObject,這樣就帶來了實體轉換的麻煩,這時候就要看怎么取舍了。
 再次說明下我想要的ICache設計: 

1. 永遠只Cache熱數據,這意味著每個Key都要有過期時間 
2. ICache自動管理Get/Set,最好能自動管理Key。 
3. ICache精簡同時又不失靈活。 
詳細的代碼Demo可以參考:Git

更靈活的實現 
我在寫這篇總結之前,也一直在思考Cache應該放到什么層,普通三層的時候放哪里?DDD那樣分層的時候又放哪里。Google了下,看到了一些參考。 
http://stackoverflow.com/questions/15340173/in-which-layer-implement-the-cache 
我覺得這里比較符合我的想法,Cache應該是全局任意的,當然實現起來當然是interface+IOC,這樣引用起來更加的獨立一些。 
另外還有Cache更加高級的使用,AOP結合ICache V4這樣的設計,豈不是更好?這里我還沒有去實現AOP的Attribute,這又是一個大話題的,下次再來實現吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • ASP.NET緩存管理的幾種方法
  • asp.net(C#)遍歷memcached緩存對象
  • Asp.Net Cache緩存使用代碼
  • ASP.NET網站管理系統退出 清除瀏覽器緩存,Session的代碼
  • .net/c# memcached緩存獲取所有緩存鍵的方法步驟
  • asp.net 客戶端瀏覽器緩存的Http頭介紹
  • ASP.net Substitution 頁面緩存而部分不緩存的實現方法
  • ASP.NET性能優化之讓瀏覽器緩存動態網頁的方法
  • ASP.NET頁面在IE緩存的清除辦法
  • asp.net 提高網站速度及如何利用緩存

標簽:銅陵 試駕邀約 焦作 湖北 綏化 欽州 無錫 湘西

巨人網絡通訊聲明:本文標題《.NET 緩存模塊設計實踐》,本文關鍵詞  .NET,緩存,模塊,設計,實踐,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《.NET 緩存模塊設計實踐》相關的同類信息!
  • 本頁收集關于.NET 緩存模塊設計實踐的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    天天色天天爱天天射综合| 国产精华液一区二区三区| 91国产成人在线| 亚洲高清免费观看高清完整版在线观看| 成人精品一区二区三区中文字幕| 亚洲欧美激情一区二区| 国产福利一区二区| 日本aⅴ免费视频一区二区三区| 日韩一区二区三区在线| 色狠狠一区二区| 国产精选一区二区三区| 亚洲黄色尤物视频| 国产精品私人影院| 欧美精品国产精品| 成人精品gif动图一区| 亚洲色图.com| 日韩你懂的在线播放| 欧美无乱码久久久免费午夜一区| 国产一区二区日韩精品| 美女网站色91| 日韩久久一区二区| 亚洲欧美在线视频| 日韩一区国产二区欧美三区| 国产美女精品人人做人人爽| 日韩免费高清视频| 国产成+人+日韩+欧美+亚洲| 免费成人在线影院| 激情综合色综合久久| 成人久久视频在线观看| 国产精品久久久久毛片软件| 欧美经典三级视频一区二区三区| 欧美tickling网站挠脚心| 欧美丝袜自拍制服另类| 日韩久久久久久| 国产性天天综合网| 国产精品美女视频| 欧美午夜不卡视频| 欧美精品一区二区三| 久久久不卡网国产精品一区| 久久久久久久久伊人| 日韩三级在线免费观看| 日韩欧美不卡在线观看视频| 亚洲丝袜另类动漫二区| 中文字幕一区二区在线观看| 尤物视频一区二区| 精彩视频一区二区三区| av在线一区二区三区| 在线观看一区二区视频| 欧美性生交片4| 在线看国产一区| 欧美日韩一二三| 亚洲欧美一区二区三区极速播放| 亚洲一区二区高清| 久久精品噜噜噜成人88aⅴ| 日韩欧美亚洲国产精品字幕久久久 | 91精品国产色综合久久| 国产精品久久午夜夜伦鲁鲁| 天堂资源在线中文精品| 欧美mv日韩mv国产网站app| 国产综合久久久久影院| 色乱码一区二区三区88| 成人亚洲精品久久久久软件| 欧美高清你懂得| 国产精品毛片a∨一区二区三区| 亚洲永久精品国产| 麻豆中文一区二区| 日韩免费观看2025年上映的电影 | 久久免费视频色| 一区二区三区.www| 日本不卡中文字幕| 成人国产亚洲欧美成人综合网| 在线观看精品一区| 国产精品视频线看| 日韩制服丝袜av| va亚洲va日韩不卡在线观看| 精品播放一区二区| 精品国产凹凸成av人网站| 中文字幕五月欧美| 久久99这里只有精品| 欧美绝品在线观看成人午夜影视| 一区二区中文字幕在线| 日本一二三不卡| 国产精选一区二区三区| 国产亚洲精品福利| 青青草国产成人av片免费| 国产日韩亚洲欧美综合| 国产一区二区美女诱惑| 精品久久一二三区| 亚洲福利视频一区二区| 99精品欧美一区| 中文字幕在线不卡一区| 久久99热99| 亚洲精品美国一| 久久爱www久久做| 久久蜜桃av一区二区天堂| 久久精品国产亚洲aⅴ| 精品久久人人做人人爰| 日韩国产精品久久久久久亚洲| 不卡一区二区中文字幕| 亚洲成人在线观看视频| 国产精品一品视频| 国产成人精品午夜视频免费| 欧美撒尿777hd撒尿| 亚洲成av人片一区二区三区| 欧美女孩性生活视频| 99免费精品在线观看| 青娱乐精品视频在线| 精品国产亚洲在线| 国产一区欧美日韩| 中文字幕日韩欧美一区二区三区| 亚洲第一成人在线| 欧美日韩国产一二三| 日韩欧美国产不卡| 色噜噜狠狠成人网p站| 免费观看久久久4p| 成人黄色在线看| 欧美激情资源网| 欧美影院午夜播放| 久久99精品久久久| 亚洲成人免费av| 国产精品视频免费看| eeuss鲁片一区二区三区在线观看| 国产盗摄视频一区二区三区| 精品在线你懂的| 亚洲女爱视频在线| 国产午夜亚洲精品理论片色戒| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产露脸91国语对白| 免费在线观看视频一区| 亚洲免费在线观看视频| 成人欧美一区二区三区黑人麻豆| 久久久久久久精| 91久久人澡人人添人人爽欧美 | 美美哒免费高清在线观看视频一区二区 | 亚洲精品自拍动漫在线| 亚洲一区二区欧美| 欧美www视频| 亚洲乱码国产乱码精品精98午夜| 中文一区一区三区高中清不卡| 在线观看视频一区| 免费欧美在线视频| 亚洲三级久久久| 7777精品伊人久久久大香线蕉的 | 粉嫩久久99精品久久久久久夜| 亚洲一区二区五区| 亚洲主播在线播放| 欧美色精品在线视频| 亚洲欧美另类久久久精品2019| 国产成人综合自拍| 久久久夜色精品亚洲| 亚洲一级二级在线| 菠萝蜜视频在线观看一区| 欧美精品第1页| 久久精品亚洲精品国产欧美| 久久99精品久久久| 在线不卡的av| 国模娜娜一区二区三区| 亚洲男同性恋视频| 成人a级免费电影| 久久亚洲精品国产精品紫薇| 成人免费av资源| 在线中文字幕不卡| 日韩视频在线永久播放| 99久久精品一区| 久久99九九99精品| 欧美aaaaaa午夜精品| 亚洲精品一区二区在线观看| 国产成人精品亚洲777人妖| 精品一区二区三区不卡| 一区二区三区高清| 欧美精品一区二区在线播放 | 国产精品三级av在线播放| 国产91精品在线观看| 国产亚洲精品aa午夜观看| 91老师国产黑色丝袜在线| 国产精品盗摄一区二区三区| 国产一区二区福利| 欧美大片一区二区三区| 蜜臀99久久精品久久久久久软件| jlzzjlzz欧美大全| 91在线视频免费观看| 国产a精品视频| 欧美激情中文字幕| 欧美激情一区二区三区四区| 欧美欧美午夜aⅴ在线观看| 91丨九色丨黑人外教| 日本美女一区二区三区视频| 免费久久99精品国产| 久久er99热精品一区二区| 中文字幕一区二区三区四区不卡| 国产精品大尺度| 性久久久久久久久久久久| 国产精品一区二区果冻传媒| 久久精品国产澳门| 欧美日韩一区二区三区四区五区| 久久蜜臀精品av| 中文字幕二三区不卡| 亚洲人成亚洲人成在线观看图片| 精品国产一区二区三区久久影院| 国产喷白浆一区二区三区|