成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用Lock解決緩存擊穿的解決方案

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

背景

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

解決方案

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)
                    {
                        //執行取得資料的委派作業
                        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();
責任編輯:武曉燕 來源: 程序員編程日記
相關推薦

2021-01-31 10:51:37

緩存lock數據

2018-11-12 11:12:46

2023-11-10 14:58:03

2020-03-05 09:09:18

緩存原因方案

2023-10-13 08:11:22

2019-10-08 16:05:19

Redis數據庫系統

2022-03-08 00:07:51

緩存雪崩數據庫

2023-07-19 07:51:43

Redis緩存高可用

2024-06-24 00:30:00

2023-10-30 07:56:46

Spring緩存

2012-05-27 16:21:31

IDC華為

2018-12-03 12:17:27

Semptian解決方案

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:13:21

Mellanox解決方案

2018-12-03 12:26:30

YADRO解決方案

2025-02-04 17:40:44

2016-03-13 17:58:57

2011-11-30 13:08:55

企業防毒防毒方案拯救三

2011-12-09 11:13:17

2009-12-23 21:06:47

統一通信多媒體聯絡中心平臺華為
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线黄av| 午夜爽爽爽男女免费观看影院 | 国产男女猛烈无遮掩视频免费网站 | 国产成人99久久亚洲综合精品 | 国产一区二区三区四区 | www.com久久久 | 美女视频黄色的 | 精品日韩一区二区 | 国产a级毛毛片 | 亚洲毛片在线 | 91久久久久久久久久久久久 | 久久精品91| 日韩免费三级 | 国产精品久久久久久久久 | 日本精品一区二区三区视频 | 午夜精品视频在线观看 | 国精产品一品二品国精在线观看 | 亚洲永久入口 | 久久免费香蕉视频 | 午夜影院在线观看 | 精品久久久久久久人人人人传媒 | 7777久久| 国产成人精品免费视频大全最热 | 国产一区二区三区视频免费观看 | 色吊丝2288sds中文字幕 | 超碰成人免费 | 成人在线观看免费 | 国产黑丝在线 | 亚洲精品一区在线 | 亚洲人成在线观看 | 午夜爱爱毛片xxxx视频免费看 | 欧美日韩中文字幕在线 | 人妖一区 | 亚洲一区二区不卡在线观看 | 久久91| 国产一区二区三区色淫影院 | 精产国产伦理一二三区 | 亚洲码欧美码一区二区三区 | 国产在线精品一区二区三区 | 欧美性受| 国产精品免费一区二区三区四区 |