呵呵,关于缓存的应用问题

小_虎 2009-09-08 10:57:45
呵呵,本人没有应用过缓存。Google了好多“.net 缓存”

我在想当然的问些问题。

比如一个查询对吧,服务器上缓存了一个对象Cache["Info"].

如果是这样的话,所有的人都能公用这个对象了。但是如果我想每一类用户用一个缓存。

比如说同一个部门的公用一个缓存。

那该如何呢,我想是不是Insert这个Cache的时候,从Session里面带出他的DeptID加到他的key里面去形成这样一个
Cache["Info"+DeptID]这样的格式。但是如果这样的话呢,如果好多人不同的部门的话,那不是要创建好多缓存。很占资源的吧。(为什么有这样的需求呢,因为要通过DeptID来查询数据),在这种情况是不可以用缓存的吧。
我为什么会有这样的想法呢

参考资料如下:

Cache myCache = new Cache();

myCache = HttpRuntime.Cache;

if (myCache[cache_name] != null)
{
ds = (DataSet)myCache[cache_name];
if (ds.Tables[0].Rows.Count == 0)
{
//
ds = dbOperator.Get_DS(sql);

myCache.Insert(cache_name, ds, scd);// Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.DataDiff));

}
else
{

}
}
else
{
ds = dbOperator.Get_DS(sql);
myCache.Insert(cache_name, ds, scd);// Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.DataDiff));

}
if (Cache_Filter.Trim() != "")
{
ds.Tables[0].DefaultView.RowFilter = Cache_Filter;
}
return ds.Tables[0].DefaultView.ToTable();

http://alek.blogbus.com/logs/8233564.html
--------------------------
这个是我在网上找的,因为他根本没有区别查询条件什么的。。

-----------------------

后来我又 查资料如下:

缓存一个页面
为缓存一个页面输出的内容,我们要在面面顶部指定一个 @OutputCache 命令。语法如下所示:

<%@ OutputCache Duration=5 VaryByParam="None" %>

如你所见,这条指令有两个属性。他们是:

Duration - 被缓存输出的内容有效期是多少秒。在时间超过指定的有效期后,过期的缓存内容会删除,并会在下次用户请求中重新调用页面生成缓存内容。再次的缓存内容过10秒后此过程又会重复。
VaryByParam - 这个属性是必须的,并且指明查询字串参数不同使缓存产生变化。在上面的代码片断中,我们指定 VaryByParam 属性是 “None” ,这意味着不论传递的查询字串参数如何不同所返回的页面内容是相同的。
如果对同一页面的两次请求含不同的查询字串参数,如:.../PageCachingByParam.aspx?id=12 和.../PageCachingByParam.aspx?id=15 ,这应该生成不同的页面内容,指令应该是:

<%@ OutputCache Duration=10 VaryByParam="id" %>

对这样两种不同请求的页面内容每一个都会被缓存 Duration 属性指定的时间长度。。

为了指定多个参数的情形,要使用分号来分隔参数名称。如果我们指定 VaryByParam 属性为“*”,缓存内容会因传递的不同查询字串参数而不同。
http://www.cnblogs.com/vinyfeng/articles/1501468.html
----

这样两种说法怎么好像应用上有点不同。有区别,我有点糊涂。
因为我之前看了些很浅显的.net书上写了些Cache的概念。就是什么Cache["key"]得到一个对象。Insert插入一个对象,Remove删掉一个对象的什么。。。

应用上不知道怎么用。

很是迷惑。希望有经验的帅哥可以帮我理清下思路,缓存的应用应该怎么用,可以给我链接查资料,也可以通俗的解释下,
我记得还看过一个什么标题“一个最懒程序员写的缓存”什么的,不过没这么看明白在哪应用。。。。

最好能理清他的应用,不要给他最基本的概念了。呵呵

小弟在此谢谢了。
祝大家身体健康,万事如意。



...全文
186 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloud100x 2009-09-09
  • 打赏
  • 举报
回复
我也学习下
http://www.zainanbao.com
maple326 2009-09-09
  • 打赏
  • 举报
回复
up
小_虎 2009-09-09
  • 打赏
  • 举报
回复
帮顶。。。
me_child 2009-09-09
  • 打赏
  • 举报
回复
帮顶。 留名。
guyehanxinlei 2009-09-09
  • 打赏
  • 举报
回复
友情UP
erytbc 2009-09-09
  • 打赏
  • 举报
回复
ding
zhulong1111 2009-09-09
  • 打赏
  • 举报
回复
mark!
小_虎 2009-09-09
  • 打赏
  • 举报
回复
请帮我解释下,我举的两个例子有什么联系。。。。
SK_Aqi 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 cat_hsfz 的回复:]
Cache是全局的,而@OutputCache是针对输出的HTML的。

你可以把任何东西放到Cache里面,当然你也可以手动把页面输出的HTML存到Cache里面,但因为这种做法太常见了,所以就不需要你用C#代码做这样的事情了,写一句@OutputCache就可以。

