对于WEB地理信息系统来说,一个需要特别强调的是系统的响应速度,有许多方法来提高系统的速度,我们今天要提到的是利用缓存来提高系统的速度。

例如在执行查询时,如果前后多次所查询的得到结果都相同,我们可以将第一次查询的结果放到内存中缓存中去,第二或第二次调用时,我们可以直接返回缓存的信息,节省了从地图服务器中查询的时间,从而提高了响应的效率。

ASP.NET提供了强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。缓存是由Cache类实现的,缓存程序是每个应用程序专用的。缓存生存期依赖于应用程序的生存期,重新启动应用程序后,将重新创建Cache对象。

设计Cache类是为了便于使用。可以将项放置在Cache中,并在以后使用简单的键/值对来检索这些项。Cache类提供了强大的功能,允许自定义如何缓存项以及将他们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术也成为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。当执行清理时,可以只是Cache给予某些项比其他项更高的优先级。若要指示项的重要性,可以在使用Add或Insert方法添加项时,指定一个CacheItemPritory枚举值。当使用Add或Insert方法将项添加到缓存时,您还可以建立项的过期策略。可以通过使用DateTime值指定项的确切过期时间(绝对过期时间),来定义项的生存期。也可以使用TimeSpan值指定一个弹性过期时间,弹性过期时间允许根据项的上次访问时间来指定该项过期之前的运行时间。一旦项过期,便将它从缓存中移除。试图检索它的值的行为将返回null,除非该项被重新添加到缓存中。

此为,ASP.NET允许根据外部文件、目录(文件依赖项)或另一个缓存项(键依赖项)来定义缓存项的有效性。如果具有关联依赖项的项发生更改,缓存项便会失效并从缓存中移除。可以使用该技术在项的数据源更改时从缓存中移除这些项。

以下例子代码如何在查询时利用ASP.NET提供的缓存机制。

首先在GetCallbackResult 方法的最前面加入如下代码,判断是否存在某一缓存,如果存在(第二次调用相同的操作),则直接将缓存结果返回,如果不存在(首次调用),则不影响程序的执行:

// 判断是否有相应的缓存信息

string cachedResponse = Cache[callbackArg] as string;

if (cachedResponse != null)

{

return cachedResponse;

}

然后在GetCallbackResult方法返回response字符串之前,加入如下代码,用于将查询结果保存到缓存中:

TimeSpan cacheDuration = new TimeSpan(0, 0, 999999);

Cache.Add(callbackArg, response, null,

DateTime.Now.Add(cacheDuration),

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.NotRemovable, null);

上述代码通过Cache的Add方法将查询结果缓存起来。该方法的第一个参数是用于引用该项的缓存键;第二个参数是要添加到缓存的项;第三个参数表示文件依赖项或缓存键依赖项,当任何依赖项更改时,该对象即无效,并从缓存中移除。如果没有依赖项,则此参数为空引用;第四个参数是所添加对象将过期并从缓存中移除的时间。如果使用可调过期,则该参数必须为NoAbsoluteExpiration;第五个参数表示最后一次访问所添加对象时与该对象过期时之间的时间间隔。如果该值等效于20分钟,则该对象在最后一次被访问20分钟之后将过期并从缓存中移除。若果使用绝对过期,则该参数必须为NoSlidingExpiration;第六个参数是对象的相对的优先级,由CacheItemPriority枚举表示。缓存在退出对象时使用该值;具有较低优先级的对象在具有较高优先级的对象之前被从缓存移除;最后一个参数表示从缓存中移除对象时所调用的委托(如果提供)。当从缓存中删除应用程序的对象时,可使用它来通知应用程序。

GetCallbackResult方法的完整代码如下:

string ICallbackEventHandler.GetCallbackResult()

{

// 判断是否有相应的缓存信息

string cachedResponse = Cache[callbackArg] as string;

if (cachedResponse != null)

{

return cachedResponse;

}

// 将传入参数依据&分割符分到querystring变量中

Array keyValuePairs = callbackArg.Split("&".ToCharArray());

NameValueCollection queryString = new NameValueCollection();

string[] keyValue;

string response = "";

if (keyValuePairs.Length > 0)

{

for (int i = 0; i < keyValuePairs.Length; i++)

{

keyValue = keyValuePairs.GetValue(i).ToString().Split("=".ToCharArray());

queryString.Add(keyValue[0], keyValue[1]);

}

}

else

{

keyValue = callbackArg.Split("=".ToCharArray());

if (keyValue.Length > 0)

queryString.Add(keyValue[0], keyValue[1]);

}

// 是否进行缓存,对于属性查询图形不进行缓存

bool needCached = true;

// 针对参数中指定的ActiveType不同执行不同操作

string controlType = queryString["ActiveType"];

string eventArg = queryString["EventArg"];

switch (controlType)

{

case "GetResourceContent":

response = GisFunctionality.GetResourceContent(Map1);

break;

case "ShowFieldInfo":

response = GisFunctionality.ShowFieldInfo(Map1, eventArg);

break;

case "AttributeQuery":

response = GisFunctionality.AttributeQuery(Map1, eventArg, queryString["Condtion"]);

needCached = false;

break;

default:

break;

}

if (needCached)

{

TimeSpan cacheDuration = new TimeSpan(0, 0, 999999);

Cache.Add(callbackArg, response, null,

DateTime.Now.Add(cacheDuration),

System.Web.Caching.Cache.NoSlidingExpiration,

System.Web.Caching.CacheItemPriority.NotRemovable, null);

}

return response;

}

