手机端缓存的目的有:

。对于公共基础数据(如编码),避免经常性从服务器下载对资源和性能的影响


。支持离线操作:在与服务器断开的情况下,进行本地操作,数据保存在本地磁盘上,在连通后再提交



对于第1种情况,这些数据保存在磁盘上,程序启动时或者需要时加载。缓存数据的更新通过数据版本检查判定。为了简化处理,缓存数据的更新采用全量更新方式。


每种数据数据量都很小(几十K范围),需要一次性加载到内存中。这些数据用二维表表示。


此类数据很少变动.



对于第2种情况,缓存的单元为一个数据对象(如一份采集数据),通过一个目录表管理所有离线操作生成的数据。目录表结构:(应用ID,数据类型,数据文件名)。



理想的缓存机制应具有以下特性:


。可随时增加需要缓存的数据类型,而不需要编写额外的代码


。可在运行时配置:




缓存数据的性质:


.(1)与应用有关(所有用户共享),(2)与机构有关(同一机构的用户共享),(3)与用户有关(用户私有)


.数据格式


.存储:不同的数据分别存储在对应的目录下,目录结构如下;


cache(缓存主目录)


---global: 与应用相关数据


---share: 与机构相关数据


---private:与用户相关数据(每用户一个目录,用户目录下index.dat为离线操作的文件目录,data子目录保存离线操作文件)




每份数据一个单独的文件.


存储文件命名:数据类型_关联者.dat.


对于(1),可能的文件名为"1.data";


对于(2),可能的文件名为"1_10068.dat";


对于(3),可能的文件名为"1_10068_100681001.data"


.缓存只保存最新的版本



   


缓存数据类型:每种数据类型有对应的缓存方式,0-不缓存.1-应用域 2-机构域 3-用户域


数据类型定义描述,

struct data_type_t { 

    short id_; 

    string name_; 

    unsigned long prop_; /// bit0-1:缓存方式 

 };




以加载任务类别为例.


函数int LoadTaskType(CQQ_ORGID orgid,vector<CTaskType*> &v)用来加载指定机构所有的任务类别.



。非缓存方式:


请求服务器



。缓存方式:


检查本地是否有缓存的任务类别编码信息:


请求服务器检查版本:本地是否是最新的码表(此操作在程序启动后仅做一次)


如版本更新,下载并保存在本地


从本地缓存数据加载:多数情况如此.




适用所有数据类型,不同性质的缓存数据的抽象方法如下:


int LoadData(unsigned short data_type,CMemTable &data,...);


data_type:指定数据类型,每种数据的缓存方式由配置决定


data:加载的数据


可变参数与缓存数据的性质有关,可能是机构ID,用户编号.



int LoadData(unsigned short data_type,CMemTable &data,...) {


  ///< 检查data_type数据类型是否需要缓存


 


  ///< 请求服务器检查版本


 


  ///< 下载并保存缓存数据


 


  ///< 从缓存的数据中加载数据到data


 


  return 0;


}



***缓存的数据存储:可以考虑采用sqlite。



需要增加协议和数据库表:


(码表)数据版本检查协议:


  。数据类型:需要检查版本的数据类型


  。一次可检查多种数据的版本


(码表)数据版本信息:


  码表数据可能存储在数据库表中,也可能存在文件中。