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

周松柏(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

时间: 2024-08-03 07:57:55

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

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

1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身份验证,限流降级等功能完成时间会往后推 最近也更新了surging新的版本 更新内容: 1. Cache中间件基于Redis 所依赖的第三方库已将servicestack.redis转成stackexchange 2. 增加缓存降级3. 增加拦截缓存降级的例子 开源地址:https://github

[.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

[.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率. 本节将介绍如何利用缓存写出高效率的代码. 1. 什么是缓存(Cache)? 缓存(Cache)是一种用空间换取时间的技术 存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取. 比如CPU二级缓存.内存.windows文件读取缓存. 2. .NE

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

[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种.NET中特别重要的缓布技术Cache.利用Cache提升程序性能. 1. 缓存Cache的命名空间 .NET中对缓存有两个命名空间 命名空间1:System.Web.Caching 命名空间2:System.Runtime.Caching 引用范围:这两个命名空间,都可以在Web和非WEB应用程序中

Nginx content cache Nginx内容缓存

原文地址:http://nginx.com/resources/admin-guide/caching/ Nginx content cache Nginx内容缓存 This chapter describes how to enable and configure caching responses received from proxied servers. When caching is enabled NGINX saves responses in the cache on the d

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

Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件: MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', '

Redis系列十:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

一.缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 缓存正常从Redis中获取,示意图如下: 缓存失效瞬间示意图如下: 缓存雪崩的解决方案: (1)碰到这种情况,一般并发量不是特别多的时候,使用最多的解决方案是加锁排队,伪代码如下: 加锁排队只是为了

Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

Redis之缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级 1.缓存雪崩 发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机 解决办法: 1)随机均匀设置失效时间 2)设置过期标志更新缓存 3)并发量不是特别多的时候,使用最多的解决方案是加锁排队 2.缓存穿透 发生场景:是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并

redis缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

一.缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 缓存正常从Redis中获取,示意图如下: 缓存失效瞬间示意图如下: 缓存雪崩的解决方案: (1)碰到这种情况,一般并发量不是特别多的时候,使用最多的解决方案是加锁排队,伪代码如下: 加锁排队只是为了

Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 2.根据app对路由规则进行一次分类 rl(r'^web/',include('web.urls')), 1.每个路由规则对应