本文讲述我公司MQTT订阅规则目录树SDK的技术特点、功能描述、应用领域等内容。
Windows 32位SDK下载地址:
https://download.csdn.net/download/freeland008/10781672
此数据结构是专门针对MQTT的订阅匹配规则开发的,把MQTT中所有客户的订阅规则保存在目录树结构中,然后进行插入、删除、查询、匹配操作。本SDK提供了执行这些操作的API函数。每级目录是采用压缩Trie数进行保存。
除了针对性的应用于MQTT订阅/发布,也可应用于其他形式的订阅/发布场景还可以应用于其他目录形式的数据结构的情况,例如:类文件系统、HTTP URL地址处理、域名解析、Email地址解析、通讯录、权限管理等应用。
1、支持#和+的目录通配符
2、支持的字符没有限制,可以是数字、字母、符号,和UTF8等。
3、支持空目录和任意级目录,目录的层次没有限制。
4、每级目录的长度没有限制。
1、#可以匹配任意级的目录
2、+匹配单一级目录
3、可以连续使用连续+通配合,例如 +/+、+/+/+,连续+没有限制。
4、禁止连续#
例如: #/#、#/#/#
5、进制#+先后连续出现
例如: #/+、+/#、#/+/#
1、每层目录采用压缩Trie树进行索引。使得插入、删除目录速度更快,占用内
存更少。
2、内置高效的内存分配机制,使内存的配置和释放速度更快,也可以使用开发
人员自定义的内存管理机制。
3、采用高效的模糊匹配技术实现订阅规则匹配发布主题和发布主题匹配订阅规
则。
1、订阅规则目录树支持的目录数量没有限制,支持上亿/10亿/百亿的订阅规则,
适合超大规模的订阅发布的应用场景。
2、目前默认的支持的目录层数是254层。如有特殊需求,可提供定制版本。
3、最大目录长度是8191字节。
2、根据目录进行边界值(>、>=、 <=、<)比较查询速度快。利用Trie树的特点
3、根据节点句柄进行遍历效率高。(GetHead、GetTail、GetNext、GetPrev)
6、在频繁插入、删除目录的情况下,系统仍然保持运行稳定,不会出现性能抖
动的情况。
7、支持超大容量目录结构
在目录树有庞大数量节点的情况下,仍然能保持高效运行。根据主键精确
访问(新建、删除、查询、模糊匹配)节点的耗时目录树中总目录数量无关,
只与目录层次有关。
订阅目录树功能强大,可以满足目前MQTT服务器中对该数据结构功能上的需求。
本SDK提供丰富API函数的供开发人员调用。
8、其他附加功能函数API:清空树,根据节点句柄删除目录,获取句柄值、获
取路径等。
int FdtSysInit(LPFDTINITENV pInitEnv = NULL);
HANDLE FdtCreateTree(char* sMatchAll, char* sMatchSingle);
int FdtDeleteTree(HANDLE hTree, ONFUZZYDIRAPI pPreDeleteFun = NULL, void* pInputPara = NULL);
void FdtRemoveAll(HANDLE hTree, ONFUZZYDIRAPI pPreDeleteFun = NULL, void* pInputPara = NULL);
size_t FdtGetCount(HANDLE hTree);
bool FdtMatchFilter(HANDLE hTree, char* sPath, char cSeparator, ONFUZZYDIRMATCHED
fpMatchedFilter, void* pPara);
bool FdtMatchTopic(HANDLE hTree, char* sPath, char cSeparator,
ONFUZZYDIRMATCHED fpMatchedFilter, void* pPara);
bool FdtAddKey(HANDLE hTree, int nLevel, char* sMultiDir[], HANDLE hValue, POSITION& pos);
bool FdtRemoveKey(HANDLE hTree, int nLevel, char* sMultiDir[], HANDLE& hValue);
bool FdtGetKeyValue(HANDLE hTree, int nLevel, char* sMultiDir[], HANDLE& hValue);
POSITION FdtGetKeyPosition(HANDLE hTree, int nLevel, char* sMultiDir[]);
bool FdtAddPath(HANDLE hTree, char cSeparator, char* sPath, HANDLE hValue, POSITION& pos);
bool FdtRemovePath(HANDLE hTree, char cSeparator, char* sPath, HANDLE& hValue);
bool FdtGetPathValue(HANDLE hTree, char cSeparator, char* sPathsMultiDir, HANDLE& hValue);
POSITION FdtGetPathPosition(HANDLE hTree, char* sPath, char cSeparator = '/');
int FdtGetPosKey(POSITION pos, char* sText, char* sMultiDir[]);
int FdtGetPosPath(POSITION pos, char* sPath, char cSeparator = '/');
HANDLE FdtGetPosValue(POSITION pos);
void FdtSetPosValue(POSITION pos, HANDLE hValue);
void FdtRemoveAt(HANDLE hTree, POSITION pos);
// 获取头节点的句柄值
bool FdtGetHead(HANDLE hTree, HANDLE& hValue);
// 获取头节点
POSITION FdtGetHeadPosition(HANDLE hTree);
// 获取末节点的句柄值
bool FdtGetTail(HANDLE hTree, HANDLE& hValue);
// 获取尾节点
POSITION FdtGetTailPosition(HDIRTREE hTree);
// 删除头节点,并返回节点句柄值
bool FdtRemoveHead(HANDLE hTree, HANDLE& hValue);
// 删除尾节点,并返回节点句柄值
bool FdtRemoveTail(HANDLE hTree, HANDLE& hValue);
// 获取当前实节点的下一个节点
POSITION FdtGetNextPosition(HANDLE hTree, POSITION pos);
HANDLE FdtGetNext(HANDLE hTree, POSITION& pos);
// 获取当前实节点的上一个节点
POSITION FdtGetPrevPosition(HDIRTREE hTree, POSITION pos);
HANDLE FdtGetPrev(HANDLE hTree, POSITION& pos);
// 以下4个函数用于根据键值进行范围查询
// 获取第一个>指定键值的节点
POSITION FdtGetFirstPosGTDir(HANDLE hTree, int nLevel, char* sMultiDir[]);
// 获取第一个>=指定键值的节点
POSITION FdtGetFirstPosGEDir(HANDLE hTree, int nLevel, char* sMultiDir[]);
// 获取第一个<=指定键值的节点
POSITION FdtGetFirstPosSEDir(HANDLE hTree, int nLevel, char* sMultiDir[]);
// 获取第一个<指定键值的节点
POSITION FdtGetFirstPosSTDir(HANDLE hTree, int nLevel, char* sMultiDir[]);
// 以下4个函数用于根据键值进行范围查询
// 获取第一个>指定键值的实节点
POSITION FdtGetFirstPosGTPath(HANDLE hTree, char* sPath, char cSeparator = '/');
// 获取第一个>=指定键值的节点
POSITION FdtGetFirstPosGEPath(HANDLE hTree, char* sPath, char cSeparator = '/');
// 获取第一个<=指定键值的节点
POSITION FdtGetFirstPosSEPath(HANDLE hTree, char* sPath, char cSeparator = '/');
// 获取第一个<指定键值的节点
POSITION FdtGetFirstPosSTPath(HANDLE hTree, char* sPath, char cSeparator = '/');