您的当前位置:首页 >数据库 >巧用Lock解决缓存击穿的解决方案 正文
时间:2025-11-05 05:13:33 来源:网络整理编辑:数据库
背景缓存击穿是指缓存中没有但数据库中有的数据一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。解决方案1、设置热点数据永
缓存击穿是巧用指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,解决击穿决方同时读缓存没读到数据,缓存又同时去数据库去取数据,巧用引起数据库压力瞬间增大,解决击穿决方造成过大压力。缓存
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要求相同資料,b2b供应网只會(到資料庫)查第一次,巧用剩下的解决击穿决方從 cache讀取 lockObject = new object(); CacheObject.Set( cacheLockKey, lockObject, new System.Runtime.Caching.CacheItemPolicy() { AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(10) } ); } return lockObject; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24. 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.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.1、缓存中有数据,直接走下述代码就返回结果了
复制T result = CacheObject[key] as T;1.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;1.2.3.4.5.6.7.8.9.10.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要求相同資料,只會(到資料庫)查第一次,剩下的WordPress模板從 cache讀取 lockObject = new object();1.2.3.4.5.6.7.8.OPPOR9.11手机(OPPOR9.11手机)2025-11-05 05:09
探索索尼i5的卓越表现与功能(全面解析索尼i5处理器的关键特点和优势)2025-11-05 05:04
开启无限可能的航空天空——探索Opensky(开源航空数据平台的及其价值)2025-11-05 04:48
S7Edge港版——卓越的性能与体验(一部兼具美观与实用性的旗舰手机)2025-11-05 04:42
一步学会如何制作引导优盘教程(轻松制作引导优盘,让文件传输更便捷)2025-11-05 04:41
海信K660X3D(领先技术、出色性能、引领家庭娱乐新潮流)2025-11-05 04:36
产品运营前景与发展趋势(洞察未来,把握机遇)2025-11-05 03:58
手机720分辨率(720P分辨率让手机屏幕焕发新生,呈现细腻绚丽的视觉盛宴)2025-11-05 03:58
电脑剪映短剧教程(以电脑剪映为背景,教你制作出精彩的短剧作品)2025-11-05 03:07
苹果X水货性能和质量如何?(解析苹果X水货的优势和劣势,是否值得购买)2025-11-05 03:00
电脑剪映成品教程(轻松学会电脑剪映,制作出令人惊艳的影片效果)2025-11-05 05:07
高通骁龙(探索骁龙系列芯片的卓越性能与创新功能)2025-11-05 05:04
OPPOX1MP3解析及使用体验(深入探究OPPOX1MP3的功能与性能)2025-11-05 04:37
电脑彩印机使用教程(轻松掌握电脑彩印机的使用方法)2025-11-05 03:35
电脑开机总提示错误恢复(解决电脑开机错误的有效方法)2025-11-05 03:32
以鑫谷巡洋舰Q5如何满足消费者需求(性能出众、价格亲民,以鑫谷巡洋舰Q5成为消费者首选)2025-11-05 03:22
吸了雅片,生活将会如何改变?(探究吸食雅片对个体和社会的影响)2025-11-05 03:22
2016学修复印机的使用体验(便捷高效的印刷解决方案)2025-11-05 03:12
雷神电脑轻松使用教程(让你掌握雷神电脑的使用技巧)2025-11-05 02:45
福昕PDF转换器的优势与功能详解(让PDF转换更简单高效)2025-11-05 02:29