编译并运行程序。可以通过设置断点来确定缓存机制是否起到了作用。

转载于:https://www.cnblogs.com/tuncaysanli/archive/2009/06/21/1507725.html

查询结果做缓存的例子相关推荐

  1. 在sql当中为了让数据做缓存做with as的操作

    今天看别人的代码,突然发现之前理解的sql的with as的用法有新的理解. 之前理解的with as只是想着做单表的union all 操作时才使用,今天发现在可以使用逗号做分割,做缓存不同的表数据 ...

  2. 9.redis 做缓存

    全网最新相关内容 标题-链接 发布日期 简介 来源 轻松理解redis做缓存的流程_小浩丶的博客-CSDN博客_redis ... 2022-4-5 22:59:03 1. 引言 缓存有啥用?降低对数 ...

  3. SpringBoot集成Redis和配置Redis做缓存

    Redis介绍 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求,直观的存储结构使得通过程序交互十分简单. Redis数据库中所有 ...

  4. SpringBoot集成Shiro前后端分离使用redis做缓存

    文章目录 一 .shiro介绍 1.基础介绍 2.基本功能点 3.基本流程图 二. 常用的权限管理表关系 2.1. 表组成 2.2. 表结构 三.实战案例 3.1. 案例介绍 3.2. 依赖 3.3. ...

  5. springboot整合redis做缓存

    之前的项目中,用到过redis,主要是使用redis做缓存,redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,得益于redis的读写数据,尤其是在读取数据的时 ...

  6. 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试

    Redisson 1.Redisson做分布式锁  分布式锁主流的实现方案: 基于数据库实现分布式锁 基于缓存(Redis),性能最高 基于Zookeeper,可靠性最高 Redisson是一个在Re ...

  7. 22-08-06 西安 尚医通(03)EasyExcel; Spring Cache 、Redis做缓存

    EasyExcel EasyExcel:一行一行读取到内存 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单.节省内存著称 POI:java里操作excel,读取.创建excel ...

  8. 分页数据做缓存的思考

    当我们进行java开发时,当遇到页面数据过多或者复杂,会有很多慢sql,此时除了优化sql外,还可以通过缓存的方式来处理: 有如下方案: 1.整个页面做缓存,key为页数,value为整个页面的数据 ...

  9. Redis是如何做缓存的

    前言 基于Redis的高性能特性,我们将Redis用在缓存场景非常广泛.使用起来方便,响应也是远超关系型数据库. 但我们用Redis做缓存时,也要注意各种问题的应对和措施,比如缓存失效.数据一致性问题 ...

最新文章

  1. 目前比较流行的Python科学计算发行版
  2. 64位 java 数据类型_全面解析Java支持的数据类型及Java的常量和变量类型
  3. 2017年5月面试总结
  4. php 脏数据,脏数据和时间戳,还有数据一致性校验
  5. 如何使用SAP事务码SAT进行UI应用的性能分析
  6. 【翻译】.NET 5 Preview5发布
  7. LeetCode 576. 出界的路径数(动态规划)
  8. 【Java基础篇】try catch finally语句包含return语句时的执行过程
  9. python抓取股票数据_Python自动获取当日所有股票数据
  10. 【SIGIR2020】信息检索对话中混合主动性和协同性的分析
  11. h5页面如何预览excel文件_在网页中预览word和excel
  12. T Day-1 星空之夜
  13. sudo apt-get install package时出现E:无法定位软件包
  14. 计算机大学生三好学生申请书,大学生三好学生申请书
  15. mysql server安装及配置
  16. 程序设计课程设计报告(学生成绩管理系统)
  17. 编译原理词法分析器(C/C++)
  18. 抱怨其实是对自己的不满
  19. 【易语言助手插件】IDE 鼠标手势1.2 原汁原味移植浏览器手势
  20. JAVA ActiveMQ 详解

热门文章

  1. 2017蓝桥杯C++A:迷宫(DFS)
  2. [Python] 字典 update()函数:在字典中更新 (或加入) 键值对
  3. matlab2c使用c++实现matlab函数系列教程-zeros函数
  4. 多维数组-创建多维数组
  5. LaTex中“图片引用失败,显示(??)”的解决办法
  6. Django模板语言及视图
  7. 《Go语言实战》摘录:7.2 并发模式 - pool
  8. 使用ef查询有缓存的问题
  9. css3圆形修边按钮
  10. oracle下查询的sql已经超出IIS响应时间