按部就班學.Net Core Web Api開發系列【12】:緩存

系列目錄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 能夠查看存儲狀況

相關文章
相關標籤/搜索