2KB项目,专业的源码交易网站 帮助 收藏 每日签到

关于 ASP.NET Core 内存缓存你需求晓得的 10 点

  • 时间:2019-06-20 01:49 编辑:2KB 来源:2KB.COM 阅读:431
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:10
英文原文:10 Things To Know About In-Memory Caching In ASP.NET Core

缓存机制的首要目标是进步使用程序的功能。作为 ASP.NET 开发职员,你可能会心识到 ASP.NET Web 窗体和 ASP.NET MVC 可使用 Cache 工具缓存使用程序的数据。这凡是被称为Server端数据缓存,而且常作为框架的内置功用。固然 ASP.NET Core 中并没有如许的 Cache 工具,可是你可以很轻易地完成内存缓存。本文将向你说明怎么完成。

在进一步浏览之前,你先创立一个基于 Web 使用程序项目模板的新的 ASP.NET Core 使用程序。

然后依照下面提到的步调一一构建和测试由内存缓存供给的各类功用。

1. 内存缓存需求在启动类 Startup 中启用一下

分歧于 ASP.NET Web 窗体和 ASP.NET MVC,ASP.NET Core 没有内置的 Cache 工具,可以拿来在把持器外面直接运用。 这里,内存缓存时经过依靠注入来启用的,因而第一步就是在 Startup 类中注册内存缓存的服务。如斯,就得翻开 Startup 类然后定位到 ConfigureServices() 办法,像下面如许修正 ConfigureServices() 办法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
        services.AddMemoryCache();
}

为了向你的使用程序参加内存缓存才能,你需求在服务聚集上挪用 AddMemoryCache() 办法。采取这类方法就能够让一个内存缓存(它是一个 IMemoryCache 工具)的默许完成可以被注入到把持器中去。

其它翻译版本 (1) 加载中

2. 内存缓存运用依靠注入来注入缓存工具

然后翻开 HomeController 并对其实行修正,以下所示:

public class HomeController : Controller
{
    private IMemoryCache cache;

    public HomeController(IMemoryCache cache)
    {
        this.cache = cache;
    }
    ....
}

如你所见,上述代码声了然一个 ImemoryCache 的私有变量。该变量会被结构器中被赋值。结构器会经过 DI(依靠注入)接纳到缓存参数,然后被存储在当地变量总,供给后续运用。

其它翻译版本 (1) 加载中

3. 你可使用 Set() 办法来在缓存中存工具

等你有了这个 IMemoryCache 工具,就能够读取或者向它写入数据了。向缓存写入数据项是相当直接的。

public IActionResult Index()
{
  cache.Set<string>("timestamp", DateTime.Now.ToString());
  return View();
}

上述代码在 Index() 这个 action 中设置了一个缓存项。这是经过运用 IMemoryCache 的 Set<T>() 来完成的。Set() 办法的第一个参数是键名,用来标识该数据项。第二个参数是键的取值。在此例中,我们存储一个字符串的键和一个字符串的值,而你也能够存储其它类型 (原生和自定义的类型) 的键值对。

4. 你可使用 Get 办法来从缓存中获得到一个数据项

等你向缓存中添加好了数据,或许会想要在使用程序的其它地方去获得到该数据,可以用 Get() 来做到。以下代码会通知你怎么来做这件工作。

public IActionResult Show()
{
  string timestamp = cache.Get<string>("timestamp");
  return View("Show",timestamp);
}

上述代码从 HomeController 的别的一个action(Show)那边获得到了一个缓存的数据项。Get() 办法会指定命据项的类型和它的键名。假如该数据项存在的话,就会被前往而且被赋值给 timestamp 这个字符串变量。然后这个 timestamp 的值就会被通报给 Show 视图。

Show 视图只是容易地输出了 timestamp 的值,以下所示:

<h1>TimeStamp : @Model</h1>

<h2>@Html.ActionLink("Go back", "Index", "Home")</h2>

为了对现在为止你所写的代码实行一下测试,请运转使用程序。起首将阅读器导航至 /Home/Index ,如许 timestamp 键就会被赋值。然后导航至 /Home/Show 并检查 timestamp 值是不是会输出。下图所示是 Show() 这个 action 运转起来的一个例子。

5. 你可使用 TryGet() 来check缓存中是不是存在特定的键值

假如你察看后面的示例,会发明每次你导航至 /Home/Index 的时分, 都会有一个新的 timestamp 被赋值给了缓存项。这是由于我们并没有对此实行check,规则只要在数据项不存在的时分才赋值。很多时分你都会想要如许做的。这里有两种方法可以在 Index() 这个 action 外面来做如许的check。我们把两种方法都鄙人面列了出来。

//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() 办法,这一次它被拿来跟 if 块一同用。假如 Get() 不能在缓存中找到指定的数据项,IsNullOrEmpty() 就会前往 true。而只要这时候候 Set() 才会被挪用,一次来添加数据项。

第二种方法愈加优雅一点。它运用 TryGet() 办法来获得一个数据项。TryGet() 办法会前往一个布尔值来指明数据项是否被找到。实践的数据项可使用一个输出参数拉掏出来。假如 TryGet() 前往false,Set() 就会被用来添加数据。

6. 假如不存在的话,可使用 GetOrCreate() 来添加一项

有时你需求从缓存中检索现有项。假如该项目不存在,则盼望添加该项。这两个Task - 假如它存在获得值,不然创立之 - 可使用 GetOrCreate() 办法来完成。修正后的 Show() 办法展现了怎么完成的。

