当前位置:编程学习 > C#/ASP.NET >>

一直搞不明白怎么在网站开缓存基础数据,大家帮忙呀!

现在准备用asp.net(C#)来开发一个网站,数据库里有一些基础数据表,里面的数据很少有变动的,我想第一次从数据库取出数据这后就 永久缓存 起来,一但数据有修改,等修改完成后再通过程序主动更新(在后台加一个更新缓存的功能页面(按钮)),大家什么好的方法吗、或者有这样现成的缓存类吗?有帮忙一下!
.net下的Cache总是要设置时间的,我是想永久,而不是一段时间就没了的!

非常感谢!!! --------------------编程问答-------------------- ASP.NET中的Cache又提供了哪些缓存的过期策略呢?
 永不过期:和Application一样,缓存永不过期;
 绝对时间过期:缓存在某一时间过期,比如5分钟后;
 变化时间过期(平滑过期):缓存在某一时间内未访问则超时过期,这个和Session有点类似,比如我们可以设定缓存5分钟没有人访问则过期。
 依赖过期:缓存和数据库或者文件依赖,数据库或者文件修改后,缓存过期。

说明:
永不过期:直接赋值缓存的Key和Value即可
 绝对时间过期:DateTime.Now.AddSeconds(10)表示缓存在10秒后过期,TimeSpan.Zero表示不使用平滑过期策略。
 变化时间过期(平滑过期):DateTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没有访问就过期。
例子:
protected void btn_InsertNoExpirationCache_Click(object sender, EventArgs e)
{
    DataSet ds = GetData();
    Cache.Insert("Data", ds);
}
protected void btn_InsertAbsoluteExpirationCache_Click(object sender, EventArgs e)
{
    DataSet ds = GetData();
    Cache.Insert("Data", ds,null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);
}
protected void btn_InsertSlidingExpirationCache_Click(object sender, EventArgs e)
{
    DataSet ds = GetData();
    Cache.Insert("Data", ds, null, DateTime.MaxValue, TimeSpan.FromSeconds(10));
}
--------------------编程问答-------------------- 楼上说的好 


不过对楼主有个建议
不要让数据永久保存 然后手动保存 这样容易出现数据差
比如当机 断电什么的
可以作个动态的数据缓冲器
把数据读出来后缓冲在内存中。需要的时候就读或者写。然后自动的每过段时间 更新到数据库。
中间最好进行一些备份操作。
--------------------编程问答-------------------- To: LoveCherry
刚学.net,并不知道net的Cache本身就有“永不过期”功能,非常感谢!

To: fengyecsdn(虔诚) 
当机或断电并不影响呀,我是先判断Cache是否为空,如果为空我会再次从数据库中取出数据再缓存呀,“数据缓冲器”感觉加这个还不并主动更新好吧? --------------------编程问答-------------------- 可能是我的思路不对吧,大家有更好的方法或是思路吗?帮忙一下呀 --------------------编程问答-------------------- 1. INTRODUCTION 
  大量的网站页面是采用动态的方式,根据用户提交的不同请求创建生成页面。正如我们所知的,动态页面有助于根据用户要求来提供定制的动态内容。动态页面也利于获取在数据库中每时每刻更新的资料。缺点是为每个用户请求生成同一页面增加了系统开销。 
  ASP.NET 提供了缓存技术有助于我们最大程度地解决这个问题。它能缓存输出的页面,保存在存储器当中,缓存用户请求的内容。缓存的特点可以根据不同方式来定制的。 
  本文主要介绍ASP.NET的缓存技术。介绍其使用方法,以及客户端缓存存在的问题。 
  2. ASP.NET CACHE 
  缓存是把应用程序中需要频繁、快速访问的数据保存在内存中的编程技术。ASP.NET提供三种主要形式的缓存:页面级输出缓存、用户控件级输出缓存(或称为片段缓存)和缓存API。输出缓存和片段缓存的优点是非常易于实现,在大多数情况下,使用这两种缓存就足够了。而缓存API则提供了额外的灵活性(实际上是相当大的灵活性),可用于在应用程序的每一层利用缓存。本文只介绍页面级缓存和用户控件级缓存。 
  2.1. Page Caching 
  作为最简单的缓存形式,输出缓存只是在内存中保留为响应请求而发送的 HTML 的副本。其后再有请求时将提供缓存的输出,直到缓存到期,这样,性能有可能得到很大的提高(取决于需要多少开销来创建原始页面输出 - 发送缓存的输出总是很快,并且比较稳定)。 
  要实现页面输出缓存,只要将一条 OutputCache 指令添加到页面即可: 
  <%@ OutputCache Duration="60" VaryByParam="*" %> 
  如同其他页面指令一样,该指令应该出现在ASPX页面的顶部,即在任何输出之前。它支持五个属性(或参数),其中两个是必需的。 
   Duration:必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。 
   Location:指定应该对输出进行缓存的位置。如果要指定该参数,则必须是下列选项之一:Any、Client、Downstream、None、Server 或 ServerAndClient。 
   VaryByParam:必需属性。Request 中变量的名称,这些变量名应该产生单独的缓存条目。"none" 表示没有变动。"*" 可用于为每个不同的变量数组创建新的缓存条目。变量之间用 ";" 进行分隔。  
   VaryByHeader:基于指定的标头中的变动改变缓存条目。 
   VaryByCustom:允许在 global.asax 中指定自定义变动(例如,"Browser")。 
  利用必需的 Duration 和 VaryByParam 选项的组合可以处理大多数情况。例如,如果您的产品目录允许用户基于 categoryID 和页变量查看目录页,您可以用参数值为 "categoryID;page" 的 VaryByParam 将产品目录缓存一段时间(如果产品不是随时都在改变,一小时还是可以接受的,因此,持续时间是 3600 秒)。这将为每个种类的每个目录页创建单独的缓存条目。每个条目从其第一个请求算起将维持一个小时。 
  VaryByHeader 和 VaryByCustom 主要用于根据访问页面的客户端对页面的外观或内容进行自定义。同一个 URL 可能需要同时为浏览器和移动电话客户端呈现输出,因此,需要针对不同的客户端缓存不同的内容版本。或者,页面有可能已经针对 IE 进行了优化,但需要能针对 Netscape 或 Opera 完全降低优化(而不仅仅是破坏页面)。 
  2.2. Fragment caching 
  ASP.NET提供了部分缓存或区域缓存Web表单的功能。当希望在特定的页面上实现对缓存更多的控制时,可以使用该技术。 
  为了指定应该被缓存的用户控件,我们利用 @OutputCache 指令,就象整个页面缓存的用法一样。 
  <%@ OutputCache Duration=10 VaryByParam="*" %> 
  该示例将缓存用户控件60秒,并且将针对查询字符串的每个变动、针对此控件所在的每个页面创建单独的缓存条目。 
  <%@ OutputCache Duration="60" VaryByParam="none" 
  VaryByControl="CategoryDropDownList" %> 
  该示例将缓存用户控件60秒,并且将针对CategoryDropDownList控件的每个不同的值、针对此控件所在的每个页面创建单独的缓存条目。 
  还可以通过设置属性Shared=”true”,让使用它的所有页面共享这个控件缓存。 
  3. CONCLUSION AND SUGGESTION 
  应该在应用程序的每一层都实现缓存。向数据层、业务逻辑层、UI 或输出层添加缓存支持。内存现在非常便宜 — 因此,通过以智能的方式在整个应用程序中实现缓存,可以获得很大的性能提高。 
  缓存是一种无需大量时间和分析就可以获得“足够良好的”性能的方法。这里再次强调,内存现在非常便宜,因此,如果您能通过将输出缓存 30 秒,而不是花上一整天甚至一周的时间尝试优化代码或数据库就可以获得所需的性能,您肯定会选择缓存解决方案(假设可以接受 30 秒的旧数据)。缓存正是那些利用 20% 付出获得 80% 回报的特性之一,因此,要提高性能,应该首先想到缓存。不过,如果设计很糟糕,最终却有可能带来不良的后果,因此,您当然也应该尽量正确地设计应用程序。但如果您只是需要立即获得足够高的性能,缓存就是您的最佳选择,您可以在以后有时间的时候再尽快重新设计应用程序。 
  ASP.NET缓存和IE缓存并不是同一个概念,IE缓存可能会导致错误发生,而且很难控制,可以考虑禁止IE缓存,而只采用ASP.NET缓存机制。 
  针对我们的Web系统的特殊性,存在大量的页面针对不同的用户显示不同的数据,因此在采用ASP.NET缓存机制时,请格外小心。可以考虑在缓存机制使用时增加一些必要的参数。 --------------------编程问答-------------------- 你重新读出来是没问题 
可是你上次改的数据就没了啊~!

另外 永不过期不代表绝对保存
很多因素还是会丢
那丢了再补 不还是一样么
但是你前边改写的数据怎么办

要知道一个项目放发布以后 不能容管理员24小时盯着它吧 
而且也不能总更改的。
完备的自我调整能力 和异常处理能力 以及问题报告能力 是一个好项目的重要部分 --------------------编程问答-------------------- To: fengyecsdn(虔诚)
我修改肯定是先存入数据库中,同修改缓存呀,所以如果出现比如象当机这种情况,那就再次从数据取出来就可以了,不会存在丢失数据的情况的!

谁能提供解决方案吗?帮忙一下吧,先谢了! --------------------编程问答-------------------- 学习一下,好久没搞.NET了 --------------------编程问答-------------------- 不明白 你要什么解决方案啊??
我只是说个思路

一般来说大数据吞吐量的程序,比如网游 都有个数据缓冲层,用内存数据管理来降低数据库的读写次数。

而对于数据量小又比较固定的东西,我觉得用这个方式也不错哦。 --------------------编程问答-------------------- 简单的解决方案有268个:

http://www.google.cn/search?q=cache.insert+sqldependency&sourceid=ie7&rls=com.microsoft:en-US&ie=utf8&oe=utf8
--------------------编程问答-------------------- “.net下的Cache总是要设置时间的”
————————————————————————————————————————
要注意,你这是很错误的说法。 --------------------编程问答-------------------- 我写的程序是把Cache的时间设为永不过期

每次取的数据前先判断Cache里面的该数据在不在,如果在就取,不在就在Cache里面新建,然后再取

每次存的数据如果是Cache里面的表,先存到数据库,然后删除原来Cache里面这个表的数据再新建

程序虽然写起来麻烦一点,不过能达到要求

LZ是要写好的代码吗?

楼上 LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)  已经写了新建了
只需要在新建前判断一下 Cache["data"] == null 就好
不过建议好是单独写个CacheClass 比较好一点

