欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

背景

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

解決方案

1、設(shè)置熱點數(shù)據(jù)永遠(yuǎn)不過期。

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

2.1、根據(jù)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();
      }
    }

總結(jié)說明

1、緩存中有數(shù)據(jù),直接走下述代碼就返回結(jié)果了

 T result = CacheObject[key] as T;

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

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要求相同資料,只會(到數(shù)據(jù)庫)查第一次,剩下的從 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解決緩存擊穿的詳細(xì)內(nèi)容,更多關(guān)于c# lock解決緩存擊穿的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳析C#的協(xié)變和逆變

    詳析C#的協(xié)變和逆變

    這篇文章主要介紹了詳析C#的協(xié)變和逆變,在引用類型系統(tǒng)時,協(xié)變、逆變和不變性具有如下定義。?這些示例假定一個名為?Base?的基類和一個名為?Derived的派生類,更多內(nèi)容請需要的小伙伴參考下面文章內(nèi)容
    2022-01-01
  • 詳解C#如何實現(xiàn)隱式類型轉(zhuǎn)換

    詳解C#如何實現(xiàn)隱式類型轉(zhuǎn)換

    Result?類型是許多編程語言中處理錯誤的常用方式,包括?C#?的?dotNext?庫。在本文中,我們將通過例子回顧?C#?中?using?語句和隱式類型轉(zhuǎn)換的使用,感興趣的可以了解一下
    2023-01-01
  • Winform項目中使用FastReport.Net報表控件

    Winform項目中使用FastReport.Net報表控件

    這篇文章介紹了Winform項目中使用FastReport.Net報表控件的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c# 代理模式

    c# 代理模式

    代理模式:為其他對象提供一種代理以控制其他對象的訪問
    2012-10-10
  • C#操作Excel相關(guān)方法總結(jié)

    C#操作Excel相關(guān)方法總結(jié)

    這篇文章主要介紹了C#操作Excel相關(guān)方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#中枚舉的特性 FlagAttribute詳解

    C#中枚舉的特性 FlagAttribute詳解

    說到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據(jù)航班政策來返回哪些配送方式是否可用,根據(jù)這些是否可用來隱藏或者開啟界面的相關(guān)配送方式,不是非常明白,于是今天我們就來詳細(xì)探討下這個問題
    2018-03-03
  • C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法

    C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法

    C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法,需要的朋友可以參考一下
    2013-05-05
  • Visual C#類的定義及實現(xiàn)方法實例解析

    Visual C#類的定義及實現(xiàn)方法實例解析

    這篇文章主要介紹了Visual C#類的定義及實現(xiàn)方法實例解析,對于新手來說有不錯的借鑒學(xué)習(xí)價值,需要的朋友可以參考下
    2014-07-07
  • 深入C#字符串和享元(Flyweight)模式的使用分析

    深入C#字符串和享元(Flyweight)模式的使用分析

    本篇文章是對C#字符串與享元(Flyweight)模式的使用進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c#協(xié)變和逆變實例分析

    c#協(xié)變和逆變實例分析

    這篇文章主要介紹了c#協(xié)變和逆變,以實例形式詳細(xì)講述了協(xié)變和逆變的原理與具體用法,具有一定的學(xué)習(xí)借鑒價值,需要的朋友可以參考下
    2014-10-10

最新評論