当前位置: 移动技术网 > IT编程>开发语言>.net > 循序渐进学.Net Core Web Api开发系列【12】:缓存

循序渐进学.Net Core Web Api开发系列【12】:缓存

2018年07月18日  | 移动技术网IT编程  | 我要评论

原油价格投资分析师荣轩点金,法证先锋第一部 国语,油价第五次上涨

系列目录

 本系列涉及到的源码下载地址:

 

一、概述

本篇介绍如何使用缓存,包括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 可以查看存储情况

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网