相关概念 TDR(Tencent Data Representation)是腾讯推出的,进行游戏开发的基础组件,所有的组件都是基于TDR进行开发。DR数据表示组件以程序库、TDR工具的形式发布。TDR-API本质是相当于一套独立于数据结构的算法,常用API的功能涉及网络编解码、XML数据输入输出、数据可视化、对象关系映射、数据排序。TDR工具实现各种元数据格式之间的转换,并且可以根据XML格式的元数据描述生成C/C++数据结构定义头文件。TDR工具还能够生成实现指定功能的代码,目前支持生成C++\AS3\C#三种语言的代码,支持的功能包括网络编解码、XML数据输入输出、数据可视化。
协议描述与打解包 Tdr使用Xml来描述定义协议文件,可用tdr工具转换成对应的头文件和cpp文件。生成结构体,cmdID的定义和对应的打解包函数。生成之后的结构体和函数可以直接在程序中应用。Tdr支持生成C++\AS3\C#语言。因为游戏存在运营过程中动态更新,在实际的游戏协议应用中,最关注的是协议的兼容性问题,包括CS协议和SS协议的兼容性。Tdr通过版本号来进行协议兼容性的处理,新加字段需要增加对应的版本号,和整个tdr的版本号。Tdr打包的时候会打上对应的最大版本号和字段版本号。打包可以根据对方的版本号进行打包,解包的时候根据数据的版本号进行解包。支持高版本对低版本的兼容。
name="users" version="1" primarykey="user_id,username,role_id" splittablekey="user_id" desc="user table">
例如以上的协议中,后面几个字段都是新增字段,需要严格按照版本号递增,除了修改具体结构中的版本号之外,还需要修改整体的版本号。
这样tdr打包的数据中就有了具体的整体版本号信息和字段版本号信息。可以做到高版本兼容低版本,但是低版本无法兼容高版本。在实际的上线版本运营中,新增字段必须严格按照版本号升级,要注意具体新增字段和总版本号的同步更新。同时又存在cs协议和ss协议,所以新增字段的时候修改点比较多,检查版本号的步骤比较繁琐,需要人工保证。
文件结构 XML文件头
标准的XML文件头如下:
前期为了减少字符编码问题带来的影响,先使用GBK作为字符编码。长期来讲,应使用UTF-8作为字符编码,以支持多语言和可移植性。
目前暂时先使用:
metalib
一个XML文件只能有一个根元素(Root Element)。对于元数据描述用途的文档,根元素是metalib。表明该XML文件的内容是一个元数据描述集合。
示例 这是一个tdr建表的例子:
name="TestInfo" version="1" desc="" >
name="TableInfo" version="1" desc="" >
name="simple_struct" version="4">
name="struct_type" version="1">
name="table_list" version="1"primarykey="uin,name,key1" splittablekey="uin"customattr2="TableType=LIST;
ListNum=100;
DataProtocolType=PLAIN">
说明:
- 元素metalib是xml文件的根元素。
- 包含属性primarykey的struct元素定义一个表;否则,它只是一个普通的结构体。
- 每次修改表结构时,版本属性值需要相应地加1,初始版本始终为1。
- primarykey属性指定主键字段;对于generic表,您最多可以指定8个主键字段,对于list表,则可以指定7个。
- splittablekey属性等效于分片键(shard key),TcaplusDB表被拆分存储到多个存储节点。 splittablekey必须是主键字段之一,一个好的splittablekey应该具有高度分散性,这意味着值的范围很广,建议选用字符串类型。
- desc属性包含当前元素的描述。
- entry元素定义一个字段。支持的值类型包括int32,string,char,int64,double,short等。
- index元素定义一个索引,该索引必须包含splittablekey。由于可以使用主键查询表,因此索引不应与主键属性相同。
文章图片
另外,您可以使用union创建嵌套类型。
- union元素包含原始类型的集合,例如整数和字符串,可以将Union也可以作为自定义类型来引用。
- Macro标签用于定义常量。
- customattr2:
TableType:用于指定表格类型,如list或者sortlist,若不指定类型默认为generic表,且generic表无需添加customattr2属性,关于表格类型的说明请见 Generic表和List表。
ListNum:用于定义list或者sortlist表中,单个key最多可以指向多少个value值,若超过该值可指定从头部或尾部删除老元素。
SortFieldNum:用于sortlist表中,表示该表有多少个排序字段,每个排序字段需要用customattr2标识,如第一个为“sort1”,第二个“sort2”。
SortRule:用于sortlist表中,表示该表的排序方式,如DESC表示降序,INSC升序。如果有多个排序字段,按照sort的序号进行排序,序号小的字段优先级更高。比如排序是降序:sort1不同时按sort1降序;sort1相同时按sort2降序,以此类推。
name="following_action_list" version="1" primarykey="game,myuin",customattr2="TableType=SORTLIST;
ListNum=1023;
SortFieldNum=1;
SortRule=DESC">
接下来会对示例中提到的相关属性进行详细描述。
文章图片
【TcaplusDB|【深入理解TcaplusDB技术】详细介绍TDR表】TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。
推荐阅读
- 系统开发|C#-学生公寓管理系统的实现
- 02django 框架ORM 操作数据库,字段的增删改查
- 小知识系列:查询数据库数据的元信息
- 达梦数据库使用disql生成html格式的巡检报告
- 数据库|Java 实验四 JDBC数据库编程 My SQL
- mongodb|SPL---强大的集算器
- mysql|MySQL安装教程
- 「推荐收藏!」MySQL技术之旅该换换你的数据库版本了,让我们一同迎接8.0的到来哦!
- CMU 15-445 数据库课程第四课文字版 - 存储2