循序漸進學.Net Core Web Api開發系列【12】:緩存


系列目錄

循序漸進學.Net Core Web Api開發系列目錄

 本系列涉及到的源碼下載地址: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 可以查看存儲情況

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM