hotfox服务端缓存

1.简述
(场景,目的)
基于数据版本概念,客户端缓存解决了单个客户端的效率问题.
进一步提高效率,需要依赖服务端缓存,对于重复出现的请求,采用服务端缓存可以最大程度减少处理次数,节省了从请求到响应之间处理过程的一应开销。

缓存是基于确定的输入产生确定的输出的前提.
同一输入重复的次数越高,单个处理开销越大,则缓存越有价值。

所谓“同一输入”,是指处理过程所依赖的输入中的信息相同。
在不考虑分布式的情况下,UMX消息表示的输入符合以下条件时被认为是同一输入。
消息头中消息域,消息类型,消息ID,消息协议版本相同,而且消息体内容相同。

消息头中的命令字,端点地址信息等的差异不影响服务端的处理过程。

数据缓存的共享范围:全局共享,机构共享.
全局共享是指缓存的数据是对所有用户都相同的。
机构共享,如果是专用服务器则等同全局共享(这对零售商服务器性能有改善).

***目前不支持机构共享.(即没有实现按机构缓存)

2.实现
2.1数据缓存器
class HTX_DataCache :
public ACE_Hash_Map_Manager<ACE_CString,CDataCacheItem*,ACE_Thread_Mutex>,
public ACE_Event_Handler {
 bool has_timer_; ///< 是否启动了定时任务
 ACE_Hash_Map_Manager<ACE_CString,CDataCacheCfg*,ACE_Null_Mutex> cache_item_cfg_;

 CDataCacheCfg* find_cfg_item(unsigned long id); ///< 根据ID查找缓存配置
public:
 HTX_DataCache():has_timer_(false) {
 }
 ~HTX_DataCache();

 int add_cfg_item(CDataCacheCfg *dcc);
 int put(umxns::MSGTYPE msgtype,umxns::MSGID msgid,unsigned long domain,vector<CWrappedMsg<>*> &out); ///< 加入缓存
 ///< 获取缓存项
 ///< @return -1:无此缓存项 0:有此缓存项
 int get(umxns::MSGTYPE msgtype,umxns::MSGID msgid,unsigned long domain,vector<CWrappedMsg<>*> &out,vector<ACE_Message_Block*> &vmb);
 int handle_timeout(const ACE_Time_Value &tv,const void *arg); ///< 定时失效处理
 int invalid(umxns::MSGTYPE msgtype,umxns::MSGID msgid,unsigned long domain); ///< 使缓存失效
 int invalid(unsigned long id); ///< 使缓存失效

 bool enable_cache(MSGTYPE msgtype,MSGID msgid,unsigned long domain); ///< 是否支持缓存

 int activate();
 int deactivate();
};

2.2外部访问接口
与缓存有关的方法增加到hotfox的IManager接口:
class IManager {
 /// 使缓存失效(根据消息种类)
 virtual int InvalidCache(MSGTYPE msgtype,MSGID msgid,unsigned long domain) = 0;
 /// 使缓存失效(根据缓存数据类型)
 virtual int InvalidCache(unsigned long id) = 0;
};


2.3缓存利用
在消息处理时检查消息是否支持缓存.
如果支持缓存,则检查是否已缓存,如已缓存则直接返回缓存的消息.
如果没有缓存,则在处理完毕后,把处理结果消息进行缓存.

2.4缓存更新
有2种方式缓存缓存:
.定时失效
.通过IManager的接口:如DataVersion::UpdateDataVersion中调用mgr_->InvalidCache

3.使用限制
服务端缓存以本地服务器处理的客户端请求为主.
哪些协议可以配置为服务端缓存?
.与用户无关的协议
.与用户所属机构无关的访问全局共享信息的协议,或
.专有服务器上与机构有关但与用户无关的协议


其它限制:
.缓存的消息必须全部是返回给请求者的(如客户端)
.消息只能由一个插件处理


4.配置
在hotfox.conf的<config>节点下增加<cache>节点。
节点组成及说明如下:

<!-- 数据缓存 -->
<cache>
<!-- 缓存项-->
<item id="1"> <!--id:缓存项唯一编码 -->
<!--消息-->
<msg>
<domain>0</domain> <!-- 消息域 默认:0 -->
<type>5</type>
<id>561</id>
</msg>
<!--失效时间 0:表示永不过期 其它数值表示从缓存开始到失效的时间(秒),默认:0-->
<expire_time>30</expire_time>
</item>
</cache>


5.TODO
.实现基于字节缓冲区的缓存(HTX_DataCache的get方法的vmb参数为此准备),避免重复序列化消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值