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

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

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

背景

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

解決方案

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

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)
        {
          // 取得每個(gè) Key專(zhuān)屬的 lock object;若同時(shí)有多個(gè) thread要求相同資料,只會(huì)(到資料庫(kù))查第一次,剩下的從 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,強(qiáng)制重查
            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é)說(shuō)明

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

 T result = CacheObject[key] as T;

2、緩存中沒(méi)有數(shù)據(jù),第1個(gè)進(jìn)入的線程,獲取鎖并從數(shù)據(jù)庫(kù)去取數(shù)據(jù),沒(méi)釋放鎖之前,其他并行進(jìn)入的線程會(huì)等待,再重新去緩存取數(shù)據(jù)。這樣就防止都去數(shù)據(jù)庫(kù)重復(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、取得每個(gè) Key專(zhuān)有的 lock object;若同時(shí)有多個(gè) thread要求相同資料,只會(huì)(到數(shù)據(jù)庫(kù))查第一次,剩下的從 cache讀取。

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

以上就是c# 如何用lock解決緩存擊穿的詳細(xì)內(nèi)容,更多關(guān)于c# lock解決緩存擊穿的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

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

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

    Winform項(xiàng)目中使用FastReport.Net報(bào)表控件

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

    c# 代理模式

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

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

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

    C#中枚舉的特性 FlagAttribute詳解

    說(shuō)到FlagsAttribute,源自前幾天看到了一小段代碼,大概意思就是根據(jù)航班政策來(lái)返回哪些配送方式是否可用,根據(jù)這些是否可用來(lái)隱藏或者開(kāi)啟界面的相關(guān)配送方式,不是非常明白,于是今天我們就來(lái)詳細(xì)探討下這個(gè)問(wèn)題
    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#類(lèi)的定義及實(shí)現(xiàn)方法實(shí)例解析

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

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

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

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

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

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

最新評(píng)論