public IActionResult Show()
{
  string timestamp = cache.GetOrCreate<string>
  ("timestamp", entry => { 
return DateTime.Now.ToString(); });
  return View("Show",timestamp);
}

Show() 举措如今运用 GetOrCreate() 办法。 GetOrCreate() 办法将check时间戳的键值是不是存在。假如是,现有值将被赋值给部分变量。不然,将依据第二个参数中指定的逻辑创立一个新条目并将其添加到缓存中。

为了测试此代码,请直接运转 /Home/Show,不需求跳转到 /Home/Index。你依然会看到输出的时间戳值,由于在该值不存在的状况下,GetOrCreate() 如今是添加了它。

7. 你可以在一个缓存的数据项上面设置绝对和转动的过时时间

在前述示例中,一个缓存项只需被添加到缓存就会不断存储,除非它被明白地运用 Remove() 从缓存中移除。你也能够在一个缓存项上面设置一个绝对和转动的过时时间。一个绝对的过时设置意味着该缓存项会在严格指定的日期和时间点被移除,而转动过时设置则意味着它在给定的一段时间量处于闲暇形态(也就是没人去拜访)以后被移除。

为了能在一个缓存项上面设置这两种过时战略,你要用到 MemoryCacheEntryOptions 工具。以下代码向你展现了怎么去运用。

MemoryCacheEntryOptions options = 
new MemoryCacheEntryOptions();
options.AbsoluteExpiration = 
DateTime.Now.AddMinutes(1);
options.SlidingExpiration = 
TimeSpan.FromMinutes(1);
cache.Set<string>("timestamp", 
DateTime.Now.ToString(), options);

上述代码来自于修正过的 Index() action,它创立了一个 MemoryCacheEntryOptions 的工具,然后将它的 AbsoluteExpiration 属性设置为今后刻到一分钟以后的一个 DateTime 值,它还将 SlidingExpiration 属性设置为一分钟。这些值都指定了该缓存项会在一分钟以后从缓存移除,不论其是不是会被拜访。另外,假如该缓存项如初不断闲暇了有一分钟,它也会被从缓存中移除。

等你将 AbsoluteExpiration 和 SlidingExpiration 的值设置后, Set() 办法就能够被用来将一个数据项添加到缓存。这一次 MemoryCacheEntryOptions 工具会被作为第三个参数通报给 Set() 办法。

8. 当缓存项会被移除时,你可以衔接回调

有时你会想要在缓存项从缓存中被移除时收到告诉。可能会有多种缘由需求从缓存中移除数据项。例如,由于明白地履行了 Remove() 办法而移除一个缓存项, 也有多是由于它的 AbsoluteExpiration 和 SlidingExpiration 值曾经到期而被移除,诸如斯类的缘由。

为了能晓得项目是什么时候从缓存移除的,你需求编写一个缓存函数。以下代码向你展现了怎么去做这件工作:

MemoryCacheEntryOptions options = 
new MemoryCacheEntryOptions();
options.AbsoluteExpiration = 
DateTime.Now.AddMinutes(1);
options.SlidingExpiration = 
TimeSpan.FromMinutes(1);
options.RegisterPostEvictionCallback
(MyCallback, this);
cache.Set<string>("timestamp", 
DateTime.Now.ToString(), options);

上述代码同之前运用 MemoryCacheEntryOptions 来配置 AbsoluteExpiration 和 SlidingExpiration 的代码相当相似。愈加主要的是它也挪用了 RegisterPostEvictionCallback() 办法来绑定方才会商过的回调函数。在这里回调函数被定名为 MyCallback。第二个参数是一个你会想要通报给回调函数的形态工具。这里我们传入了 HomeController 的实例 (用 this 将以后的 HomeController 工具“点”出来) 作为形态工具。

后面提到的MyCallback函数,其代码以下所示:

private static void MyCallback(object key, object value,
EvictionReason reason, object state)
{
    var message = $"Cache entry was removed : {reason}";
    ((HomeController)state).
cache.Set("callbackMessage", message);
}

请细心察看这段代码。 MyCallback() 是 HomeController 类外面的一个私有静态函数,它有四个参数。后面两个参数表现方才删除的缓存项的键和值,第三个参数表现的是该数据项被删除的缘由。EvictionReason 是一个枚举类型,它保护者各类可能的删除缘由,如过时,删除和交换。
在回调函数的外部,我们会基于删除的缘由结构一个字符串消息。我们想要将此消息设置成别的一个缓存项。如许做的话就需求拜访 HomeController 的缓存工具,此时形态参数就能够排上用处了。运用形态工具,你可以对 HomeController 的缓存工具实行把持,并运用 Set() 增加一个 callbackMessage 缓存项。
你可以经过 Show() 这个 action 来拜访到 callbackMessage,以下所示:

public IActionResult Show()
{
  string timestamp = cache.Get<string>("timestamp");
  ViewData["callbackMessage"] = 
    cache.Get<string>("callbackMessage");
  return View("Show",timestamp);
}

最初就能够在 Show 视图中显示出来了:

<h1>TimeStamp : @Model</h1>

<h3>@ViewData["callbackMessage"]</h3>

<h2>@Html.ActionLink("Go back", "Index", "Home")</h2>
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。


2KB项目(www.2kb.com,源码交易平台),供给担保交易、源码交易、虚拟商品、在家创业、在线创业、Task交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接生意、网站交易、广告生意、站长培训、建站美工等服务

  • 全部评论(0)
上一篇:Docker 公司已死
下一篇:奇虎360 和 go
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部