时间:2022-10-16 11:24:53 | 栏目:.NET代码 | 点击:次
在.NET Core中提供了Caching的组件。目前Caching组件提供了三种存储方式:
新建一个ASP.NET Core Web应用程序项目,然后安装 Microsoft.Extensions.Caching.Memory。
修改ConfigureServices方法
services.AddMemoryCache(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
在HomeController使用:
private IMemoryCache memoryCache; public HomeController( IMemoryCache _memoryCache) { memoryCache = _memoryCache; } public IActionResult Index() { string cacheKey = "key"; string result; if (!memoryCache.TryGetValue(cacheKey, out result)) { result = $"LineZero{DateTime.Now}"; memoryCache.Set(cacheKey, result); //设置相对过期时间 memoryCache.Set(cacheKey, result, new MemoryCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromSeconds(10))); //设置绝对过期时间 memoryCache.Set(cacheKey, result, new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromSeconds(10))); //删除缓存 memoryCache.Remove(cacheKey); //设置缓存优先级(程序压力大时,会根据优先级自动回收) memoryCache.Set(cacheKey,result,new MemoryCacheEntryOptions() .SetPriority(CacheItemPriority.NeverRemove)); //过期时缓存回调 memoryCache.Set(cacheKey, result, new MemoryCacheEntryOptions() .SetAbsoluteExpiration(TimeSpan.FromSeconds(60)) .RegisterPostEvictionCallback((key, value, reason, substate) => { nlog.Warn($"键{key}值{value}改变,因为{reason}"); })); //Token过期时,缓存回调 var cts = new CancellationTokenSource(); memoryCache.Set(cacheKey, result, new MemoryCacheEntryOptions() .AddExpirationToken(new CancellationChangeToken(cts.Token)) .RegisterPostEvictionCallback((key, value, reason, substate) => { nlog.Warn($"键{key}值{value}改变,因为{reason}"); })); } ViewBag.Cache = result; return View(); }
在ASP.NET Core MVC 中有一个 Distributed Cache Tag Helper,它是依赖于MemoryCache组件的。
可以直接在试图上增加 distributed-cache 标签
@{ ViewData["Title"] = "Home Page"; } <distributed-cache name="mycache" expires-after="TimeSpan.FromSeconds(10)"> <p>缓存项10秒过期(expires-after绝对过期时间)</p> </distributed-cache> <distributed-cache name="mycachenew" expires-sliding="TimeSpan.FromSeconds(10)"> <p>相对十秒(expires-sliding相对过期时间)</p> @DateTime.Now </distributed-cache> <div>@ViewBag.Cache</div>