正文html
在上一節講了如何使用內存緩存,經過Linq.Expressions,能夠方便查找數據,不過這有個缺點,僅限當前應用程序緩存
若是想在其它服務器上使用緩存,那就能夠選用MemberCache,Redis之類的提供分佈式緩存服務了,不過和直接內存查找相比,無法自定義查找服務器
由於他們數據結構是K/V形式,只能按Key查找數據,若是我想在分佈式服務器上實現自定義內存查找,那麼此方案來了(好像和OData同樣)數據結構
以前寫過一篇,再整理一次 緩存服務新思路,建立動態查詢的緩存框架
爲了傳輸查找命令,有了此結構分佈式
實現分佈式服務器配置ide
總體結構大體如此,CRL內部做了簡單實現post
服務端須要配置能查詢哪些緩存類型,所以在應用程序啓動大數據
服務端能夠自定義通信方式,須要自已實現,來個TCP的,比HTTP快不少spa
//增長處理規則,能夠添加多個 CRL.CacheServerSetting.AddCacheServerDealDataRule(typeof(Code.ProductData), Code.ProductDataManage.Instance.DeaCacheCommand); //啓動服務端 var cacheServer = new CRL.CacheServer.TcpServer(1136); cacheServer.Start();
服務端能夠添加多種對象類型,返回數據方法爲DeaCacheCommand,由CRL自動實現
服務端啓動一個TCP監聽,客戶端由此端口號通訊
客戶端須要添加服務端組,以獲取分佈在不一樣服務器上的數據
//有多個服務器添加多個 /要使用緩存服務,須要設置ProductDataManage.QueryCacheFromRemote 爲 true CRL.CacheServerSetting.AddTcpServerListen("127.0.0.1", 1136); CRL.CacheServerSetting.Init();
同時設置當前管理類QueryCacheFromRemote爲true
目的是告訴本地調用,今後查詢緩存由遠端處理
public class ProductDataManage : CRL.BaseProvider<ProductData> ... protected override bool QueryCacheFromRemote { get { return true; } }
和本地緩存調用同樣,直接寫就好了
var item = Code.ProductDataManage.Instance.QueryItemFromCache(b => b.Id > 0 && b.ProductName.Contains("product"));
由於在服務端配置過能處理哪些數據,在客戶端啓動時會獲得一份列表,而後各類類型的數據上各服務端查找
調試看數據:
服務端收到的命令
反解析爲表達式
客戶端收到的數據
反序列化爲對象
到此整個流程就走完了,分佈式緩存調用和本地調用沒什麼差異,簡單方便