前言:
最近一段時間,開始了《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:請保存系統有足夠的緩存。