本文转载自微信公众号「码农读书」,作者码农读书。转载本文请联系码农读书公众号。
微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持高性能的一个有效途径就是通过缓存热链上的数据来应对高频的请求。
LazyCache 是一款基于内存的易于使用和线程安全的缓存组件,值得注意的是,这里的 Lazy指的是 LazyCache 永远不会在 缓存未命中 时触发一次以上的缓存委托函数,因为内置了锁,换句话说,Lazy 减少了不必要的计算开销,这篇文章我们将会讨论如何在 ASP.NET Core 5.0 中使用 LazyCache。
要想在 ASP.NET Core MVC 5 中使用 LazyCache,你需要安装如下两个 nuget 包。
你可以通过 Nuget 可视化工具安装或者通过如下命令进行安装。
- PM> Install-Package LazyCache
- PM> Install-Package LazyCache.AspNetCore
缓存是一种 状态管理策略,在web应用程序中,它常常用来缓存一些数据到内存中供后续请求复用,这样就规避了原来不得不走硬盘取数据的尴尬,显而易见,缓存是提高 web 程序性能的一大利器,
虽然 ASP.NET Core 缺少内置的 Cache,但它提供了对三种缓存类型的支持:内存缓存,分布式缓存 和 响应缓存。
Cache 是一个开源的,简单的,线程安全的,可扩展的 缓存组件,在底层,LazyCache 使用了 Microsoft.Extensions.Caching 下的 MemoryCache 并使用了 懒锁 来确保 委托 只会执行一次。
如果你想缓存从数据库中取得的数据,复杂的对象图 和 web服务调用,那么使用 LazyCache 是一个非常好的选择,通常默认缓存的时间是 20min。
下面简单罗列了 LazyCache 的一些特点。
要想配置 LazyCache,可以在 ConfigureServices() 方法中通过调用 AddLazyCache() 将 LazyCache 注入到 ServiceContainer 中,如下代码所示:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddLazyCache();
- services.AddControllers();
- }
这样就可以确保 LazyCache 可以贯穿在你的应用程序中,要想访问 LazyCache 可以通过 IAppCache 接口,定义如下:
- public interface IAppCache
- {
- ICacheProvider CacheProvider { get; }
- CacheDefaults DefaultCachePolicy { get; }
- void Add<T>(string key, T item, MemoryCacheEntryOptions policy);
- T Get<T>(string key);
- Task<T> GetAsync<T>(string key);
- T GetOrAdd<T>(string key, Func<ICacheEntry, T> addItemFactory);
- T GetOrAdd<T>(string key, Func<ICacheEntry, T> addItemFactory, MemoryCacheEntryOptions policy);
- Task<T> GetOrAddAsync<T>(string key, Func<ICacheEntry, Task<T>> addItemFactory);
- Task<T> GetOrAddAsync<T>(string key, Func<ICacheEntry, Task<T>> addItemFactory, MemoryCacheEntryOptions policy);
- void Remove(string key);
- bool TryGetValue<T>(string key, out object value);
- }
一切都配置好之后,接下来就可以将 IAppCache 通过构造函数注入的方式灌到 Controller 中,如下代码所示:
- [ApiController]
- [Route("[controller]")]
- public class WeatherForecastController : ControllerBase
- {
- private readonly IAppCache _lazyCache;
- public WeatherForecastController(IAppCache cache)
- {
- this._lazyCache = cache;
- }
- }
考虑如下返回 list 的 GetData() 方法。
- private async Task<List<string>> GetData()
- {
- return new List<string>()
- {
- "Joydip Kanjilal",
- "Steve Smith",
- "Rick Smith"
- };
- }
接下来通过 GetOrAddAsync 方法从缓存获取或添加数据,如下代码所示:
- [ApiController]
- [Route("[controller]")]
- public class WeatherForecastController : ControllerBase
- {
- private readonly IAppCache _lazyCache;
- public WeatherForecastController(IAppCache cache)
- {
- this._lazyCache = cache;
- }
- [HttpGet]
- public async Task<IEnumerable<string>> Get()
- {
- var data = await _lazyCache.GetOrAddAsync("Authors", GetData, DateTimeOffset.Now.AddMinutes(30));
- return data;
- }
- private async Task<List<string>> GetData()
- {
- return new List<string>()
- {
- "Joydip Kanjilal",
- "Steve Smith",
- "Rick Smith"
- };
- }
- }
如果你想在内存中存储更多的数据或者你想使用档次更高的缓存服务,推荐使用 Redis 作为分布式缓存,而 LazyCache 🐂👃的地方在于你使用的一直是 IAppCache,这就意味着你可以轻松的用 Redis 来替换底层默认的 MemoryCache。
译文链接:https://www.infoworld.com/article/3608568/how-to-use-lazycache-in-aspnet-core-mvc-5.html
本文转载自微信公众号「HelloGitHub」,作者HelloGitHub。转载本文请联系HelloGi...
TOP云 (west.cn)3月2日消息,昨天早上sedo平台经纪人Frank Tillmanns在脸书上...
本文转载自微信公众号「菜鸟飞呀飞」,作者刘进坤。转载本文请联系菜鸟飞呀飞公...
本文转载自微信公众号「五分钟学大数据」,作者园陌 。转载本文请联系五分钟学大...
XSS 攻击 xxs 攻击英文全称是 Croess SiteScripting ,意思就是跨站脚本攻击。是...
1.考历史的时候,我莫名的有一种沉重感,因为我就要改变历史了。 2.女人是书,...
分布式应用运行时Dapr目前已经发布了1.1.0版本,阿里云也在积极地为Dapr贡献代码...
Topic Topic是一类消息的集合,是一种逻辑上的分区。为什么说是逻辑分区呢?因为...
转载自 https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md 1 介...
云服务器是否有图形界面? CentOS 6系列弹性云服务器如何安装图形化界面? CentO...