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 技术支持:

周松柏(zsbfre)

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

Cache中间件和缓存降级的更多相关文章

  1. 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

    1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...

  2. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  3. Django之中间件&信号&缓存&form上传

    中间件 1.中间件是什么? 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用, ...

  4. bloom-server 基于 rust 编写的 rest api cache 中间件

    bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...

  5. django之中间件、缓存、信号、admin内置后台

    目录: 中间件 缓存 信号 admin后台 一.中间件 1.什么是中间件? 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的 ...

  6. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  7. Django 补充models操作,中间件, 缓存,信号,分页

    1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ...

  8. Django之中间件、缓存以及信号

    Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...

  9. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

随机推荐

  1. HihoCoder1654: XY游戏([Offer收割]编程练习赛39)(好久没写搜索)(已经超级简短了)

    描述 如下图所示,在4x4的棋盘上有X和Y两种棋子各若干枚:O表示空格. OXXY YOOX XOOY XOXX 小Hi每次可以选择任意一枚棋子,将它移动到上下左右相邻的空格中. 小Hi想知道最少移动 ...

  2. final修饰变量

    final修饰基本类型变量 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变 final修饰引用类型变量 当使用final修饰引用类型变量时,它保存的仅仅是一 ...

  3. Oracle中的float类型字段

    Oracle中的float类型对应着C#中的decimal类型

  4. eclipse 上svn插件的安装,百度知道

    打开eclipse -> Help ->Install New Software选项, 点击Add按钮   根据需要,添加自己需要的版本svn控制器的版本,填写name和url,点击ok. ...

  5. 开发商应用被App Store拒绝的79个原因

    转自:http://www.gamelook.com.cn/2014/10/186017 作为iOS开发者,估计有很多都遇到过APP提交到App Store被拒,然后这些被拒的原因多种多样,今天小编收 ...

  6. Docker入门(一):简介

    这个<Docker入门>系列文档,是我根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家 ...

  7. NancyFX 第二章 Rest框架

    正如你看到的,Nancy有两个主要用途. 其中第一项是作为一种通用的基于 REST 框架,可替代 ASP.NET Web API 或其他Rest工具包. 默认情况下,Nancy提供一流的路由和内容协商 ...

  8. 02_mysql卸载和安装

    如果只是随便地反安装/uninstall之后,在文件系统或者是注册表里面可能会残留一些东西,这些东西如果不及时清除掉,再装可能会出现问题,你新装的会用不了. #Path to installation ...

  9. [hdu4812]D Tree(点分治)

    题意:问有多少条路径,符合路径上所有节点的权值乘积模1000003等于k. 解题关键:预处理阶乘逆元,然后通过hash和树形dp$O(1)$的判定乘积存在问题,注意此道题是如何处理路径保证不重复的,具 ...

  10. iview组件select之默认展示label,并传空value做方法入参

    要求: 默认查询操作日期在当日的数据:(打开页面时默认选中时间.全部) 后台约定:选定“全部”这个条件,传的值是空"" 综上:使用select选择框的v-model绑定数据,使用: ...