zoukankan      html  css  js  c++  java
  • 循序渐进学.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 可以查看存储情况

  • 相关阅读:
    移动布局---1. 移动端布局基础
    1. CSS新特性之选择器
    1. H5新增语义化标签
    POJ 3281
    poj 1986
    POJ 3728
    poj 2763
    poj 2749
    uva 11294
    LA 3713
  • 原文地址:https://www.cnblogs.com/seabluescn/p/9329761.html
Copyright © 2011-2022 走看看