[ASP.NET] 如果将缓存“滑动过期时间”设置为1秒会怎样?

今天编写了一个采用ASP.NET Caching的组件,在为它编写Unit
Test的过程中发现了一个有趣的问题,接下来我通过一个简单的实例说明这个问题。我们在一个控制台应用中编写了如下一段程序,这个段程序很简单:我们通过HttpRuntime的静态属性Cache得到表示当前缓存的Cache对象,并调用其Insert方法对当前的时间实施缓存。需要注意的是,我们采用“滑动时间”过期策略,并将这个滑动时间设置为1秒。

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         string key = Guid.NewGuid().ToString();
   6:         HttpRuntime.Cache.Insert(key, DateTime.Now, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 1) );
   7:         for (int i = 0; i < 5; i++)
   8:         {
   9:             Console.WriteLine(HttpRuntime.Cache.Get(key)??"N/A");
  10:             Thread.Sleep(500);
  11:         }
  12:     }
  13: }

接下来我们在一个for循环中提取缓存的时间并将其显示在控制台上,每次迭代之后会有0.5秒的休眠时间。根据缓存针对滑动时间过期策略,由于我们每隔0.5秒会读取缓存,所以在这段时间内缓存是不会过期的。但是如下所示的执行结果告诉我们,添加的缓存在1秒之后过期了。

   1: 4/1/2014 2:51:12 PM
   2: 4/1/2014 2:51:12 PM
   3: N/A
   4: N/A
   5: N/A

是否是ASP.NET缓存机制错了什么问题呢?其实不是,真正的原因是我们将滑动过期时间范围设置得太小了。为了证实这一点,我们按照如下的方式将这个时间设置为2秒。

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         string key = Guid.NewGuid().ToString();
   6:         HttpRuntime.Cache.Insert(key, DateTime.Now, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 2) );
   7:         for (int i = 0; i < 5; i++)
   8:         {
   9:             Console.WriteLine(HttpRuntime.Cache.Get(key)??"N/A");
  10:             Thread.Sleep();
  11:         }
  12:     }
  13: }

再次运行我们的程序后会的如下所示的输出结果,我们可以看到添加的缓存并没有过期。

   1: 4/1/2014 2:59:15 PM
   2: 4/1/2014 2:59:15 PM
   3: 4/1/2014 2:59:15 PM
   4: 4/1/2014 2:59:15 PM
   5: 4/1/2014 2:59:15 PM

通过查看相关源代码,我们发现这个问题的根源所在:如果我们调用Cache的Insert或者Add方法时指定了其slidingExpiration参数,针对该缓存项的每次提取操作,系统都会修改缓存项的过期时间(当前时间+slidingExpiration)。但是过期时间的修改是由前提的:它要求这个slidingExpiration参数指定的时间必须大于设定的最小时间,这个时间对应着内部类型CacheExpires具有如下定义的静态只读属性TimeSpan
MIN_UPDATE_DELTA
,我们可以看到它的时间跨度正是1秒。所以如果我们指定的slidingExpiration参数小于1秒,实际上起不到“滑动过期
”的作用。当然,在真实的项目中我们并不会将滑动时间设置的如此之短。

   1: internal sealed class CacheExpires
   2: {
   3:     //其他成员
   4:     internal static readonly TimeSpan MIN_UPDATE_DELTA = new TimeSpan(0, 0, 1);
   5: }

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2024-11-03 02:30:03

[ASP.NET] 如果将缓存“滑动过期时间”设置为1秒会怎样?的相关文章

nginx设置静态页面压缩缓存和过期时间设置

可以通过nginx对服务器上的静态资源进行过期时间设置和对资源进行压缩传输来减少服务器的带宽开销. 以下是nginx对静态资源过期时间的设置方法:  代码如下 复制代码         location ~* .(ico|gif|bmp|jpg|jpeg|png|swf|js|css|mp3) {             root    /var/www/opkeep;             expires 30d;         } 上面的配置可以对ico,gif,bmp,jpg,jpeg

memcached-关于Memcached缓存过期时间设置的问题

问题描述 关于Memcached缓存过期时间设置的问题 //不带过期时间的缓存 成功 //bool success = client.Store(StoreMode.Add person.UserName person); //带过期时间的缓存 失败//bool success = client.Store(StoreMode.Add person.UserName person DateTime.Now.AddMinutes(10)); Memcached添加了过期时间后换乘失败!求解! 追问

c#-C#缓存绝对过期时间失效

问题描述 C#缓存绝对过期时间失效 我的代码如下 求高手哇哇 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Caching; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public pa

php中session过期时间设置及session回收机制介绍_php技巧

网上很多人给出了解答:修改配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发"session回收".如果"session回收"发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效. 1. session在端(一般是

|zyciis| 如何查看Context.Cache.Insert添加的缓存的过期时间呢? 谢谢

问题描述 this.Context.Cache.Insert("CacheTest","CacheContent",null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromSeconds(6000));如上面添加了一个6000秒未访问明清除这个缓存的代码那我现在想查看这个CacheTest还有多久过期,要怎么办呢谢谢 解决方案 解决方案二:凉拌解决方案三:该回复于2009-05-01 10:06

asp中设置session过期时间方法总结

 如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行,IIS中session默认过期时间为20分钟,IIS中session时间可以更改   如果程序中设置了session过期时间,那么,即使你将IIS中session时间设置100小时也没有用,因为程序会首先按照程序中设置,只有程序没设置的情况下才会按照IIS设置的 时间设置要放在前面 例如  代码如下   Session.Timeout=30 'SEESION有效时间为30分钟  Sessi

ASP.NET设置Session过期时间

  1.本文所说Session过期时间的四种设置方式均在Widnows2003系统下设置的,具体步骤:开始--〉管理工具--〉Internet信息服务(IIS)管理器--〉网站--〉默认网站- -〉右键"属性"--〉主目录--〉配置--〉选项--〉启用会话状态--〉会话超时(在这儿设置你要的超时时间,单位分钟).确定即可. 2.ASP.NET应用程序中Session过期时间的设置 在ASP.NET这样的Web应用中,Session是用来保存用户状态的常用手段,不过由于服务器内存空间是有

Membercache缓存过期时间不同导致set成功,get失败怪异问题

问题描述 最近项目中用到缓存,过期时间不同遇到set成功,get失败问题,请高手解答,小弟感激不尽,下面为过期时间不同所做的4个测试用例,key都是MD5加密的测试1:stringemailStep1TimeKey1=Common.GetMd5Hash(account.UserId+email+"SafeEmailStep1");codeCache.Delete(emailStep1TimeKey1);DateTimedt1=DateTime.Now.AddSeconds(350);b

asp中设置session过期时间方法总结_应用技巧

如果程序中没有设置session的过期时间,那么session过期时间就会按照IIS设置的过期时间来执行,IIS中session默认过期时间为20分钟,IIS中session时间可以更改 时间设置要放在前面 例如 复制代码 代码如下: Session.Timeout=30 'SEESION有效时间为30分钟 Session("ID")=Rs("id") Session("Name")=Rs("Name") Session(&q