系列目錄html
按部就班學.Net Core Web Api開發系列目錄git
本系列涉及到的源碼下載地址:https://github.com/seabluescn/Blog_WebApigithub
1、概述redis
本篇介紹如何使用緩存,包括MemeryCache和Redis。數據庫
2、MemeryCachejson
一、註冊緩存服務api
public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); }
貌似較新的版本是默認已經註冊緩存服務的,以上代碼能夠省略,不過加一下也沒有問題。緩存
二、在Controller中注入依賴app
public class ArticleController : Controller { private readonly IMemoryCache _cache; public ArticleController(SalesContext context, ILogger<ArticleController> logger, IMemoryCache memoryCache) { _cache = memoryCache; } }
三、基本使用方法分佈式
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)若是取到就直接返回數據。
四、緩存的過時
絕對過時:設定時間一到就過時。適合要按期更新的場景,好比組織機構信息數據。
_cache.Set("GetAllArticles", articles, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(20)));
相對過時:距離最後一次使用(TryGetValue)後指定時間後過時,好比用戶登錄信息。
_cache.Set("GetAllArticles", articles, new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(20)));
3、分佈式緩存Redis的使用
一、緩存服務註冊
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會增長這個前綴。
二、在Controller中引入依賴
[Produces("application/json")] [Route("api/Article")] public class ArticleController : Controller { private readonly IDistributedCache _distributedCache; public ArticleController(IDistributedCache distributedCache) { _distributedCache = distributedCache; } }
三、基本使用
[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; } }
四、存儲對象
因爲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; } }
五、緩存的過時
絕對過時:
_distributedCache.SetString(tockenid, "hello,0601",new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(10)));
相對過時:
_distributedCache.SetString(tockenid, "hello,0601",new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(10)));
六、客戶端工具
採用Redis Desktop Manager 能夠查看存儲狀況