ASP.NET把这两者混合在一起,确实让很多新人分不清哪个是哪个。你就记住一个概念可以了——凡是重复计算的东西,你都可以把第一次计算的结果缓存下来。但因为一个系统里面重复计算的东西不少,读取数据库会重复操作,生成页面也会重复操作,在哪个层面做缓存才对特定的系统有帮助,这才是关键。
[/Quote]

非常受用!!!支持,再顶!
小_虎 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 cat_hsfz 的回复:]
Cache是全局的,而@OutputCache是针对输出的HTML的。

ASP.NET把这两者混合在一起,确实让很多新人分不清哪个是哪个。你就记住一个概念可以了——凡是重复计算的东西,你都可以把第一次计算的结果缓存下来。但因为一个系统里面重复计算的东西不少,读取数据库会重复操作,生成页面也会重复操作,在哪个层面做缓存才对特定的系统有帮助,这才是关键。
[/Quote]

讲是讲到了点了,呵呵,再讲讲。。你一般是怎么用的。。
cat_hsfz 2009-09-09
  • 打赏
  • 举报
回复
Cache是全局的,而@OutputCache是针对输出的HTML的。

你可以把任何东西放到Cache里面,当然你也可以手动把页面输出的HTML存到Cache里面,但因为这种做法太常见了,所以就不需要你用C#代码做这样的事情了,写一句@OutputCache就可以。

ASP.NET把这两者混合在一起,确实让很多新人分不清哪个是哪个。你就记住一个概念可以了——凡是重复计算的东西,你都可以把第一次计算的结果缓存下来。但因为一个系统里面重复计算的东西不少,读取数据库会重复操作,生成页面也会重复操作,在哪个层面做缓存才对特定的系统有帮助,这才是关键。
小_虎 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
<%@ outputCache
Duration="#ofseconds"
Location="Any|Client|Downstream|Server|None"
VaryByControl="ControlName"
VaryByCustom="browser|customstring"
VaryByHeader="headers"
VaryByParam="Parametername" %>
Cache.Insert(
string key,
object value,
CacheDependency dependencies,//依赖,设置缓存有效的依赖性,比如设置和一个文件相关,文件一变,就失效
DateTime absoluteExpireation,  //设置固定的过期时间
TimeSpan slidingExpiration, //设置最后一次访问后多长时间过期
CachePriority priority, //设置内存不足,缓存自动清除时,缓存的重要性,可不可以清除
CacheItemRemovedCallback onRemoveCallback // 设置在清除时引发的事件
)
Cache.Insert("a",a,new Caching.CacheDependency(Server.MapPah(a.XML"),
DateTime.Now.AddDays(1),Cache.NoSlidingExpiration,CacheItemPriority.High,
new CacheItemRemovedCallback(this.RemovedCallback));
清除就可以用Cache.Remove("key");方法


if(Cache["DataList"]==null)
  {
    Cache.Insert("DataList",ds);
  }
  else
  {
    DataSet ds=(DataSet)Cache["DataList"];
  }
参考
还有数据库缓存
[/Quote]


谢谢,我下班后去看。。
小_虎 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xustanly 的回复:]
从节约服务器资源的角度出发,被缓存的东西应该是不变的,公共的对象。
如一个文档对象的实例,它是不变的所以可以缓存起来,用户需要浏览这个文档对象时,
应该是从缓存中提取出来以后再根据一定的算法来判断这个用户是否具有访问这个对象的权限。
这是我的理解也是我项目中的实际应用。
[/Quote]

Thank you .

大家解释下,我上面两个例子的联系和区别吧。。什么是"缓存一个页面的输出内容"跟我们在内存中不去读数据库而直接获取对象返回到前台,有什么区别(也就是第二个列子你们会经常用吗?)
ttg520 2009-09-09
  • 打赏
  • 举报
回复
就是像你写的那样 每个部门key 不同就行了
SK_Aqi 2009-09-09
  • 打赏
  • 举报
回复
强烈关注....
chenyunkun2008 2009-09-09
  • 打赏
  • 举报
回复
以上个人意见!!!
chenyunkun2008 2009-09-09
  • 打赏
  • 举报
回复
还有你提到的一个区分,当用户多了,很占资源问题


这个还真没办法法了,一个方法总是解决一个问题,另一个问题就又会出现,牺牲一些资源,但功能做到了!!!
chenyunkun2008 2009-09-09
  • 打赏
  • 举报
回复
怎么说呢,你的第一个例子是为了数据达到一定量时进行执行一些操作,多用于数据交互!!第二个例子,纯属是为了优化页面加载速度!!!
wangjiafeng2008 2009-09-09
  • 打赏
  • 举报
回复
关键有key区分就行了
xuStanly 2009-09-09
  • 打赏
  • 举报
回复
从节约服务器资源的角度出发,被缓存的东西应该是不变的,公共的对象。
如一个文档对象的实例,它是不变的所以可以缓存起来,用户需要浏览这个文档对象时,
应该是从缓存中提取出来以后再根据一定的算法来判断这个用户是否具有访问这个对象的权限。
这是我的理解也是我项目中的实际应用。
加载更多回复(7)

62,074

社区成员

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

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

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

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