本篇介紹如何使用緩存,包括MemeryCache和Redis。 ...
系列目錄
本系列涉及到的源碼下載地址: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的內容大致如下:
{ "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 可以查看存儲情況