最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 如何用lock解決緩存擊穿

 更新時間:2021年02月01日 11:59:48   作者:UP技術控  
這篇文章主要介紹了c# 如何用lock解決緩存擊穿,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

背景

緩存擊穿是指緩存中沒有但數據庫中有的數據(一般是緩存時間到期),這時由于并發(fā)用戶特別多,同時讀緩存沒讀到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造成過大壓力。

解決方案

1、設置熱點數據永遠不過期。

2、加互斥鎖,互斥鎖參考代碼如下:

2.1、根據key生成object()

private static object GetMemoryCacheLockObject(string key)
    {
      string cacheLockKey = string.Format(MemoryCacheLockObjectFormat, key);
      lock (CacheObject)
      {
        var lockObject = CacheObject[cacheLockKey];
        if (lockObject == null)
        {
          // 取得每個 Key專屬的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取
          lockObject = new object();
          CacheObject.Set(
            cacheLockKey,
            lockObject,
            new System.Runtime.Caching.CacheItemPolicy()
            {
              AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(10)
            }
          );
        }

        return lockObject;
      }
    }

2.2、lock住GetMemoryCacheLockObject(key)

public T Get<T>(string key, Func<T> getDataWork, TimeSpan absoluteExpireTime, bool forceRefresh = false, bool returnCopy = true) where T : class
    {
      try
      {
        lock (GetMemoryCacheLockObject(key))
        {
          /*
System.ArgumentNullException: Value cannot be null.
at System.Threading.Monitor.Enter(Object obj)
at BQoolCommon.Helpers.Cache.MemoryCacheLayer.Get[T](String key, Func`1 getDataWork, TimeSpan absoluteExpireTime, Boolean forceRefresh, Boolean returnCopy) in D:\Source\BQoolCommon\BQoolCommon.Helpers\Cache\MemoryCacheLayer.cs:line 46
           */
          T result = CacheObject[key] as T;

          if (result != null && forceRefresh)
          {// 是否清除Cache,強制重查
            result = null;
          }

          if (result == null)
          {
            //執(zhí)行取得資料的委派作業(yè)
            result = getDataWork();

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

          if (returnCopy)
          {
            //複製一份新的參考
            string serialize = JsonConvert.SerializeObject(result);
            return JsonConvert.DeserializeObject<T>(serialize);
          }
          else
          {
            return result;
          }
        }
      }
      catch
      {
        return getDataWork();
      }
    }

總結說明

1、緩存中有數據,直接走下述代碼就返回結果了

 T result = CacheObject[key] as T;

2、緩存中沒有數據,第1個進入的線程,獲取鎖并從數據庫去取數據,沒釋放鎖之前,其他并行進入的線程會等待,再重新去緩存取數據。這樣就防止都去數據庫重復取數據,重復往緩存中更新數據情況出現。

try
      {
        lock (GetMemoryCacheLockObject(key))
        {
          /*
System.ArgumentNullException: Value cannot be null.
at System.Threading.Monitor.Enter(Object obj)
at BQoolCommon.Helpers.Cache.MemoryCacheLayer.Get[T](String key, Func`1 getDataWork, TimeSpan absoluteExpireTime, Boolean forceRefresh, Boolean returnCopy) in D:\Source\BQoolCommon\BQoolCommon.Helpers\Cache\MemoryCacheLayer.cs:line 46
           */
          T result = CacheObject[key] as T;

3、取得每個 Key專有的 lock object;若同時有多個 thread要求相同資料,只會(到數據庫)查第一次,剩下的從 cache讀取。

string cacheLockKey = string.Format(MemoryCacheLockObjectFormat, key);
      lock (CacheObject)
      {
        var lockObject = CacheObject[cacheLockKey];
        if (lockObject == null)
        {
          // 取得每個 Key專屬的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取
          lockObject = new object();

以上就是c# 如何用lock解決緩存擊穿的詳細內容,更多關于c# lock解決緩存擊穿的資料請關注腳本之家其它相關文章!

相關文章

  • WinForm天貓雙11自動搶紅包源碼分享

    WinForm天貓雙11自動搶紅包源碼分享

    這篇文章主要為大家分享了WinForm天貓雙11自動搶紅包源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C#中Timer定時器類的簡單使用

    C#中Timer定時器類的簡單使用

    定時器就是經過固定時間,執(zhí)行固定任務,本文主要介紹了C#中Timer定時器類的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 詳解C#實現MD5加密的示例代碼

    詳解C#實現MD5加密的示例代碼

    本篇文章主要介紹了C#實現MD5加密的示例代碼,詳細的介紹了幾種方法,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • c#求范圍內素數的示例分享(c#求素數)

    c#求范圍內素數的示例分享(c#求素數)

    問題是判斷101-200之間有多少個素數,并輸出所有素數。下面是使用C#解決這個問題的方法 ,需要的朋友可以參考下
    2014-03-03
  • C#使用DataSet Datatable更新數據庫的三種實現方法

    C#使用DataSet Datatable更新數據庫的三種實現方法

    這篇文章主要介紹了C#使用DataSet Datatable更新數據庫的三種實現方法,需要的朋友可以參考下
    2014-08-08
  • 基于WPF實現跳動的字符效果

    基于WPF實現跳動的字符效果

    這篇文章主要和大家介紹一個好玩但實際作用可能不太大的動畫效果:跳動的字符,本文將利用WPF實現這一效果,感興趣的小伙伴可以學習一下
    2023-08-08
  • C#創(chuàng)建、部署、調用WebService圖文實例詳解

    C#創(chuàng)建、部署、調用WebService圖文實例詳解

    本文主要用詳細的圖文給大家介紹C#創(chuàng)建、部署、調用WebService的全部過程以及中間需要避免的問題。
    2017-11-11
  • C# SaveFileDialog與OpenFileDialog用法案例詳解

    C# SaveFileDialog與OpenFileDialog用法案例詳解

    這篇文章主要介紹了C# SaveFileDialog與OpenFileDialog用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C#面向對象編程之猜拳游戲實現方法

    C#面向對象編程之猜拳游戲實現方法

    這篇文章主要介紹了C#面向對象編程之猜拳游戲實現方法,以一個完整的猜拳游戲為例講述了C#面向對象程序設計的具體實現步驟,具有一定的學習與借鑒價值,需要的朋友可以參考下
    2014-11-11
  • C# Invoke,begininvoke的用法詳解

    C# Invoke,begininvoke的用法詳解

    這篇文章主要介紹了C# Invoke,begininvoke的用法詳解,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01

最新評論

开阳县| 平遥县| 安福县| 彭泽县| 来凤县| 澄城县| 塘沽区| 贵阳市| 亳州市| 景泰县| 新疆| 犍为县| 光泽县| 台前县| 广元市| 海南省| 邻水| 深圳市| 田林县| 富民县| 江安县| 交城县| 通渭县| 甘孜县| 阿图什市| 祁连县| 罗定市| 铜山县| 肃南| 朔州市| 泸溪县| 安庆市| 夏河县| 吕梁市| 辽宁省| 崇文区| 会泽县| 敦煌市| 南康市| 嘉义市| 若羌县|