2022-10-23 398
先说下当前项目的场景:
后台人员1天不定时的,添加新闻和视频图片10条左右,数量不多
不使用缓存,回和数据库打交道,非常耗时,造成效率低,尤其是在数据量非常庞大的情况下
可是加了缓存,加多少时间的缓存?新闻要保证实时更新,一发布立刻显示出来
微软给出了解决方法,数据库缓存依赖项,但是貌似只能用在SQL上,而且要配置些东西;
还有,并不透明~ 一些东西看不到
这里提供另一种方法:
先说下大概思路,在所有查找操作时,都把结果插入 cache 在对数据库有操作时(增删改) 删除cache
有了思路,开始解决问题,这里会遇到两个问题
*** : 所有查找时,cache建怎么定义,保证不重复呢
第二:微软没有提供删除所有cache的方法,只有cache["键值名"].Remove(); 而没有removeall();
下面上代码和解决办法 以及思路
#region##根据条件得到新闻 ///<summary> ///根据条件得到新闻 ///</summary> ///<paramname="tableName"></param> ///<paramname="whereStr"></param> ///<paramname="topCount"></param> ///<returns></returns> publicList<CmsDemoModels.NewsInfo>GetByCondition(stringwhereStr,stringtopCount) { stringcacheKey=string.Format("{0}.{1}.{2}",GetType(),"GetByCondition",whereStr+topCount); if(HttpRuntime.Cache[cacheKey]!=null) { returnHttpRuntime.Cache[cacheKey]asList<CmsDemoModels.NewsInfo>; } else { //从数据库里查找并插入缓存 using(CmsDemoDAL.NewsInfoServciens=newNewsInfoServcie()) { List<NewsInfo>newsList=ns.GetByCondition(whereStr,topCount); HttpRuntime.Cache.Insert(cacheKey,newsList,null,DateTime.Now.AddDays(1),TimeSpan.Zero); returnnewsList; } } }
看上面的代码
stringcacheKey=string.Format("{0}.{1}.{2}",GetType(),"GetByCondition",whereStr+topCount);
我定义这缓存键值不重复的方法是,用当前类+方法名+所有参数名的组合,来保证***性这样把所有查询的方法 以及查询结果都缓存起来了~
publicstaticvoidClearOutputCache() { //移除自定义缓存 foreach(variteminHttpRuntime.Cache.Cast<DictionaryEntry>().ToArray()) { HttpRuntime.Cache.Remove((string)item.Key); } }
上面的方法,是删除所有缓存
可是又有个问题,我们有视频表、图片表、新闻等等,我现在更新个新闻,就要删除所有的缓存,其实只用删除所有新闻的缓存就行了
#region删除缓存 ///<summary> ///根据名字开头删除缓存 ///</summary> ///<paramname="StartName">缓存名字开头</param> publicvoidRemoveAllCache(stringStartName) { //移除自定义应用程序缓存 DictionaryEntry[]de=HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray(); foreach(variteminde) { stringcacheKey=item.Key.ToString(); if(cacheKey.StartsWith(StartName)) { HttpRuntime.Cache.Remove((string)item.Key); } } } #endregion
稍微改进下 效率又大大的提高了
当我们数据库有变化时,比如添加了个新闻调用
p.RemoveAllCache(GetType().ToString());
#region##添加新闻 ///<summary> ///添加新闻 ///</summary> ///<paramname="info"></param> ///<returns></returns> publicintAdd(CmsDemoModels.NewsInfoinfo) { using(CmsDemoDAL.NewsInfoServciens=newNewsInfoServcie()) { info.ViewCount=0; info.State=0; info.SortIndex=GetMaxSort()+1; inti=ns.Add(info); PubClassp=newPubClass(); p.RemoveAllCache(GetType().ToString()); returni; } } #endregion
这样就把所有以GetType().ToString() 开头的删除掉了~~ 实现新闻的删除新闻的,视频的删除视频的
PS: 这里新闻添加和查找都是在BLL层下的NewInfoManager类下,所以他们的 GetType().ToString() 会一样大概思路就这样
有什么问题,可以留言交流,欢迎讨论~
原文链接:https://77isp.com/post/6880.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2023-01-07
网站技术 2022-11-26
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
小游客游戏攻略网游戏攻略网 2024年07月26日
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
扫码二维码
获取最新动态