循序渐进学.Net Core Web Api开发系列【12】:缓存
系列目录
本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi
一、概述
本篇介绍如何使用缓存,包括MemeryCache和Redis。
二、MemeryCache
1、注册缓存服务
public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); }
貌似较新的版本是默认已经注册缓存服务的,以上代码可以省略,不过加一下也没有问题。
2、在Controller中注入依赖
public class ArticleController : Controller { private readonly IMemoryCache _cache; public ArticleController(SalesContext context, ILogger<ArticleController> logger, IMemoryCache memoryCache) { _cache = memoryCache; } }
3、基本使用方法
public List<Article> GetAllArticles() { List<Article> articles = null; if (!_cache.TryGetValue<List<Article>>("GetAllArticles", out articles)) { _logger.LogInformation("未找到缓存,去数据库查询"); articles = _context.Articles .AsNoTracking() .ToList<Article>(); _cache.Set("GetAllArticles", articles); } return articles; }
逻辑是这样的:
(1)、去缓存读取指定内容;(2)如果没有读取到,就去数据库区数据,并存入缓存;(3)如果取到就直接返回数据。
4、缓存的过期
绝对过期:设定时间一到就过期。适合要定期更新的场景,比如组织机构信息数据。
_cache.Set("GetAllArticles", articles, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(20)));
相对过期:距离最后一次使用(TryGetValue)后指定时间后过期,比如用户登陆信息。
_cache.Set("GetAllArticles", articles, new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(20)));
三、分布式缓存Redis的使用
1、缓存服务注册
public void ConfigureServices(IServiceCollection services) { services.AddDistributedRedisCache(options => { options.Configuration = Configuration["Redis:Configuration"]; options.InstanceName = Configuration["Redis:InstanceName"]; }); }
appsettings.json的内容大致如下:
1 2 3 4 5 6 7 8 9 10 | { "ConnectionStrings" : { "SQLServerConnection" : "....;" , "MySQLConnection" : "...;" }, "Redis" : { "Configuration" : "IP:1987,allowAdmin=true,password=******,defaultdatabase=5" , "InstanceName" : "SaleService_" } } |
如果设置了的InstanceName话,所有存储的KEY会增加这个前缀。
2、在Controller中引入依赖
[Produces("application/json")] [Route("api/Article")] public class ArticleController : Controller { private readonly IDistributedCache _distributedCache; public ArticleController(IDistributedCache distributedCache) { _distributedCache = distributedCache; } }
3、基本使用
[HttpGet("redis")] public void TestRedis() { String tockenid = "AAAaaa"; string infostr = _distributedCache.GetString(tockenid); if(infostr == null) { _logger.LogInformation("未找到缓存,写入Redis"); _distributedCache.SetString(tockenid, "hello,0601"); } else { _logger.LogInformation("找到缓存"); _logger.LogInformation($"infostr={infostr}"); } return; } }
4、存储对象
由于Redis只能存储字符串,所有对于对象的存取需要进行序列化操作。
[HttpGet("redis_object")] public List<Article> TestRedis4Object() { String objectid = "articles"; List<Article> articles = null;
var valuebytes = _distributedCache.Get(objectid); if (valuebytes == null) { _logger.LogInformation("未找到缓存,写入Redis"); articles = _context.Articles.AsNoTracking().ToList(); byte[] serializedResult = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(articles)); _distributedCache.Set(objectid, serializedResult); return articles; } else { _logger.LogInformation("找到缓存"); articles =JsonConvert.DeserializeObject<List<Article>>(Encoding.UTF8.GetString(valuebytes)); return articles; } }
5、缓存的过期
绝对过期:
_distributedCache.SetString(tockenid, "hello,0601",new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(10)));
相对过期:
_distributedCache.SetString(tockenid, "hello,0601",new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(10)));
6、客户端工具
采用Redis Desktop Manager 可以查看存储情况
签名区:
如果您觉得这篇博客对您有帮助或启发,请点击右侧【推荐】支持,谢谢!
分类:
.Net Core WebApi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南