HttpContext.Cache 详解
提到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 详解的更多相关文章
- (转)MyISAM Key Cache详解及优化
原文:http://huanghualiang.blog.51cto.com/6782683/1372721 一.MyISAM Key Cache详解: 为了最小化磁盘I/O,MyISAM将最频繁访问 ...
- Guava Cache详解
适用性 缓存在很多场景下都是相当有用的.例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存 Guava Cache与ConcurrentMap很相似,但也不 ...
- HTML5应用程序缓存Application Cache详解
什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...
- 离线应用Application Cache详解
特点: 1.离线可访问 - 没有网络仍可访问整个应用 2.很小的服务器负载 - 缓存在本地,不需要到服务器请求 3.高速 ...
- spring cache 详解
Spring使用Cache 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我 ...
- 使用Free命令查看Linux服务器内存使用状况(-/+ buffers/cache详解)
free命令可选参数 -b,-k,-m,-g show output in bytes, KB, MB, or GB -h human readable output (automatic unit ...
- HTML5应用程序缓存Application Cache详解.RP
什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...
- Oracle内存详解之 Library cache 库缓冲
Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...
- Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...
随机推荐
- 04-时序逻辑电路设计之计数器——小梅哥FPGA设计思想与验证方法视频教程配套文档
芯航线--普利斯队长精心奉献 实验目的:以计数器为例学会简单的时序逻辑电路设计 实验平台:芯航线FPGA核心板 实验原理: 时序逻辑电路是指电路任何时刻的稳态输出不仅取决于当前的输入,还与前一时刻输入 ...
- 简单的jQuery 四级分类实用插件
前言 最近因需要自己封装了一个很简单的四级分类的jQuery插件,主要用于后台数据的传输和获取.接下来就分享一下这个实用的插件吧. 正文 老规矩,先看一下效果,这个就很丑了,没有美化的,因为主要还是用 ...
- mybatis动态SQL标签的用法
动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...
- map函数
概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 语法 array.map(callback[, thisArg]) 参数 callback 原数组中的元素经 ...
- jQuery右键菜单contextMenu使用实例
在最近项目中需要频繁的右键菜单操作.我采用了contextMenu这款jQuery插件. 参考网址:http://www.jb51.net/article/58709.htm 官网demo http: ...
- Linux命令学习整理。
http://www.cnblogs.com/suliuer/p/5448747.html 本文主要包括两部分,一是Linux基础命令的总结:二是总结一些常用的命令知识点. 一.基础总结 学习Linu ...
- MVC 强类型ViewData[] TempData[]
一.ViewData[] //赋值 ViewData["u"]="值"; //取值 数据类型 u= ViewData["u"] as 数据类 ...
- c#入门笔记(1)数据类型
1.c#有三种数据类型,分别是数值型,引用类型,指针类型. 2.数值类型 2.1整数类型:sbyte,byte,short,ushort ,int uint,long,ulong(u开头是无符号,范围 ...
- nodejs系列(一)安装和介绍
一.安装nodejs http://www.nodejs.org/download/.进入release/选择想要安装的文件,win下安装选择mis和exe的比较方便,安装完毕重新打开cmd命令行,p ...
- openssl证书相关
http://blog.csdn.net/modianwutong/article/details/43059435 http://www.cnblogs.com/E7868A/archive/201 ...