CRL快速开发框架系列教程六(分布式缓存解决方案)

时间:2023-03-08 16:18:57

本系列目录

  1. CRL快速开发框架系列教程一(Code First数据表不需再关心)
  2. CRL快速开发框架系列教程二(基于Lambda表达式查询)
  3. CRL快速开发框架系列教程三(更新数据)
  4. CRL快速开发框架系列教程四(删除数据)
  5. CRL快速开发框架系列教程五(使用缓存)
  6. CRL快速开发框架系列教程六(分布式缓存解决方案)
  7. CRL快速开发框架系列教程七(使用事务)
  8. CRL快速开发框架系列教程八(使用CRL.Package)
  9. CRL快速开发框架系列教程九(导入/导出数据)
  10. CRL快速开发框架系列教程十(导出对象结构)
  11. CRL快速开发框架系列教程十一(大数据分库分表解决方案)
  12. CRL快速开发框架系列教程十二(MongoDB支持)
  13. CRL快速开发框架系列教程十三(嵌套查询)

 正文

在上一节讲了如何使用内存缓存,通过Linq.Expressions,可以方便查找数据,不过这有个缺点,仅限当前应用程序

如果想在其它服务器上使用缓存,那就可以选用MemberCache,Redis之类的提供分布式缓存服务了,不过和直接内存查找相比,没法自定义查找

因为他们数据结构是K/V形式,只能按Key查找数据,如果我想在分布式服务器上实现自定义内存查找,那么此方案来了(好像和OData一样)

之前写过一篇,再整理一次 缓存服务新思路,创建动态查询的缓存

为了传输查找命令,有了此结构

CRL快速开发框架系列教程六(分布式缓存解决方案)

实现分布式服务器配置

CRL快速开发框架系列教程六(分布式缓存解决方案)

整体结构大致如此,CRL内部作了简单实现

配置服务端

服务端需要配置能查询哪些缓存类型,因此在应用程序启动

服务端可以自定义通讯方式,需要自已实现,来个TCP的,比HTTP快很多

//增加处理规则,可以添加多个
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"));

因为在服务端配置过能处理哪些数据,在客户端启动时会得到一份列表,然后各种类型的数据上各服务端查找

调试看数据:

服务端收到的命令

CRL快速开发框架系列教程六(分布式缓存解决方案)

反解析为表达式

CRL快速开发框架系列教程六(分布式缓存解决方案)

客户端收到的数据

CRL快速开发框架系列教程六(分布式缓存解决方案)

反序列化为对象

CRL快速开发框架系列教程六(分布式缓存解决方案)

到此整个流程就走完了,分布式缓存调用和本地调用没什么差别,简单方便