MSDN上有完整的例子!

--------------------编程问答-------------------- 要是没有启动web园艺 那可以使用静态变量.放到一个hastable内.
在发生异常的时候,在内存的数据保留到数据库内,保证不丢失
或者是修改保留到数据库内,刷新一次

要是启用了web园.那就自己写一个数据缓存的window服务.用tcp 或ipc 信道连接
在里面获取数据 --------------------编程问答-------------------- 这个帖子的问题是在问:“一但数据有修改”后如何“通过程序主动更新”缓存在内存中的数据。

楼主并不是不知道如何在内存中保存数据。 --------------------编程问答-------------------- 由于楼主一味地用时间这一个指标来衡量缓存数据的生命期,造成了概念混乱,不知道是该延长缓存时间还是缩短缓存时间。他以为要提高缓存的能力就应该延长时间,而要使得及时更新就应该缩短缓存时间。

“.net下的Cache总是要设置时间的,我是想永久,而不是一段时间就没了的!”这句话,是自己把自己困扰进去的。

在你把一个数据放入Cache的时候,可以设置很多缓存依赖项:过期时间、最后访问之后过期时间、文件依赖、数据库依赖,以及(asp.net2.0支持的)任意从CacheDependency继承的自定义的依赖对象。缓存控制是非常强大的。不是只有时间控制那一种最狭隘的形式。 --------------------编程问答-------------------- 例如你要在Cache中放入一个“股票”类型的对象,你可以先写一个简单的“股票CacheDependency”类型(就像SqlCacheDependency一样),它运行时监视股票所在交易所的数据服务接口是否有变化,如果有就会触发数据更改通知。

