.NET6之Mini API【十七、缓存】

内容纲要

缓存是空间换时间的一种做法,可以有效的提升响应时间,asp.net core引入了本地内存缓存和分布式缓存。

先看一下本地内存缓存:

  1. using Microsoft.Extensions.Caching.Memory;
  2. using Microsoft.Extensions.Internal;
  3. var builder = WebApplication.CreateBuilder(args);
  4. //注入内存缓存服役,设定缓存容量为40
  5. builder.Services.AddMemoryCache(opt =>
  6. {
  7. opt.SizeLimit = 40;
  8. });
  9. var app = builder.Build();
  10. //查询缓存
  11. app.MapGet("/get/{id}", (IMemoryCache memoryCache, string id) =>
  12. {
  13. var result = memoryCache.TryGetValue(id, out string timeStr);
  14. if (result)
  15. {
  16. return $"获取成功:{timeStr}";
  17. }
  18. return "获取失败";
  19. });
  20. //配置缓存,大小为10
  21. app.MapGet("/set/{id}", (IMemoryCache memoryCache, string id) =>
  22. {
  23. var time = memoryCache.Set<string>(id, $"{id}、 {DateTime.Now}", new MemoryCacheEntryOptions
  24. {
  25. Size = 10
  26. });
  27. return $"设置的时间为:{time}";
  28. });
  29. app.Run();

SizeLimit=40为总缓存容量,Size=10为这次缓存占有容量,如果每次都是10的话,那就是最多可以生成4个,这里有个问题,也可能是个bug,当添加第5个的时候,第5个不会成功,但会把第1个删除(这里是删除最久没有被访问的),这时,只有3个有效的缓存,再次添加第5个才能生效。

在设置缓存时,可以设置SlidingExpiration和

AbsoluteExpirationRelativeToNow,它们的用法见如下用法:

  1. var time = memoryCache.Set<string>(id, $"{id}、 {DateTime.Now}", new MemoryCacheEntryOptions
  2. {
  3. //3秒内不访问过期
  4. SlidingExpiration = TimeSpan.FromSeconds(3),
  5. //间隔少于3秒内一直有访问,则30秒过期
  6. AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30),
  7. });

当多副本部署时,基于内存缓存就不合适了,现在主流的一般是用redis这样的nosql数据库来快速缓存数据,本例就以redis为例,我是在本地docker中安装的redis,用命令: docker run --name some-redis -d -p 6379:6379 redis启动,appsettings.json中的配置如下:

  1. "ConnectionStrings": {
  2. "MyRedisConStr": "127.0.0.1:6379"
  3. }

具体实现代码也很简单:

  1. using Microsoft.Extensions.Caching.Distributed;
  2. using Microsoft.Extensions.Caching.Memory;
  3. using Microsoft.Extensions.Internal;
  4. var builder = WebApplication.CreateBuilder(args);
  5. builder.Services.AddStackExchangeRedisCache(options =>
  6. {
  7. options.Configuration = builder.Configuration.GetConnectionString("MyRedisConStr");
  8. options.InstanceName = "DistributedRedis_";
  9. });
  10. var app = builder.Build();
  11. app.MapGet("/disget/{id}", async (IDistributedCache distributedCache, string id) =>
  12. {
  13. var result = await distributedCache.GetStringAsync(id);
  14. return $"获取成功:{result}";
  15. });
  16. app.MapGet("/disset/{id}", async (IDistributedCache distributedCache, string id) =>
  17. {
  18. var time = $"{id}、 {DateTime.Now}";
  19. await distributedCache.SetStringAsync(id, time, new DistributedCacheEntryOptions
  20. {
  21. SlidingExpiration = TimeSpan.FromSeconds(5),
  22. AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30)
  23. });
  24. return $"设置的时间为:{time}";
  25. });
  26. app.Run();

缓存的用法很简单,这里要注意的是什么数据更适合缓存,缓存多长时间,如果缓存失效,穿透会给系统带来什么样的压力等这样周边的问题需要处理好。

全部.NET6之MiniAPI-PDF版本下载地址 https://club.51aspx.com/circle/10569.html

.NET

.NET6之Mini API【十六、数据保护】

2022-7-5 15:17:59

.NET

.NET6之Mini API【十八、OpenAPI swagger】

2022-7-6 11:46:35

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
今日签到
私信列表
搜索