如何通过匿名函数更高效地利用缓存机制?

2026-05-25 08:012阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计706个文字,预计阅读时间需要3分钟。

如何通过匿名函数更高效地利用缓存机制?

数据缓存通常由数据源、缓存方案和读取操作组成。现有匿名函数可用于将数据源转换为匿名函数,从而直接声明一个缓存。例如:`protected static CacheManager Company=...`。

如何通过匿名函数更高效地利用缓存机制?

一个数据缓存,一般由数据来源,缓存方案,缓存读取来完成,现在有了匿名函数,可以把获取数据来源变为匿名函数。这样就可以直接声明一个缓存:

protectedstaticCacheManager<Company>companyCache=newCacheManager<Company>(newSmsDatabaseCache<Company>(),(key)=>
{
returnSmsDatabase.Instance.Context.Company.Where(c=>c.ShortNumber==(string)key).SingleOrDefault();
});

SmsDatabaseCache是一个缓存方案,还可以使用SimpleCache,TimeoutCache等实现了ICache接口的类,因为我的ICacheManager从ICache继承,所以还可以实现级连缓存哟,例如:

SmsDatebaseCache是一个依SmsDatabase.Instance.Context的缓存方案,在LinqContextDispose时,会进行清空数据操作。 SmsDatabaseCache
publicclassSmsDatabaseCache<TData>:ICache<TData>
{
privateDictionary<object,TData>cache=newDictionary<object,TData>();

publicSmsDatabaseCache()
{
SmsDatabase.Instance.PreDisposing+=(s,e)=>
{
cache.Clear();
};
}

publicTDataGet(objectkey)
{
returncache[key];
}

publicvoidSet(objectkey,TDatadata)
{
cache[key]=data;
}

}

实现代码如下: 缓存代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Linq;

namespaceEvlon.Utils
{
publicinterfaceICache<TData>
{
TDataGet(objectkey);
voidSet(objectkey,TDatadata);
}

publicinterfaceICacheManager<TData>:ICache<TData>
{
Func<object,TData>SourceGetter{get;}
}


publicclassSimpleCache<TData>:ICache<TData>
{
privateDictionary<object,TData>cache=newDictionary<object,TData>();



#regionICacheManager<TData>成员

publicTDataGet(objectkey)
{
returncache[key];
}

publicvoidSet(objectkey,TDatadata)
{
cache[key]=data;
}

#endregion
}


publicclassTimeoutCache<TData>:ICache<TData>
{
publicTimeSpanExpire{get;set;}
privateDateTimetimeLastScan=DateTime.Now;
privateDictionary<object,KeyValuePair<TData,DateTime>>cache=newDictionary<object,KeyValuePair<TData,DateTime>>();

publicTimeoutCache()
{
Expire=TimeSpan.FromMinutes(5);
}

privatevoidTryClearExpireObject()
{
TimeSpants=DateTime.Now-timeLastScan;
if(ts.TotalSeconds>Expire.TotalSeconds/2)
{
timeLastScan=DateTime.Now;
cache.Where(kv=>kv.Value.Value>DateTime.Now.Subtract(Expire)).ToList().ForEach(kv=>
{
cache.Remove(kv.Key);
});
}
}

#regionICacheManager<TData>成员

publicTDataGet(objectkey)
{
TryClearExpireObject();

if(!cache.ContainsKey(key))
returndefault(TData);


KeyValuePair<TData,DateTime>kv=cache[key];
if(kv.Value.Add(Expire)<DateTime.Now)
{
cache.Remove(key);
returndefault(TData);
}
returnkv.Key;
}

publicvoidSet(objectkey,TDatadata)
{
cache[key]=newKeyValuePair<TData,DateTime>(data,DateTime.Now);
}

#endregion
}

publicclassCacheManager<TData>:ICacheManager<TData>
{
privateICache<TData>cache=null;

publicFunc<object,TData>SourceGetter{get;privateset;}
publicCacheManager(ICache<TData>cache,Func<object,TData>sourceGetter)
{
this.cache=cache;
this.SourceGetter=sourceGetter;
}

#regionICacheGetter<TData>成员

publicTDataGet(objectkey)
{
TDatadata=cache.Get(key);
if(data!=null)
returndata;

data=this.SourceGetter(key);

cache.Set(key,data);

returndata;
}



publicvoidSet(objectkey,TDatadata)
{
cache.Set(key,data);
}

#endregion
}



}
QQ:273352165 evlon#126.com 转载请注明出处。
标签:使用缓存

