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进行拦截,返回缓存或者删除缓存。
对于缓存会有以下疑问
- 数据一致性:对于服务是分布式部署在各台服务器上, 缓存存储读取也应该支持分布式,所以应该选择支持分布式的缓存框架,如:redis,couchbase,membercache
- 缓存命中率:在无命中的情况下,无法直接通过缓存获取到想要的数据,而直接通过调用远程服务获取数据,这样就会增加响应时间和影响吞吐量,所以我们必须引用工具进行监控
缓存降级
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
网络:局域网


6、总结
已经开始研发API网关,近期更新只会修复BUG和提交单元测试。如感兴趣请多关注或者加入QQ群:615562965
Cache中间件和缓存降级的更多相关文章
- 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
- Django之中间件&信号&缓存&form上传
中间件 1.中间件是什么? 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用, ...
- bloom-server 基于 rust 编写的 rest api cache 中间件
bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...
- django之中间件、缓存、信号、admin内置后台
目录: 中间件 缓存 信号 admin后台 一.中间件 1.什么是中间件? 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的 ...
- 【python】-- Django 中间件、缓存、信号
Django 中间件.缓存.信号 一. Django 中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...
- Django 补充models操作,中间件, 缓存,信号,分页
1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ...
- Django之中间件、缓存以及信号
Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...
随机推荐
- Linux_异常_01_CentOS7无法ping 百度
一.原因 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no B ...
- LNMP安装(二)
PHP安装 1.yum安装一些依赖库 yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel ...
- codeforces 658B B. Bear and Displayed Friends(优先队列)
题目链接: B. Bear and Displayed Friends time limit per test 2 seconds memory limit per test 256 megabyte ...
- HTml js 生成图片
<script type="text/javascript"> function $(id) { return document.getElementById(id); ...
- 作业2nd
1. 国内: 雷军作为中国互联网代表人物及环球年度电子商务创新首领人物,曾获中国经济年度人物及十大财智首领人物.中国互联网年度人物等多项国表里荣誉,并当选<福布斯>(亚洲版)2014年度贸 ...
- 谈"零缺陷"
在刚参加工作初期的一次关于质量的培训中,第一次听到"零缺陷"这个词懵懵懂懂,当成一道概念题给记下.今年重读<质量免费>时对与零缺陷的部分始终心存疑虑,最近读<第一 ...
- bzoj 4515: 游戏 树链剖分+线段树
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4515 题解: 先让我%一发lych大佬点我去看dalao的题解 讲的很详细. 这里纠正一 ...
- Chrome检查更新总失败?安装细则讲解
现在 Google Chrome 的稳定版都已经发布 68.0 版本了,我机上还是 54, 本想在线更新一下,结果点击菜单项中的“关于 Google Chrome”后,进入的界面提示“更新失败(错误: ...
- poj2411铺砖——状压DP
题目:http://poj.org/problem?id=2411 状态压缩,一行的状态记为一个二进制数,从上往下逐行DP,答案输出最后一行填0的方案数. 代码如下: #include<iost ...
- Python操作MySQL数据库9个实用实例
用python连接mysql的时候,需要用的安装版本,源码版本容易有错误提示.下边是打包了32与64版本. MySQL-python-1.2.3.win32-py2.7.exe MySQL-pytho ...