介绍背景
解决方案
小编给大家分享一下c#怎么用锁解决缓存击穿,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
背景
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案
1,设置热点数据永远不过期。
2,加互斥锁、互斥锁参考代码如下:
2.1,根据关键生成对象()
private static object GetMemoryCacheLockObject (string 键) ,,,{ ,,,,,string cacheLockKey =, string.Format (MemoryCacheLockObjectFormat,关键); ,,,,,lock (CacheObject) ,,,,,{ ,,,,,,,var lockObject =, CacheObject [cacheLockKey]; ,,,,,,,if (lockObject ==, null) ,,,,,,,{ ,,,,,,,,,//,取得每個,关键專屬的,lock 对象;若同時有多個,线程要求相同資料,只會(到資料庫)查第一次,剩下的從,缓存讀取 ,,,,,,,,,lockObject =, new 对象(); ,,,,,,,,,CacheObject.Set ( ,,,,,,,,,,,cacheLockKey, ,,,,,,,,,,,lockObject, ,,,,,,,,,,,new System.Runtime.Caching.CacheItemPolicy () ,,,,,,,,,,,{ ,,,,,,,,,,,,,AbsoluteExpiration =, DateTimeOffset.UtcNow.AddMinutes (10) ,,,,,,,,,,,} ,,,,,,,,,); ,,,,,,,} ,,,,,,,return lockObject; ,,,,,} ,,,}
2.2,锁住GetMemoryCacheLockObject(关键)
public T Get(string 关键,Func , getDataWork,, TimeSpan absoluteExpireTime,, bool forceRefresh =,假,,bool returnCopy =,真的),where T :类 ,,,{ ,,,,,试一试 ,,,,,{ ,,,,,,,lock (GetMemoryCacheLockObject(关键)) ,,,,,,,{ ,,,,,,,,/* System.ArgumentNullException: Value cannot  be null。 at System.Threading.Monitor.Enter (Object obj) at BQoolCommon.Helpers.Cache.MemoryCacheLayer.Get [T] (String 关键,,Func的1,getDataWork,, TimeSpan absoluteExpireTime,, Boolean forceRefresh,, Boolean returnCopy),拷贝D: \ \ BQoolCommon \ BQoolCommon.Helpers来源\缓存\ MemoryCacheLayer.cs: line 46 ,,,,,,,,,*/,,,,,,,,,T result =, CacheObject(例子),as T; ,,,,,,,,,if (result !=, null ,,, forceRefresh) ,,,,,,,,,{//,是否清除缓存,強制重查 ,,,,,,,,,,,result =,空; ,,,,,,,,,} ,,,,,,,,,if (result ==, null) ,,,,,,,,,{ ,,,,,,,,,,,//執行取得資料的委派作業 ,,,,,,,,,,,result =, getDataWork (); ,,,,,,,,,,,if (result !=, null) ,,,,,,,,,,,{ ,,,,,,,,,,,,,设置(钥匙,,结果,,absoluteExpireTime); ,,,,,,,,,,,} ,,,,,,,,,} ,,,,,,,,,if (returnCopy) ,,,,,,,,,{ ,,,,,,,,,,,//複製一份新的參考 ,,,,,,,,,,,string serialize =, JsonConvert.SerializeObject(结果); ,,,,,,,,,,,return JsonConvert.DeserializeObject (序列化); null null null null null null null null null null null null null null null null null null null null null null null null null null null null c#怎么用锁解决缓存击穿