zoukankan      html  css  js  c++  java
  • Cache中间件和缓存降级

    Cache中间件和缓存降级

    1、前言

    surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身份验证,限流降级等功能完成时间会往后推

    最近也更新了surging新的版本

    更新内容:

    1. Cache中间件基于Redis 所依赖的第三方库已将servicestack.redis转成stackexchange 
    2. 增加缓存降级
    3. 增加拦截缓存降级的例子

    开源地址:https://github.com/dotnetcore/surging

    2.软件环境

    IDE:Visual Studio 2017 15.3 Preview ,vscode
    框架:.NET core 2.0

    vscode 技术支持:

    3、Cache中间件的使用

      在剥析surging的架构思想这篇文章中大致提了下Cache中间件,大家也对Cache中间件有了初步印象,这一节我们将谈谈怎么使用Cache中间件

    1.创建配置文件

    cacheSettings.json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    {
        "CachingSettings": [
          {
            "Id""ddlCache",
            "Class""Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching",
            "Properties": [
              {
                "Name""appRuleFile",
                "Ref""rule"
              },
              {
                "Name""dataContextPool",
                "Ref""ddls_sample",
                "Maps": [
                  {
                    "Name""Redis",
                    "Properties": [
                      {
                        "value""127.0.0.1:6379::1"
                      }
                    ]
                  },
                  {
                    "Name""MemoryCache"
                  }
                ]
              },
              {
                "Name""defaultExpireTime",
                "value""120"
              },
              {
                "Name""connectTimeout",
                "Value""120"
              },
              {
                "Name""minSize",
                "Value""1"
              },
              {
                "Name""maxSize",
                "Value""10"
              }
            ]
          }
        ]
    }

    可以支持多个实例配置通过配置id来标识唯一,并且通过配置Maps,来初始化服务节点列表,通过哈希一致性来选择服务节点

    配置参数列表

    参数
    作用

    CachingSettings

    包含多个实例的父级配置节

    Id

    唯一标识

    Class

    对于Context的适配
    Properties Cache 相关配置节

    Maps

    配置服务节列表

    minSize

    对象池最小数

    maxSize

    objectpool最大数

    2.代码配置

     

    复制代码
            /// <summary>
            /// 配置缓存服务
            /// </summary>
            public static void ConfigureCache(IConfigurationBuilder build)
            {
                build
                  .AddCacheFile("cacheSettings.json", optional: false);
            }   
    复制代码

    以上我们就完成了缓存中间件配置,接下来就可以通过以下代码进行调用

    基于redis的缓存调用

    1
    cacheProvider = CacheContainer.GetInstances<ICacheProvider>(“ddlCache.Redis”);

     基于MemoryCache的缓存调用

    CacheContainer.GetInstances<ICacheProvider>("MemoryCache")

    4、缓存降级

    对于服务所返回的数据,有些是不需要经常修改,可以通过缓存返回数据,比如商品应用,商品分类,商品列表、用户信息,订单信息,购物车等,通过以上需求我们就要对于proxy进行拦截,返回缓存或者删除缓存。

    对于缓存会有以下疑问

    1. 数据一致性:对于服务是分布式部署在各台服务器上, 缓存存储读取也应该支持分布式,所以应该选择支持分布式的缓存框架,如:redis,couchbase,membercache
    2. 缓存命中率:在无命中的情况下,无法直接通过缓存获取到想要的数据,而直接通过调用远程服务获取数据,这样就会增加响应时间和影响吞吐量,所以我们必须引用工具进行监控

    缓存降级

     surging的缓存降级就是针对于proxy进行拦截,如果有缓存数据,则返回缓存数据,否则调用Proceed方法调用远程服务。

     在数据进行update,delete的时候就需要针对于依赖的缓存进行删除,可以通过proxy进行拦截的方式把缓存进行删除

     缓存降级有以下优点

    1.高性能:可以减少响应时间和提高吞吐量

    2.高效:针对于业务逻辑的设计,无需考虑缓存,做到了无缝集成

    以下通过示例来介绍如何使用

    在业务接口方法上添加如下特性

    [Command(Strategy= StrategyType.Failover,FailoverCluster =3,RequestCacheEnabled =true)]  //RequestCacheEnabled =true 就是启用缓存

    拦截获取缓存

     [InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", Mode = CacheTargetType.Redis, Time = 480)]

    拦截删除缓存

    [InterceptMethod(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", Mode = CacheTargetType.Redis)]

    应用[CacheKey]来标识缓存Key,如

    复制代码
        public class UserModel
        {
    
            [CacheKey(1)]
            public int UserId { get; set; }
    
            public string Name { get; set; }
    
            public int Age { get; set; }
        }
    复制代码

    配置拦截器

    .AddClientIntercepted(typeof(CacheProviderInterceptor))

    5.测试

    测试环境

    CPU:Intel Core i7-4710MQ

    内存:16G

    硬盘:1T SSD+512G HDD

    网络:局域网

    开启redis测试结果如下:
    停用Redis测试结果如下:
     

    6、总结

    已经开始研发API网关,近期更新只会修复BUG和提交单元测试。如感兴趣请多关注或者加入QQ群:615562965

  • 相关阅读:
    BZOJ1054|HAOI2008移动玩具|广搜
    tarjan算法
    BJOJ2190|SDOI仪仗队|数论
    POJ2975|Nim|博弈论
    POJ1740|A NEW STONE GAME|博弈论
    python 单例模式
    linux 根据服务名称批量杀死进程
    python 任务计划
    python偏函数
    安装scrapy框架
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/7269822.html
Copyright © 2011-2022 走看看