CYQ.Data V5 分佈式自動化緩存設計介紹(二)

前言:


最近一段時間,開始了《IT連》創業,所以精力和寫的文章多數是在分享創業的過程。

而關於本人三大框架CYQ.Data、Aries、Taurus.MVC的相關文章,基本都很少寫了。

但框架的維護升級,還是時不時的在進行中的,這點從開源的Github上的代碼提交時間上就可以看出來了。

畢竟《IT連》的後臺WebAPI,用的是Taurus.MVC,後臺系統管理用的是Aries。

不過今天,就不寫創業相關的文章了,先分享篇技術類的文章。


CYQ.Data 分佈式自動緩存


之前寫過一篇:CYQ.Data V5 分佈式自動化緩存設計介紹

在上一篇裏,基本情況和思路,已經介紹的很清楚,這裏就簡單補充2點:


1:自動緩存默認是開啓狀態的,相關控制和配置如下:


需要全局關閉時:

可以在應用程序啓動時的入口用代碼:

AppConfig.Cache.IsAutoCache=false;

或者app.config、web.config配置:

<appSettings>
    <add key="IsAutoCache" value="false"/>
</appSettings>

需要代碼局部關閉時:

using (MAction action = new MAction("表名"))
{
     action.SetAopState(CYQ.Data.Aop.AopOp.OnlyOuter);//關閉自動緩存並保留Aop
}

用代碼控制清除表緩存時:

string key= CacheManage.GetKey(CacheKeyType.AutoCache, "表名");
CacheManage.Instance.Remove(key);

其它控制的配置項:

            /// <summary>
            /// AutoCache開啓時,可以設置不緩存的Table,多個用逗號分隔
            /// </summary>
            public static string NoCacheTables
            {
                get
                {
                    return GetApp("NoCacheTables", "");
                }
                set
                {
                    SetApp("NoCacheTables", value);
                    CYQ.Data.Cache.AutoCache.NoCacheTables = null;
                }
            }

            /// <summary>
            /// AutoCache開啓時,可以設置不受更新影響的列名,用Json格式。
            /// {talbeName1:'column1,column2',talbeName2:'column1,column2'}
            /// </summary>
            public static string IngoreCacheColumns
            {
                get
                {
                    return GetApp("IngoreCacheColumns", "");
                }
                set
                {
                    SetApp("IngoreCacheColumns", value);
                    CYQ.Data.Cache.AutoCache.IngoreCacheColumns = null;
                }
            }


2:分佈式應用時的緩存控制


對於單一應用程序,框架已經處理的很好。

而對於多個應用程序,框架提供的方案是通過配置啓用分佈式緩存MemCache或Redis。

相關的配置如下(AppConfig下的都可以對應web.config下的AppSettings項):

            /// <summary>
            /// MemCache分佈式緩存的服務器配置,多個用逗號(,)分隔
            /// </summary>
            public static string MemCacheServers
            {
                get
                {
                    return GetApp("MemCacheServers", string.Empty);
                }
                set
                {
                    SetApp("MemCacheServers", value);
                }
            }

            /// <summary>
            /// MemCache 備份服務器(當主服務器掛了後,請求會轉向備用機)
            /// </summary>
            public static string MemCacheServersBak
            {
                get
                {
                    return GetApp("MemCacheServersBak", string.Empty);
                }
                set
                {
                    SetApp("MemCacheServersBak", value);
                }
            }

            /// <summary>
            /// Redis分佈式緩存的服務器配置,多個用逗號(,)分隔
            /// </summary>
            public static string RedisServers
            {
                get
                {
                    return GetApp("RedisServers", string.Empty);
                }
                set
                {
                    SetApp("RedisServers", value);
                }
            }
            /// <summary>
            /// Redis 使用的DB數(默認1,使用db0)
            /// </summary>
            public static int RedisUseDBCount
            {
                get
                {
                    return GetAppInt("RedisUseDBCount", 1);
                }
                set
                {
                    SetApp("RedisUseDBCount", value.ToString());
                }
            }
            /// <summary>
            /// Redis 使用的DB 索引(默認0,若配置,則會忽略RedisUseDBCount)
            /// </summary>
            public static int RedisUseDBIndex
            {
                get
                {
                    return GetAppInt("RedisUseDBIndex", 0);
                }
                set
                {
                    SetApp("RedisUseDBIndex", value.ToString());
                }
            }
            /// <summary>
            /// Redis  備份服務器(當主服務器掛了後,請求會轉向備用機)
            /// </summary>
            public static string RedisServersBak
            {
                get
                {
                    return GetApp("RedisServersBak", string.Empty);
                }
                set
                {
                    SetApp("RedisServersBak", value);
                }
            }


