c#怎么用锁解决缓存击穿

  介绍

小编给大家分享一下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#怎么用锁解决缓存击穿