正文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"));
由于在服务端配置过能处理哪些数据,在客户端启动时会获得一份列表,而后各类类型的数据上各服务端查找
调试看数据:
服务端收到的命令
反解析为表达式
客户端收到的数据
反序列化为对象
到此整个流程就走完了,分布式缓存调用和本地调用没什么差异,简单方便