原文:http://www.binaryintellect.net/articles/a7d9edfd-1f86-45f8-a668-64cc86d8e248.aspx
环境:Visual Studio 2017, Asp.Net Core 1.1.
缓存机制主要是为了提高性能。在ASP.NET Web Forms 及 ASP.NET MVC中可以直接使用缓存对象(Caching object)缓存数据。这通常被称作“服务器端缓存”,是 Framework 的内置特性。虽然Asp.Net Core没有这样的缓存对象,但依然可以轻松的实现缓存功能。本文将对此进行介绍。
继续阅读之前,请先使用 Web Application 项目模板创建一个 Asp.net Core 的应用程序:
注:使用缓存功能,需通过NuGet安装“Microsoft.Extensions.Caching.Memory”扩展包。使用时引用:using Microsoft.Extensions.Caching.Memory; |
1. 在Startup类中开启缓存功能
如前所述,Asp.Net Core 没有内建的缓存对象,因此不能在 Controller 中使用它们。在Asp.Net Core中要使用内存缓存,需要在 Startup 类中依赖注入(DI)内存缓存服务(in-memory caching service)。打开Startup 文件,修改 ConfigureServices() 方法如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddMemoryCache();
}
AddMemoryCache() 方法将内存缓存功能加入到服务集合中。
2. 控制器中注入缓存对象
修改HomeController如下:
public class HomeController : Controller
{
private IMemoryCache cache; public HomeController(IMemoryCache cache)
{
this.cache = cache;
}
...
}
通过构造函数注入缓存对象,我们在控制器中就有了可用的缓存变量。
3. 使用Set()方法缓存一个对象
有了IMemoryCache 对象,你就可以非常方便读取或写入缓存数据。
public IActionResult Index()
{
cache.Set<string>("timestamp", DateTime.Now.ToString()); return View();
}
上面代码使用 IMemoryCache 的 Set<T>() 方法将一条记录加入到了缓存中。Set() 方法第一个参数为缓存名称,第二个参数为其值。
4. 使用Get()方法获取缓存
一旦您添加了缓存,就可以通过 Get() 方法来获取它们。
public IActionResult Show()
{
string timestamp = cache.Get<string>("timestamp"); return View("Show", timestamp);
}
上面代码演示了从缓存中获得数据,Get() 方法指定了缓存名和返回数据类型。
下面用于显示获得的缓存:
<h1>TimeStamp : @Model</h1>
<h2>@Html.ActionLink("Go back", "Index", "Home")</h2>
运行你的应用程序,打开 /Home/Index ,此时将生成了一个时间戳并存入缓存中。然后打开 /Home/Show 观察是否已从缓存中获得了时间戳数据。/Home/Show 页面会显示如下:
5. 使用TryGet()方法检查是否存在指定缓存项
上面示列中,每次访问 /Home/Index 都将生成一个新的时间戳并进行缓存,这是因为没有检查是否已存在同名的缓存项。有两种方式检测同名缓存项:
//first way
if (string.IsNullOrEmpty(cache.Get<string>("timestamp")))
{
cache.Set<string>("timestamp", DateTime.Now.ToString());
}
//second way
if (!cache.TryGetValue<string>("timestamp", out string timestamp))
{
cache.Set<string>("timestamp", DateTime.Now.ToString());
}
第一种方法仍然使用Get()方法,如未能获取到值,则返回 IsNullOrEmpty()。
第二种方法更加优雅一些,使用TryGet()方法获取值。TryGet()方法返回一个布尔值来表示缓存项是否存在,实际的缓存值将通过 out 参数获得。
6. 使用GetOrCreate()添加不存在的缓存项
你可能有这样的需求,缓存项如果存在则取出,如果不存在则创建。此时可以使用 GetOrCreate() 方法:
public IActionResult Show()
{
string timestamp = cache.GetOrCreate<string>("timestamp", entry => {
return DateTime.Now.ToString();
});
return View("Show", timestamp);
}
使用GetOrCreate() 方法检查timestamp是否存在,如果存在则直接赋值给本地变量,反之则创建一个新的缓存项。
现在直接访问/Home/Show页面,可以看到timestamp已显示。timestamp并没有通过/Home/Index赋值。
7. 设置缓存的决绝和滑动(sliding)期限
在之前的示列中,缓存数据会一直存在,直到调用Remove()方法。你也可以为缓存设置绝对期限和滑动期限。绝对期限就是为缓存设置一个明确的过期时间,滑动期限就是空闲多少时间之后移除缓存。
你可以通过 MemoryCacheEntryOptions对象设置缓存期限策略:
public IActionResult Index()
{
//cache.Set<string>("timestamp", DateTime.Now.ToString());
MemoryCacheEntryOptions options = new MemoryCacheEntryOptions();
options.AbsoluteExpiration = DateTime.Now.AddMinutes(1)