今天编写了一个采用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(1000);

  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: }

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

  1. 为什么一段时间后网站后台自动退出 php中session过期时间设置

    修改php配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发 ...

  2. ASP.NET MVC:Cookie 的过期时间在服务器端是获取不到的

    现状 一旦 Cookie 在服务器端设置后,在后续的请求中是获取不到过期时间的,因为:Cookie 是存储和过期处理都是由客户端管理的,在后续的请求中,浏览器向服务器发送 Cookie 的时候就不包含 ...

  3. redis基本操作和 过期时间设置以及持久化方案

    Redis是NOSQL阵营中的一种数据库,主要用于存储缓存 五大数据类型:字符串(String).散列(hash).列表(list).集合(set).有序集合(SortedSett .zset) St ...

  4. ActiveMQ队列消息过期时间设置和自动清除解决方案

    版本 apache-activemq-5.15.3 1.消息过期设置 参数详情 1)message过期则客户端不能接收 2)ttlCeiling:表示过期时间上限(程序写的过期时间不能超过此时间,超过 ...

  5. 面试官:RabbitMQ过期时间设置、死信队列、延时队列怎么设计?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 RabbitMQ我们经常的使用, ...

  6. srpingboot2 session过期时间设置

    springboot2 设置session过期的配置 server.servlet.session.timeout = 1800 而不再是 server.session.timeout=1800

  7. jquery.cookie.js存与取以及过期时间设置

    $(function(){ $(".active_out .abtn").click(function(){ $(this).parents(".active_out&q ...

  8. Cookie的过期时间设置

    https://pan.baidu.com/s/1ibUQhLt6ZgVyhVM6mnrtHg 密码:9psc

  9. redis过期时间设置

    方法一: $redis->setex(,'huahua'); 方法二: $redis->set('name','huahua'); $redis->expire('name',3);

随机推荐

  1. Linux系统编程之IO_缓冲和非缓冲

    下面是一段类似日志记录的代码,已获取通讯的报文内容和当时的环境参数内容,就是创建一个文件,使用标准IO的fopen.fprintf进行输出记录.但是在调试中,刚开始我就傻眼了,文件创建成功了,但是实时 ...

  2. Python3.5 Day2作业:购物车程序

    需求: 1. 启动程序后,用户通过账号密码登录,然后打印商品列表. 2. 允许用户根据商品编号购买商品. 3. 用户选择商品后,检测余额是否足够,够就直接扣款,不够就提醒充值. 4. 可随时退出,退出 ...

  3. Master-Slave通用基础框架

    一.设计目的 设计出一个通用的Master-Slave基础框架,然后可以基于这个框架来实现特定的业务需求,比如实现多节点并行计算.分布式处理等. 二.设计理念 基于经典的命令模式,Master和Sla ...

  4. 基于zepto的H5/移动端tab切换触摸拖动加载更多数据

    以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...

  5. asp.net实现数据库版动态网页滑动门

    前端: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="滑动门.aspx.c ...

  6. [ios]关于用FMDB 操作数据库 删除 tableView 后刷新

    刚了解使用fmdb,从数据库获取数据 绑定到一个可变数组classNameItems //从ClassList表取得数据 FMResultSet *classInfo=[db executeQuery ...

  7. Window.focus()让页面成为当前窗体

    Window.focus()让页面成为当前窗体 最近在弄在线客服的时候,想在收到信息时候让窗体自动弹出到最前,最小化的时候也是弹出到最前.本来以为很麻烦,问了好多人,都不知道,在网上查资料也没有查到. ...

  8. Hadoop-1.2.1 升级到Hadoop-2.6.0 HA

      Hadoop-1.2.1到Hadoop-2.6.0升级指南   作者 陈雪冰 修改日期 2015-04-24 版本 1.0     本文以hadoop-1.2.1升级到hadoop-2.6.0 Z ...

  9. IDisposable的另类用法

    IDisposable是.Net中一个很重要的接口,一般用来释放非托管资源,我们知道在使用了IDisposable的对象之后一定要调用IDisposable.Dispose()方法,或者使用.Net提 ...

  10. Scrum Guide - Scrum指南中文版

    现在公司在使用敏捷开发模式进行日常的开发和管理工作,所以我看了下Ken Schwaber的<Scrum Guide>这本小册子,原本是英文的,这里提供中文的,以供日后复习和参考. Scru ...