之后,就可以使用如下代码来保存一只股票数据:

  股票 g=new 股票("123567");
  Cache.Insert("股票:123567",g,new 股票CacheDependency("123567"),.....); 

我在“......”中没有写。你可以让它保存5分钟,也可以保存24小时。如果不给参数,默认就是“永久”保存的。 --------------------编程问答-------------------- 对于控件编程来说,wangzhaoli1982(做事最怕认真二字) 所复制的资料中所说的片断缓存的控制策略也是非常不足的。asp.net1.1的用户控件依赖项目太少,根本没有什么实际价值。而asp.net2.0中,可以为用户控件条件自定义的缓存依赖对象,当页面postback的时候仅仅让必须重建的用户控件重建,其他的用户控件(包括用鼠标拖入页面的用户控件和你使用LoadControl方法动态装载的用户控件全都会)自动从缓存中拿出html输出,如果设计得好,网页输出速度可以提高上百倍以上。 --------------------编程问答-------------------- 缓存几乎是asp.net中最有价值的东西,几条语句、一两天的努力就能让你的网站整个比别人快好多倍,越是重要的界面其体验越是大大提高。而且片断缓存与asp.net ajax是完全兼容的。可惜似乎没有什么人把它拿到“台面上”来研究。 --------------------编程问答-------------------- 非常感谢:sp1234(没有一个儿子不是自私的)
你的热情让我很是感动,你的意思我是基本理解了,但由于.net学得还不好,能给一些代码看看吗?或者是网上你认为好的合适的代码的URL也可以,谢谢!!!

