Asp.Net MVC 缓存设计
Asp.Net MVC 缓存:
1. 可以直接在Controller,Action上面定义输出缓存OutputCache,如下,第一次请求这个Index的时候,里面的代码会执行,并且结果会被缓存起来,然后在30秒钟内,第二个或者后续的请求,就不需要再次执行,而是直接将结果返回给用户即可
[OutputCache(Duration = ,VaryByParam="none")]
public ActionResult Index(string name)
{
return View();
}
OutputCache Attribute既可以作用于Action上,也可以作用于Controller.
VaryByParam为none,表示不管参数如何变化,30s内都缓存,如果VaryByParam设置为name, 那下次访问如果name变化,则缓存失效,生成新的缓存页。
如果您不想要为不同的已缓存内容指定参数,可以将其设置为none。如果想要指定所有的已缓存内容参数,可以设置为*
其中除了VaryByParam,还可以做如下的配置,(所有的配置:以分号分隔的字符串列表)
VaryByContentEncoding | 获取或设置基于内容变化的编码。 | |
VaryByCustom | 获取或设置基于自定义项变化的值。 | |
VaryByHeader | 获取或设置基于标头变化的值。 | |
VaryByParam | 获取或设置基于参数变化的值。 |
2. 支持通过CacheProfile的方式,灵活定义缓存的设置(新功能)
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="faceProfile" duration ="180" varyByParam="none" enabled="true"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
<system.web>
[OutputCache(CacheProfile = "faceProfile")]
public ActionResult Index()
{
return View();
}
3. .Net提供了一个缓存对象Cache,我们可以使用 HttpRuntime.Cache来使用。(web程序可以使用 HttpContext.Cache )
//
// 摘要:
// 提供了一组的当前应用程序的 ASP.NET 运行时服务。
public sealed class HttpRuntime
{ //
// 摘要:
// 获取 System.Web.Caching.Cache 当前应用程序。
//
// 返回结果:
// 当前的 System.Web.Caching.Cache。
//
// 异常:
// T:System.Web.HttpException:
// 未安装 ASP.NET。
public static Cache Cache { get; } }
我们查看HttpRuntime的接口发现,这个属性是静态的,在.net中静态的属性,我们可以得出这个属性为线程安全的,这很好的解决多线程环境中并发的问题。
具体的操作:
添加缓存
public static void SetCache(string key, object obj)
{
Cache cache = HttpRuntime.Cache;
cache.Insert(key, obj);
} public static void SetCache(string key, object obj, TimeSpan Timeout)
{
Cache cache = HttpRuntime.Cache;
cache.Insert(key, obj, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
} public static void SetCache(string key, object obj, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
Cache cache = HttpRuntime.Cache;
cache.Insert(key, obj, null, absoluteExpiration, slidingExpiration); }
absoluteExpiration:用于设置绝对过期时间,它表示只要时间一到就过期,所以类型为System.DateTime,当给这个参数设置了一个时间时,slidingExpiration参数的值就只能为Cache.NoSlidingExpiration,否则出错;
slidingExpiration:用于设置可调过期时间,它表示当离最后访问超过某个时间段后就过期,所以类型为System.TimeSpan,当给这个参数设置了一个时间段时,absoluteExpiration的值就只能为Cache.NoAbsoluteExpiration,否则出错;
获取缓存信息:
public T Get<T>(string key)
{
return (T)HttpRuntime.Cache[key];
} public static object Get(string key)
{
return HttpRuntime.Cache[key];
}
移除缓存:
public static void Remove(string key)
{
HttpRuntime.Cache.Remove(key);
}
public void Clear()
{
IDictionaryEnumerator enumerator = HttpRuntime.Cache.GetEnumerator();
while (enumerator.MoveNext())
{
HttpRuntime.Cache.Remove(enumerator.Key.ToString());
}
}
缓存依赖项:文件依赖,其他缓存依赖,数据库依赖,当依赖项发生改变时,缓存会失效,并可以引发一定事件。
CacheDependency fileDepends = new CacheDependency(Server.MapPath("config.json"));
HttpRuntime.Cache.Insert(key, obj, fileDepends);
MemoryCache
类似于 ASP.NET Cache 类。 MemoryCache 类有许多用于访问缓存的属性和方法。
Cache 和 MemoryCache 类之间的主要区别是:
1. MemoryCache 已被更改,以便 .NET Framework 应用程序(非 ASP.NET 应用程序)可以使用该类。 例如,MemoryCache 类对 System.Web 程序集没有依赖关系。
2. 可以创建 MemoryCache 类的多个实例,以用于相同的应用程序和相同的 AppDomain 实例
关于MemoryCache的用法,推荐看下abp框架中对MemoryCache的使用
github: https://github.com/aspnetboilerplate/aspnetboilerplate
同时,也可以看博客园里有园友对abp框架对缓存源码的解析。
根据ABP的代码,我整理了一个简单的memroycache使用方法
public class AbpMemoryCache
{
private MemoryCache _memoryCache; public TimeSpan DefaultSlidingExpireTime { get; set; } public AbpMemoryCache()
{
_memoryCache = new MemoryCache(new OptionsWrapper<MemoryCacheOptions>(new MemoryCacheOptions()));
DefaultSlidingExpireTime = TimeSpan.FromHours();
} public object GetOrDefault(string key)
{
return _memoryCache.Get(key);
} public void Set(string key, object value)
{
_memoryCache.Set(key, value, DefaultSlidingExpireTime);
} public void Remove(string key)
{
_memoryCache.Remove(key);
} public void Clear()
{
_memoryCache.Dispose();
_memoryCache = new MemoryCache(new OptionsWrapper<MemoryCacheOptions>(new MemoryCacheOptions()));
} public void Dispose()
{
_memoryCache.Dispose();
}
}
Asp.Net MVC 缓存设计的更多相关文章
- ASP.NET MVC:缓存功能的设计及问题
这是非常详尽的asp.net mvc中的outputcache 的使用文章. [原文:陈希章 http://www.cnblogs.com/chenxizhang/archive/2011/12/14 ...
- ASP.NET MVC 缓存使用示例
应该说,缓存的设计是一门较为复杂的学问,主要考虑的问题包括:要不要缓存?要缓存哪些数据?要缓存多少数据?要缓存多久?如何更新缓存(手动还是自 动)?将缓存放在哪里?本文将以较为通俗易懂的方式,来看一看 ...
- ASP.NET MVC缓存
根据缓存的位置不同,可以区分为: ①客户端缓存(缓存在用户的客户端,例如浏览器中) ②服务器缓存(缓存在服务器中,可以缓存在内存中,也可以缓存在文件里,并且还可以进一步地区分为本地缓存和分布式缓存两种 ...
- 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...
- ASP.NET MVC缓存使用
局部缓存(Partial Page) 1.新建局部缓存控制器: public class PartialCacheController : Controller { // GET: /PartialC ...
- ASP.NET MVC 缓存扩展 - Donut Caching
项目介绍 ASP.NET MVC Extensible Donut Caching brings donut caching to ASP.NET MVC 3 and later. The code ...
- ASP.NET MVC 缓存Outputcache (局部动态)
首先说一下需求: 比如我需要对网站首页做缓存,于是在首页对于的Action上贴上了Outputcache,接着问题就来了,首页上的有部分数据是不能做缓存的,比如个人信息,不然,每个人登陆都是看到第一个 ...
- asp.net mvc 缓存
webConfig 里面配置缓存时间 <caching> <outputCacheSettings> <outputCacheProfiles> <add n ...
- ASP.NET MVC 缓存页面(方法)
随机推荐
- 玩转DOM遍历——用NodeIterator实现getElementById,getElementsByTagName方法
先声明一下DOM2中NodeIterator和TreeWalker这两类型真的只是用来玩玩的,因为性能不行遍历起来超级慢,在JS中基本用不到它们,除了<高程>上有两三页对它的讲解外,谷歌的 ...
- Guid ToString 格式知多少?
在日常编程中,Guid是比较常用的,最常见的使用就是如下所示: string id = Guid.NewGuid().ToString(); 这条语句会生成一个新的Guid并转成字符串,如下: // ...
- PageObject模式的层次结构
做过UI自动化的都晓得,在做UI自动化时定位特别依赖页面,一旦页面发生变更就不得不跟着去修改页面定位. 在webdriver中,假设你想对一个元素定位操作,那么你可能会编写下面的代码: driver. ...
- Angular 笔记系列(二)数据绑定
数据绑定这块儿没啥说的,简单两个例子带过了. Hello World: <!DOCTYPE html> <html ng-app> <head> <title ...
- 编译安装MariaDB-10.0.21
一.源码编译安装gcc-5.1.0 1.下载gcc源码包 Download (HTTP): http://ftpmirror.gnu.org/gcc/gcc-5.2.0/gcc-5.2.0.tar.b ...
- 搜狗员工用百度算什么,谷歌员工当着老板的面用bing,结果悲剧了!
之前看到一篇文章,写的是搜狗的员工遇到问题时,用百度,结果网友的评论真是亮瞎眼.今天,W3Cschool小师妹将为大家分享一个类似的故事,那就是谷歌员工当着老板的面,竟然用BING. 这位谷歌员工称, ...
- PHP闭包(Closure)初探(转载 http://my.oschina.net/melonol/blog/126694?p=2#comments)
匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它.声明一个匿名函数是这样: ? 1 2 3 $func = function() { ...
- Paper List ABOUT Deep Learning
Deep Learning 方向的部分 Paper ,自用.一 RNN 1 Recurrent neural network based language model RNN用在语言模型上的开山之作 ...
- eclipse上的.properties文件中文编辑显示处理
最近在对接银联备份金,将相应的SDK导入到eclipse后,打开.properties文件中文注释变成了如下样子,很不方便查阅参照: 平常开发我们希望看到的是如下样子,很直观能明确配置的参数代表的信息 ...
- centos升级vim
vim7爆出严重安全漏洞,升级到vim8,过程如下: yum remove vim -y yum install ncurses-devel -y 如果失败,提示unknown host apt.sw ...