Windows平台下Web缓存的一种实现方法

1. 应用场景

        我们很多基于浏览器的应用,需要定时刷新监控界面,将最新的数据展示出来,比如车辆定位应用系统,数量众多的物联网应用系统等等,都需要实时展示智能感知设备上报的数据,众多的App应用也需要接收推送信息或者主动请求数据。这些数据我们无疑需要缓存在后台内存,还有数量众多的基础数据,例如关系数据,用户数据,以及用户根据需求定义的各种数据表,这些数据都需要缓存到内存,以加快访问速度。

2. 现成的开源缓存问题

        开源的缓存有很多,memcache,redis,mongodb等等,这些开源缓存本身有他自己的应用场景,或者是应用方法不对,往往不能发挥其本身应用的性能,但往往又夸大它们的性能。经过实测,memcache存储简单数据在查询时效率比较高,但是不能定制化,数据大一点性能下降厉害,用于实时更新性能急剧下降,比起读取性能下降好几陪,并发量一大甚至出现cpu居高不下,而且在Windows平台下不太稳定,有时候假死,卡在那里不动。Redis性能和其差不太多。Mongodb同样查询性能非常高,但是写入性能成几倍的下降,不能达到每秒更新几千次甚至上万次这样的频率。而我们的数据,往往有我们定义的相对复杂的数据结构,需要对这些数据结构进行逻辑操作,比如计算用户下面的设备在线数,最新上报数据等,并将其返回浏览器,返回App客户端。这样的应用,显然上面这些缓存都不太适合,我们需要采用别的方法处理。

3. 可行的性能相对高的方法

        我们可行的方法应该不只两种,最高效的方法当然就是自己写缓存,按照自己的方法定义数据结构,自己组织缓存,将数据逻辑处理好放在缓存,前端Web和App直接获取现成数据,这样速度快,但是需要自己实现socket的管理,断连和重连,以及数据推送等等一系列比较复杂的问题,对开发人员技能要求比较高,需且还不一定能处理好。 另一种方法就是借助.net remoting的个rpc来实现对缓存的调用。这里采用remoting这种方法比较简单可行,效率也比较高。

4. 具体实现

        一般设计成这几个模块,Web应用为一层,App应用从Web服务接口获取数据, 缓存为一层,这里我们命名为WebCache,数据库访问为一层,通讯服务为一层。这里的核心为WebCache,由于这里的WebCache需要启动多个线程来处理业务逻辑,RPC这个线程不像一般服务那样可以从自身启动,必须要调用方启动,这里就写一个服务来专门负责这件事,服务启动时用RPC方法调用WebCache把线程启动起来,通讯用服务收到数据直接转发到WebCache。结构如图:

WebCache将所有常用数据放在缓存,将所有运算结果存放在缓缓存,将有变化的常用数据更新缓存,客户端只存现成的数据,这样效率将大大提高。同时,网络通讯将实时数据通过socket直接转发到缓存,同时将数据入库。这样数据库的连接访问可控,同时屏蔽掉了IIS直接来访问数据库造成的混乱。按照.net remoting规范,缓存必须派生于MarshalByRefObject,同时为了保证.net remoting永久不超时,需要重写InitializeLifetimeService方法。几处关键地方:

(1)声明地方

   public class WebCache : MarshalByRefObject

(2)重写方法InitializeLifetimeService,表示永不超时

    public override Object InitializeLifetimeService()

    {

       return null;

    }

(3)注册

   public void RegSrv()

  {

            //register a tcp channel

            TcpServerChannel tcl = new TcpServerChannel(8080);

            ChannelServices.RegisterChannel(tcl, false);

            //register communication interface

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(WebCache), "WebCache",           WellKnownObjectMode.Singleton);

  }

(4) 取消注册

     public void UnRegSrv()

     {

       //TcpServerChannel tcl = new TcpServerChannel(50001);

      ChannelServices.UnregisterChannel(tcl);

     }

其它地方按照remoting的调用方法调用即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值