--------------------编程问答-------------------- 其实你可以通过生成本地xml文件就可以啊,每次读取文件比每次读取数据库要快,完全可以解决你的问题,而且效率比你高,cashe可能还消耗内存哦,如果中毒可能会修改数据,就麻烦了,个人想法........ --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 你要是想搞文件缓存,那要考虑的问题更多.等做到操作系统文件缓存那一步.也就太强了 --------------------编程问答-------------------- 你可以参考:

http://www.google.com/search?q=%E8%87%AA%E5%AE%9A%E4%B9%89cachedependency&sourceid=ie7&rls=com.microsoft:en-US&ie=utf8&oe=utf8

以上搜索出来的东西我没有看过,只是看了一下标题,应该是你需要的。 --------------------编程问答-------------------- 缓存值得你处处使用,只要你怀疑数据读取可能被不如CPU+RAM速度快的东西延迟,就应该使用。

缓存其实用起来很简单,可是它毕竟不是那种刚刚学到点东西时会接触到的技术,它确实是需要有点务实的精神的人才能想到的。 --------------------编程问答-------------------- 另外,控件片断缓存技术不同于数据缓存,并且更加有用。不过,你的问题里边主要是问数据缓存的。 --------------------编程问答-------------------- 举个例子,你可以把ADO.NET查询结果保存在Cache中,考虑不同用户有不同的查询权限:

string CacheKey=myCommand.CommandText;
CacheKey += 当前用户.id;
DtaTable result=Cache[CacheKey];
if(result==null)  //缓存中没有数据
{
  result=通过DBDataAdapter读取符合用户权限的数据并创建DataTable(myCommand,当前用户);
  CacheKey.Insert(CacheKey,result,******)  //这里放入相关的CacheDependency
}

结果就在result中。可见CacheDependency是一个非常简洁直观、功能强大的系统,是一种对外部数据进行一种完全不同管理方式的思想,不是编程的小技巧。 --------------------编程问答-------------------- 感谢sp1234另我也学到不少东西,自己找了不少关于缓存的东西,都是字面的比较难理解,都是有看没有懂,sp1234让我明白不少东西,万分感谢! --------------------编程问答-------------------- 不错的帖,学到了很多..... --------------------编程问答-------------------- 学习一下 --------------------编程问答-------------------- 学习一下
--------------------编程问答-------------------- 好帖留名学习 --------------------编程问答-------------------- keyi ba --------------------编程问答-------------------- 虽然是4年前的帖子~~~但是仍然要顶~~感谢sp1234童鞋~~
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,