分佈式下緩存的失效策略升級


在多個應用程序時,分佈式緩存可以集中控制,固然是一種方案。

但對於單一的服務器來說,開始思考有沒有更簡單的方案,可以不裝MemCache或Redis。

比如《IT連》創業項目的webapi和aries後臺是兩套程序,同一個服務器下共同操作一個數據庫,各自有自動緩存的情況下。

經過思考,最後選擇了通過定時掃描表來處理。


方案原理:


每個應用程序,只要配置好數據庫鏈接(配置的數據庫可以是任意的):

            /// <summary>
            /// CYQ.Data.Cache 自動緩存 - 數據庫鏈接配置
            /// 在多個不同的應用項目裏操作同一個數據庫時(又不想使用分佈式緩存MemCache或Redis),可以開啓此項,達到緩存智能清除的效果。
            /// </summary>
            public static string AutoCacheConn
            {
                get
                {
                    if (_AutoCacheConn == null)
                    {
                        _AutoCacheConn = AppConfig.GetConn("AutoCacheConn");
                    }
                    return _AutoCacheConn;
                }
                set
                {
                    _AutoCacheConn = value;
                }
            }        


接着框架會自動創建一個SysAutoCache表,包含CacheKey和CacheTime兩列:


接着框架會有定時掃描,來處理:

 public static void AutoCacheKeyTask(object threadID)
        {
           
            while (true)//定時掃描數據庫
            {
                int time = AppConfig.Cache.AutoCacheTaskTime;
                if (time <= 0)
                {
                    time = 1000;
                }
                Thread.Sleep(time);
                if (removeListForKeyTask.Count > 0)
                {
                    string baseKey = removeListForKeyTask.Dequeue();
                    if (!string.IsNullOrEmpty(baseKey))
                    {
                        KeyTable.SetKey(baseKey);
                    }
                }
                if (KeyTable.HasAutoCacheTable) //讀取看有沒有需要移除的鍵。
                {
                    KeyTable.ReadAndRemoveKey();
                }
            }
        }


默認是1秒掃一次,你也可以自己配置掃描的間隔時間:

            /// <summary>
            /// 當AutoCacheConn開啓後,定時掃描數據庫的任務時間(毫秒),默認1000
            /// </summary>
            public static int AutoCacheTaskTime
            {
                get
                {
                    return GetAppInt("AutoCacheTaskTime", 1000);
                }
                set
                {
                    SetApp("AutoCacheTaskTime", value.ToString());
                }

            }


總結:


對於本次升級來了兩個好處:

1:多應用下更簡單了,多了一種可選方案。

2:對於喜歡手動修改數據庫數據的,或對於框架無法監控的存儲過程代碼,也可以手工或存儲過程中更新SysAutoCache表的時間,以便於通知框架更新緩存。


整體而言:

1:自動緩存能將你的應用程序提升一個質量的飛躍。

2:自動在一些大型的項目裏,應該用的更精緻一些,配置好哪些表不需要緩存,哪些列的更新不影響緩存。

3:請保存系統有足夠的緩存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章