Cache:IMemoryCache/Options/ResponseCache

IMemoryCache

RazorPage需要由开发人员在Startup.cs的ConfigureServices()中以_依赖注入_的方式配置指定缓存中间件。比如:

services.AddMemoryCache(); //内存缓存,默认 services.AddDistributedMemoryCache(); //分布式内存缓存

其中,MemoryCache是默认的、最简单的缓存方式,我们就以此进行讲解。

然后,在PageModel的构造函数中_注入_:

private IMemoryCache _cache; public IndexModel(IMemoryCache memoryCache) { _cache = memoryCache; }

断点演示:_cache的类型

接下来就可以直接使用_cache对象了,它有两个实例方法:

  • TryGetValue():获取缓存数据
  • Set():存入缓存数据

    string cacheKey = "datetime"; DateTime cacheEntry; if (!_cache.TryGetValue(cacheKey, out cacheEntry)) { cacheEntry = DateTime.Now; _cache.Set(cacheKey, cacheEntry); }

一个扩展方法:GetOrCreate(),可以一次性的完成上述逻辑:先从cache中获取,获取不到就获取且存放到缓存:

_cache.GetOrCreate(cacheEntry, c => DateTime.Now);

MemoryCacheEntryOptions

RazorPage中的缓存选项通过一个专门的MemoryCacheEntryOptions对象设置,使用方法如下:

var cacheEntryOptions = new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromSeconds(3)) .SetAbsoluteExpiration(DateTime.Now.AddMinutes(1));

然后,传入Set()方法中:

_cache.Set(cacheKey, cacheEntry, cacheEntryOptions);

注意:在RazorPage中,Absolute和Slide可以combine:

  • 在Absolute时间段里,可以通过Slide的方式过期
  • Slide永远不会超过Absolute

限制和清理

RazorPage中会自动清理缓存,所以我们有可能需要自行限制缓存的容量,详见:Use SetSize, Size, and SizeLimit to limit cache size

[ResponseCache]

和OutputCache对应的是ResponseCache。

但是,只能将特性添加到PageModel上:

[ResponseCache( Duration = 300, Location = ResponseCacheLocation.Any, NoStore =false, VaryByHeader = "method", VaryByQueryKeys = new string[] { "page" })] public class IndexModel : PageModel

而且,ResponseCache本身不会缓存数据,而是利用Response Header影响服务器端的Cache运作(setting response caching headers under the HTTP 1.1 Caching specification.),而Reponse.Header中无法控制(属于url的)QueryKey,所以VaryByQueryKeys需要开启 Response Caching Middleware中间件。在StartUp.cs中设置:

  • ConfigureServices()方法中

    services.AddResponseCaching();

  • Configure()方法中

    app.UseResponseCaching();

你可能感兴趣的:(javascript)