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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM