关于缓存的问题!

weinaxxc 2008-08-26 02:55:36
我的缓存程序这样写的:


private void getLinks()
{
if (Cache["getlink"] == null)
{
DataSet ds = new DataSet();
ds = myDb.select("select name,url from table1");
this.Cache.Insert("getlink", ds, null, System.DateTime.Now.AddMonths(1), System.Web.Caching.Cache.NoSlidingExpiration);
links = ds.Tables[0];

}
else
{
DataSet ds = (DataSet)Cache["getlink"];
links = ds.Tables[0];
}
}


这样写的缓存是对所有用户都有效吗?
怎么觉得这样用了以后,时快时慢
...全文
246 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
weinaxxc 2008-08-27
  • 打赏
  • 举报
回复
恩,终于搞定了,时快时慢果然是被应用程序池回收了内存,改的稍微大一点就好了!

不过在此谢谢各位的意见,尤其是SP1234,我会认真消化你们的建议!

weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 sp1234 的回复:]
我建议你按照我上面的顺序考虑缓存:aspx页面上的OutputCache,ascx上面的OutputCache,数据源控件的Cache特性,最后是数据缓存。

使用最简单的“页面OutputCache”,你可以用10秒钟时间就启用或者关闭页面见到那优化功能,已经超过那种“静态页面”做法的任何功能,例如你可以让页面该刷新时就刷新。
[/Quote]

恩,我有3个DIV,每个DIV里面都套嵌了3个REPEATER,数据查询很耗费时间,我要缓存这个DIV里的数据,用OutputCache是如何设置的?
  • 打赏
  • 举报
回复
当然还有第三点:如果页面上有的地方不变,那么应该使用ascx将其作为组件并片段缓存,后台对象根本不执行任何你所看到的代码,asp.net直接拿出缓存的片段html输出,你设计的那些繁琐的代码其实是多余的。
weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 sp1234 的回复:]
对于大多数asp.net编程,我觉得使用页面缓存或者片段缓存就够了。你可以设置VaryByParam、VaryByControl或者VaryByCustom。优先使用这类缓存技术,其次是启用各种 DataSource 控件上的缓存,剩下只有很少量的数据才需要在 Cache 集合中缓存,这样的效果最明显而且占用内存方面似乎更合理
[/Quote]
前辈这么说让我觉得我应该重新考虑建立静态页了

不过想请教

页面缓存和片段缓存具体该怎么做,是不是利用OutputCache?
VaryByParam、VaryByControl或者VaryByCustom这三个如何使用?
各种 DataSource 控件上的缓存如何启用?在控件的属性里设置吗?比如repeater.。。。
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 weinaxxc 的回复:]
排除别的因素,什么程序重启,数据变化,IIS回收这些都不考虑

现在这种情况,时快时慢,可能是什么原因?
[/Quote]

原因就是两点:

1. 你没有设置好slidingExpiration参数。
2.你只知道抛开业务逻辑去设置缓存时间,于是把过多数据放在内存里,应用程序会经常被iis重启,重启时缓存也就无意义了。
  • 打赏
  • 举报
回复
我建议你按照我上面的顺序考虑缓存:aspx页面上的OutputCache,ascx上面的OutputCache,数据源控件的Cache特性,最后是数据缓存。

使用最简单的“页面OutputCache”,你可以用10秒钟时间就启用或者关闭页面见到那优化功能,已经超过那种“静态页面”做法的任何功能,例如你可以让页面该刷新时就刷新。
weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
恩,这样吧,不扯太多的了!先解决眼前的问题再说!


排除别的因素,什么程序重启,数据变化,IIS回收这些都不考虑

现在这种情况,时快时慢,可能是什么原因?
bhtfg538 2008-08-26
  • 打赏
  • 举报
回复
。。。。
FileStream 百度一下
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 weinaxxc 的回复:]
不过“让缓存失效的时候尽快失效”这种情况我不希望它出现,因为首页数据量很大,而且加上老板的一些比较变态的取法和排序要求,一旦缓存失去效果,打开会变的很慢,我考虑两种方法,一种就是用SQLDependency来动态更新缓存,不过我还没完全掌握,另一种就是后台人为更新数据库的时候,显式的更新那一部分的缓存,这样访问的时候仅仅改动的那部分缓存需要重新建立!
[/Quote]

你的做法其实就是“让缓存该失效的时候尽快失效”的含义。大多数人只知道抛开业务逻辑去设置缓存时间,这对缓存控制的技术的体现其实是错误的。缓存不仅仅是把数据放在内存里,不仅仅有对于绝对时间的依赖,而且还应该有对业务数据的依赖。

