提到HttpContext.Cache必然会想到Application,他们有什么共性和不同点呢,我们一一道来

  • 相同点:

1、两者都是使用键值对来存储对象

2、两者都是应用程序同生命周期(在cache不设置缓存策略的情况下)

  • 不同点

1、锁的方式:application采用lock,unlock来控制脏操作

                    Cache内部自动完成锁定高效率

我们做一个最简单的比较,测试读取999999次,这只是单线程的

  public void ApplicationTime()
{
for (int i = ; i < ; i++)
{
var s = HttpContext.Application["Name"];
}
} public void CacheTime()
{ for (int i = ; i < ; i++)
{
var s = HttpContext.Cache["Name"];
}
} //
// GET: /Home/
public ActionResult Index()
{ HttpContext.Application["Name"] = "张三";
HttpContext.Cache["Name"] = "张三";
Stopwatch swApplication= new Stopwatch();
swApplication.Start();
ApplicationTime();
swApplication.Start();
var applicationLong= swApplication.ElapsedMilliseconds; Stopwatch swCache = new Stopwatch();
swCache.Start();
CacheTime();
swCache.Start();
var cacheLong = swCache.ElapsedMilliseconds;

applicationLong:1373  cacheLong:925

单线程无法说明太多的问题,我们来看一个多线程的

   public  List<Thread> applicationThreads = new List<Thread>();
public List<Thread> cacheThreads = new List<Thread>(); public void ApplicationTime()
{
for (int i = ; i < ; i++)
{
var s = HttpContext.Application["Name"];
}
applicationThreads.Remove(Thread.CurrentThread);
} public void CacheTime()
{
for (int i = ; i < ; i++)
{
var s = HttpContext.Cache["Name"];
}
cacheThreads.Remove(Thread.CurrentThread);
} public void CachePool()
{
Stopwatch stopwatch=new Stopwatch();
stopwatch.Start();
while (cacheThreads.Count > )
{ }
stopwatch.Stop();
var time = stopwatch.ElapsedMilliseconds;
} public void ApplictionPool()
{ Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (applicationThreads.Count > )
{ }
stopwatch.Stop();
var time = stopwatch.ElapsedMilliseconds;
} //
// GET: /Home/
public ActionResult Index()
{
HttpContext.Application["Name"] = "张三";
HttpContext.Cache["Name"] = "张三";
for (int i = ; i < ; i++)
{
Thread threadApplication = new Thread(ApplicationTime);
threadApplication.Name = "Application" + i;
applicationThreads.Add(threadApplication);
threadApplication.Start();
} Thread applicationPool = new Thread(ApplictionPool);
applicationPool.Start(); for (int i = ; i < ; i++)
{
Thread threadCache = new Thread(CacheTime);
threadCache.Name = "Cache" + i;
cacheThreads.Add(threadCache);
threadCache.Start();
} Thread cachePool = new Thread(CachePool);
cachePool.Start(); return View();
}

我起了100个线程,每个线程读取次缓存,Application:37,Cache:8;如果读取次数增大,差距就更大

2、可以设置不同的缓存依赖策略

 string path = Server.MapPath("/Test/Power.xml");
CacheDependency cacheDependency=new CacheDependency(path);
HttpContext.Cache.Insert("power", "权限", cacheDependency);

Power.xml文件变化,缓存就失效了!

HttpContext.Cache 详解的更多相关文章

  1. (转)MyISAM Key Cache详解及优化

    原文:http://huanghualiang.blog.51cto.com/6782683/1372721 一.MyISAM Key Cache详解: 为了最小化磁盘I/O,MyISAM将最频繁访问 ...

  2. Guava Cache详解

    适用性 缓存在很多场景下都是相当有用的.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存 Guava Cache与ConcurrentMap很相似,但也不 ...

  3. HTML5应用程序缓存Application Cache详解

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  4. 离线应用Application Cache详解

    特点:     1.离线可访问            - 没有网络仍可访问整个应用     2.很小的服务器负载  - 缓存在本地,不需要到服务器请求     3.高速                 ...

  5. spring cache 详解

    Spring使用Cache 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我 ...

  6. 使用Free命令查看Linux服务器内存使用状况(-/+ buffers/cache详解)

    free命令可选参数 -b,-k,-m,-g show output in bytes, KB, MB, or GB -h human readable output (automatic unit ...

  7. HTML5应用程序缓存Application Cache详解.RP

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  8. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  9. Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

随机推荐

  1. html5 canvas 笔记五(合成与裁剪)

    组合 Compositing globalCompositeOperation syntax: globalCompositeOperation = type 注意:下面所有例子中,蓝色方块是先绘制的 ...

  2. MVC模型的理解

  3. 至强CPU性能排行,从X3210起,由低至高排列。

    X3210X3220E5410E5506X5355X3320E5507X5365E5-2603E3-1220LE5-2403E5607X3330L5506X3230L5420E5-2407W3520E ...

  4. html回忆(一)

    1. 解决乱码,告诉浏览器 当前文档类型和编码 <meta http-equiv="Content-Type" content="text/html; charse ...

  5. linux 修改home目录下的中文目录名为英文

    编辑home/下的 .config/user-dirs.dirs,把所有的中文名称修改为英文名称 在home目录下创建对应的英文名称路径 运行 xdg-user-dirs-update 重启机器

  6. Install Google Pinyin on Ubuntu 14.04

    Install Google Pinyin on Ubuntu 14.04 I've been spending more and more time on Ubuntu and I'm not us ...

  7. nodejs搭建http-server

      很多时候我们都需要搭建一个简单的服务器,部署在IIS,阿帕奇,或者用nodejs,网上很多关于nodejs搭建server的文章,但都是要创建server.js,很麻烦, 在这里我分享一个创建ht ...

  8. 学习mongo系列(十)MongoDB 备份(mongodump)与恢复(mongorerstore) 监控(mongostat mongotop)

    一.备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据.该命令可以导出所有数据到指定目录中. mongodump命令可以通过参数指定导出的数据量级转存的服务器. mongo ...

  9. java高薪之路__009_网络

    1. InetAddress类2. Socket: IP地址和端口号的结合,socket允许程序把网络连接当成一个流,数据在两个socket间通过IO传输, 通信的两端都要有socket. 主动发起通 ...

  10. Gradle version 2.2 is required. Current version is 2.14.1.

    gradle版本错误: 1. 修改gradle\wrapper\gradle-wrapper.properties文件: distributionUrl=https\://services.gradl ...