不使用数据库缓存依赖项实现同样的功能
先说下当前项目的场景 后台人员1天不定时的 添加新闻和视频图片10条左右 数量不多
不使用缓存 来回和数据库打交道 非常耗时 造成效率低 尤其是在数据量非常庞大的情况下
可是加了缓存 加多少时间的缓存? 新闻要保证实时更新 一发布立刻显示出来
微软给出了解决方法 数据库缓存依赖项 但是貌似只能用在SQL上 而且要配置些东西 还有 并不透明~ 一些东西看不到
http://msdn.microsoft.com/zh-cn/library/system.web.caching.sqlcachedependency%28VS.80%29.aspx
感兴趣的朋友可以查下MSDN 这有个博客 也有介绍
http://www.cnblogs.com/ltp/archive/2009/06/30/1514331.html
这里提供另一种方法
先说下大概思路 在所有查找操作时 都把结果插入 cache 在对数据库有操作时(增删改) 删除cache
有了思路 开始解决问题 这里会遇到两个问题
第一 : 所有查找时 cache建 怎么定义 保证不重复呢 第二:微软没有提供删除所有cache的方法 只有cache["键值名"].Remove(); 而没有removeall();
下面上代码和解决办法 以及思路
#region##根据条件得到新闻
/// <summary>
/// 根据条件得到新闻
/// </summary>
/// <param name="tableName"></param>
/// <param name="whereStr"></param>
/// <param name="topCount"></param>
/// <returns></returns>
public List<CmsDemoModels.NewsInfo> GetByCondition(string whereStr, string topCount)
{
string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount);
if (HttpRuntime.Cache[cacheKey] != null)
{
return HttpRuntime.Cache[cacheKey] as List<CmsDemoModels.NewsInfo>;
}
else
{
//从数据库里查找并插入缓存
using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())
{
List<NewsInfo> newsList=ns.GetByCondition(whereStr, topCount);
HttpRuntime.Cache.Insert(cacheKey,newsList, null, DateTime.Now.AddDays(1), TimeSpan.Zero);
return newsList;
}
}
}
string cacheKey = string.Format("{0}.{1}.{2}", GetType(), "GetByCondition",whereStr+topCount);
我定义这缓存键值不重复的方法是 用当前类+方法名+所有参数名的组合 来保证唯一性
这样把所有查询的方法 以及查询结果都缓存起来了~上面的方法 是删除所有缓存public static void ClearOutputCache()
{
//移除自定义缓存
foreach (var item in HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray())
{
HttpRuntime.Cache.Remove((string)item.Key);
}
}
可是又有个问题 我们有视频表 图片表 新闻 等等 我现在更新个新闻 就要删除所有的缓存 其实只用删除所有新闻的缓存就行了
稍微改进下 效率又大大的提高了#region 删除缓存
/// <summary>
/// 根据名字开头删除缓存
/// </summary>
/// <param name="StartName">缓存名字开头</param>
public void RemoveAllCache(string StartName)
{
//移除自定义应用程序缓存
DictionaryEntry[] de = HttpRuntime.Cache.Cast<DictionaryEntry>().ToArray();
foreach (var item in de)
{
string cacheKey = item.Key.ToString();
if (cacheKey.StartsWith(StartName))
{
HttpRuntime.Cache.Remove((string)item.Key);
}
}
}
#endregion
当我们数据库有变化时 比如添加了个新闻 调用p.RemoveAllCache(GetType().ToString());
#region##添加新闻
/// <summary>
/// 添加新闻
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public int Add(CmsDemoModels.NewsInfo info)
{
using (CmsDemoDAL.NewsInfoServcie ns = new NewsInfoServcie())
{
info.ViewCount = 0;
info.State = 0;
info.SortIndex = GetMaxSort() + 1;
int i= ns.Add(info);
PubClass p = new PubClass();
p.RemoveAllCache(GetType().ToString());
return i;
}
}
#endregion
这样就把所有以GetType().ToString() 开头的删除掉了~~ 实现新闻的删除新闻的 视频的删除视频的
PS: 这里新闻添加和 查找 都是在BLL层下的 NewInfoManager类下 所以他们的 GetType().ToString() 会一样
大概思路就这样
有什么问题 可以留言交流 欢迎讨论~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架