本文共计706个文字,预计阅读时间需要3分钟。

如何通过匿名函数更高效地利用缓存机制?

数据缓存通常由数据源、缓存方案和读取操作组成。现有匿名函数可用于将数据源转换为匿名函数,从而直接声明一个缓存。例如:`protected static CacheManager Company=...`。

如何通过匿名函数更高效地利用缓存机制?

一个数据缓存,一般由数据来源,缓存方案,缓存读取来完成,现在有了匿名函数,可以把获取数据来源变为匿名函数。这样就可以直接声明一个缓存:

protectedstaticCacheManager<Company>companyCache=newCacheManager<Company>(newSmsDatabaseCache<Company>(),(key)=>
{
returnSmsDatabase.Instance.Context.Company.Where(c=>c.ShortNumber==(string)key).SingleOrDefault();
});

SmsDatabaseCache是一个缓存方案,还可以使用SimpleCache,TimeoutCache等实现了ICache接口的类,因为我的ICacheManager从ICache继承,所以还可以实现级连缓存哟,例如:

SmsDatebaseCache是一个依SmsDatabase.Instance.Context的缓存方案,在LinqContextDispose时,会进行清空数据操作。 SmsDatabaseCache
publicclassSmsDatabaseCache<TData>:ICache<TData>
{
privateDictionary<object,TData>cache=newDictionary<object,TData>();

publicSmsDatabaseCache()
{
SmsDatabase.Instance.PreDisposing+=(s,e)=>
{
cache.Clear();
};
}

publicTDataGet(objectkey)
{
returncache[key];
}

publicvoidSet(objectkey,TDatadata)
{
cache[key]=data;
}

}

实现代码如下: 缓存代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Linq;

namespaceEvlon.Utils
{
publicinterfaceICache<TData>
{
TDataGet(objectkey);
voidSet(objectkey,TDatadata);
}

publicinterfaceICacheManager<TData>:ICache<TData>
{
Func<object,TData>SourceGetter{get;}
}


publicclassSimpleCache<TData>:ICache<TData>
{
privateDictionary<object,TData>cache=newDictionary<object,TData>();



#regionICacheManager<TData>成员

publicTDataGet(objectkey)
{
returncache[key];
}

publicvoidSet(objectkey,TDatadata)
{
cache[key]=data;
}

#endregion
}


publicclassTimeoutCache<TData>:ICache<TData>
{
publicTimeSpanExpire{get;set;}
privateDateTimetimeLastScan=DateTime.Now;
privateDictionary<object,KeyValuePair<TData,DateTime>>cache=newDictionary<object,KeyValuePair<TData,DateTime>>();

publicTimeoutCache()
{
Expire=TimeSpan.FromMinutes(5);
}

privatevoidTryClearExpireObject()
{
TimeSpants=DateTime.Now-timeLastScan;
if(ts.TotalSeconds>Expire.TotalSeconds/2)
{
timeLastScan=DateTime.Now;
cache.Where(kv=>kv.Value.Value>DateTime.Now.Subtract(Expire)).ToList().ForEach(kv=>
{
cache.Remove(kv.Key);
});
}
}

#regionICacheManager<TData>成员

publicTDataGet(objectkey)
{
TryClearExpireObject();

if(!cache.ContainsKey(key))
returndefault(TData);


KeyValuePair<TData,DateTime>kv=cache[key];
if(kv.Value.Add(Expire)<DateTime.Now)
{
cache.Remove(key);
returndefault(TData);
}
returnkv.Key;
}

publicvoidSet(objectkey,TDatadata)
{
cache[key]=newKeyValuePair<TData,DateTime>(data,DateTime.Now);
}

#endregion
}

publicclassCacheManager<TData>:ICacheManager<TData>
{
privateICache<TData>cache=null;

publicFunc<object,TData>SourceGetter{get;privateset;}
publicCacheManager(ICache<TData>cache,Func<object,TData>sourceGetter)
{
this.cache=cache;
this.SourceGetter=sourceGetter;
}

#regionICacheGetter<TData>成员

publicTDataGet(objectkey)
{
TDatadata=cache.Get(key);
if(data!=null)
returndata;

data=this.SourceGetter(key);

cache.Set(key,data);

returndata;
}



publicvoidSet(objectkey,TDatadata)
{
cache.Set(key,data);
}

#endregion
}



}
QQ:273352165 evlon#126.com 转载请注明出处。
标签:使用缓存