GIN 路由分析

GIN 路由分析

第一步:gin.Default

 

 

这个会返回一个Engine,Engine的结构如下

 其中RouterGroup也是与路由有关的结构体,它的结构体如下

第二步:r.GET()

r.get就是路由注册和路由处理。

r.GET里面的方法就是group.handle就是咱由处理,handle的处理函数

 

 里面的addRoute这个函数把方法,URI,处理handler 加入进来, 这个函数主要代码如下

 

 

Radix Tree基数树

Radix Tree,基数特里树或压缩前缀树,是一种更节省空间的 Trie 树。它对 trie 树进行了压缩

Trie树简介

Trie,被称为前缀树或字典树,是一种有序树,其中的键通常是单词和字符串,所以又有人叫它单词查找树。

它是一颗多叉树,即每个节点分支数量可能为多个,根节点不包含字符串。

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

除根节点外,每一个节点只包含一个字符。

每个节点的所有子节点包含的字符都不相同。

优点:利用字符串公共前缀来减少查询时间,减少无谓的字符串比较

看看是咋压缩的,假如有下面一组数据 key-val 集合:

用上面的数据构造成一个trie树

 

 把上图结点数小于2的进行压缩,如下

 

 

现在压缩 trie 树(Compressed Trie Tree)中的唯一子节点,就可以构建一颗 radix tree 基数树。 

在另外看一张出现次数比较多的 Radix Tree 的图:

 (图Radix_tree 来自:https://en.wikipedia.org/wiki/Radix_tree)

 

基数树的应用场景
httprouter 中的路由器。

使用 radix tree 来构建 key 为字符串的关联数组。

很多构建 IP 路由也用到了 radix tree,比如 linux 中,因为 ip 通常有大量相同前缀。

Redis 集群模式下存储 slot 对应的所有 key 信息,也用到了 radix tree。文件 rax.h/rax.c 。

radix tree 在倒排索引方面使用也比较广。

httpRouter中的基数树

node的结点如下

 结点类型nodeType的结构体如下

 addRoute的逻辑代码比较少,这里主要分空树插入和非空树插入,空树插入的代码如下

 非空树的处理:

1.寻找共同的最长前缀字符

  

2.分裂结点

 3.插入结点

 

 

 

posted @ 2023-09-07 15:08  lisus2000  阅读(58)  评论(0)    收藏  举报