缓存依赖有很多种,除了可以依赖一个SQLDependency,例如还可以依赖Cache集合中的一个元素(是否改变)。当某一个程序更新了 Cache[...] 中的某一个标志元素,可能造成一系列其它的数据的缓存失效。当然还可以让应用程序更新一个文件作为标志来通知一系列数据缓存失效。还可以从CacheDenpendecy类继承来自定义(编程很简单,只有一个属性一个方法而已,这可以直接了解各种缓存依赖的内部机制)。

对于大多数asp.net编程,我觉得使用页面缓存或者片段缓存就够了。你可以设置VaryByParam、VaryByControl或者VaryByCustom。优先使用这类缓存技术,其次是启用各种 DataSource 控件上的缓存,剩下只有很少量的数据才需要在 Cache 集合中缓存,这样的效果最明显而且占用内存方面似乎更合理。
weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 bhtfg538 的回复:]
像这样的 应该使用 静态 页面了

数据量大
变化大的话 缓存会起到副作用的
[/Quote]

那么怎么写生成静态页的函数?
bhtfg538 2008-08-26
  • 打赏
  • 举报
回复
而且是 DataSet这样的数据
bhtfg538 2008-08-26
  • 打赏
  • 举报
回复
像这样的 应该使用 静态 页面了

数据量大
变化大的话 缓存会起到副作用的
weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 sp1234 的回复:]
public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration)


这几个参数全都设置,才能比较合理的设置好缓存。absoluteExpiration可以设置一个相当长的时间(不过不用长得夸张)。slidingExpiration则可以让数据被很少人访问时就自动失效以减少内存占用。dependencies则可以让数据在业务逻辑需要它失效时立即失效以免造成运行逻辑错误。如果你…
[/Quote]

我现在首页的数据量大,而且查询条件苛刻,不用缓存,访问会很慢?
那么我改如何利用缓存?
  • 打赏
  • 举报
回复
public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration)


这几个参数全都设置,才能比较合理的设置好缓存。absoluteExpiration可以设置一个相当长的时间(不过不用长得夸张)。slidingExpiration则可以让数据被很少人访问时就自动失效以减少内存占用。dependencies则可以让数据在业务逻辑需要它失效时立即失效以免造成运行逻辑错误。如果你非常重视某个缓存数据的控制逻辑,三者必须同时起作用。
weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sp1234 的回复:]
如果是大的数据,通常应该设置
Cache.Insert("DS", ds, MyCacheDependency, DateTime.MaxValue, TimeSpan.FromSeconds(300));
这里,我最重视 MyCacheDependency 参数。应当让缓存在理应失效时尽快失效,不应当失效时尽可能长地缓存在内存,这才合适。否则,你给缓存设置一个比较长的时间,或者比较短的时间,对于应用系统资源配置来说都是不合适的。
[/Quote]

受教了,不过“让缓存失效的时候尽快失效”这种情况我不希望它出现,因为首页数据量很大,而且加上老板的一些比较变态的取法和排序要求,一旦缓存失去效果,打开会变的很慢,我考虑两种方法,一种就是用SQLDependency来动态更新缓存,不过我还没完全掌握,另一种就是后台人为更新数据库的时候,显式的更新那一部分的缓存,这样访问的时候仅仅改动的那部分缓存需要重新建立!

不知道考虑的对不对,前辈请指教!
bhtfg538 2008-08-26
  • 打赏
  • 举报
回复
数据缓存是保存在 服务器上的


又不是页面 缓存
我晕

比方 你一个缓存 10秒过期(平滑)

已经过了9秒 这时候另外一个用户访问了 他= 缓存有了10秒

绝对 就是 管你好多人访问 10秒以后就 K了
tonyze 2008-08-26
  • 打赏
  • 举报
回复
不知道您说的针对所有用户什么意思,谁访问了页面,谁就可以调用缓存呗~
至于缓存1个月··· 太久了吧···对于访问量大的网站可以适当久一点,不过10分钟可以了吧
bhtfg538 2008-08-26
  • 打赏
  • 举报
回复
针对所有用户的哈
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 weinaxxc 的回复:]
那么我就需要它在一个月内总是存在的,我的写法行吗?
[/Quote]

上面已经说过,iis会根据自身运行维护情况随时回收应用程序,例如服务器空闲内存小于30%的时候,或者某个应用的tcp连接数超过一定数量,或者每当30分钟以后,或者发生一个运行异常,等等。1个月,这可能太夸张了。

对于许多租的服务器,通常每隔10分钟你的应用程序就被重启了。

weinaxxc 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tonyze 的回复:]
缓存的绝对过期时间就是:10秒之后取新数据
相对的可以这么理解:比如我5秒访问一次,又过了8秒访问一次,数据都是一样的,直到过了10秒一直没人访问,才会取新数据
[/Quote]
那么相对是否可以这样理解,只有在无人访问的情况下,设置的这段时间过后,CACHE失去效果?那他是针对所有用户吗?那总是有用户访问,而且间隔都是在过期时间内,那不是永远不会失效?
加载更多回复(18)

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