首页 > 其他分享 >GIN 路由分析

GIN 路由分析

时间:2023-09-07 15:25:28浏览次数:42  
标签:分析 radix tree Radix 字符串 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的逻辑代码比较少,这里主要分空树插入和非空树插入,空树插入的代码如下

 非空树的处理:

  

标签:分析,radix,tree,Radix,字符串,GIN,节点,路由
From: https://www.cnblogs.com/lisus2000/p/17684833.html

相关文章

  • Spring—Document root element "beans", must match DOCTYPE root "null"分析及解决
    Documentrootelement"beans",mustmatchDOCTYPEroot"null".的错误提示,网上很多人说要把applicationContex.xml文件中加上如下第二行的<!DOCTYPE/>标签,说明DTD,其实并不准确。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEbeansPUBL......
  • 生成一个数据分析常用的python环境安装文件,使用conda安装
    当使用conda安装Python环境时,可以创建一个名为environment.yml的文件来指定要安装的软件包和其版本。以下是一个示例的environment.yml文件,其中包含了一些常用的数据分析软件包: name:data_analysischannels: -conda-forgedependencies: -python=3.8 -pand......
  • Spring源码分析(十)Spring中Bean的生命周期(下)
    在上篇文章中,写了bean的生命周期的简单介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycleBean的回调机制。另外对bean的销毁过程也做了简单介绍,但是对于整个bean的生命周期,这还只是一小部分,在这篇文章中,我将继续完成剩下部分的内容,同时对之前的内容做一次......
  • npm:升级自身时报错:EBADENGINE
    一,报错信息root@lhdpc:~#npminstall-gnpmnpmERR!codeEBADENGINEnpmERR!engineUnsupportedenginenpmERR!engineNotcompatiblewithyourversionofnode/npm:[email protected]!notsupNotcompatiblewithyourversionofnode/npm:[email protected]......
  • 软路由vs传统路由器ip:选择合适的网络设备
    在构建和管理网络基础设施时,选择正确的网络设备至关重要。本文将介绍软路由IP和传统路由器两种常见的网络设备,并探讨它们各自特点、优势以及应用场景,帮助读者了解并选择最适合他们需求的网络设备。什么是软路由IP?软路由IP是指通过虚拟化技术实现功能类似于物理硬件上运行操作系统与......
  • 一套成熟的实验室信息管理系统源码,集前处理、检验、报告、质控、统计分析、两癌等模块
    一套成熟的实验室信息管理系统,集前处理、检验、报告、质控、统计分析、两癌等模块为一体的实验室信息管理系统。在整个检验过程中实时对检验结果监控、评估、分析、统计并对操作规程进行严格规范。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。技术架构:ASP.NET......
  • Python学习 -- logging模块
    logging模块是Python中用于记录日志的标准库,它提供了丰富的功能,可以帮助开发者进行日志记录和管理。以下是关于logging模块的详细使用方式,包括日志级别、处理流程、Logger类、Handler类、Filter类、Formatter类以及模块中常用函数等内容。1.日志级别logging模块定义了以下......
  • Oracle利用 DBMS_PROFILER 包来分析PL/SQL瓶颈
     Oracle利用DBMS_PROFILER包来分析PL/SQL瓶颈 在Oracle10g版本之前,默认情况下不会安装 DBMS_PROFILER包,此次演示版本为11.2.0.4.0,默认已经安装。安装 DBMS_PROFILER包方式如下:sqlplus/assysdbadescdbms_profiler--不存在则通过下面的方式创建@?/rdbms/......
  • Lnton羚通视频分析算法开发yolov8训练与rknn模型导出并在RK3588部署的详细步骤
    Lnton羚通的算法算力云平台以其突出的特点成为一款优秀的解决方案。它的高性能、高可靠性、高可扩展性和低成本使得用户能够高效地进行复杂的计算任务。同时,丰富的算法库和工具以及支持用户上传和部署自定义算法的功能进一步提升了平台的灵活性和个性化能力。一、环境验证(一)板端验......
  • 软路由IP的冗余和故障转移技术
    在现代互联网环境中,构建一个高可用性的网络是至关重要的。本文将深入探讨软路由IP地址的冗余和故障转移技术,并提供具体处理方法,帮助您实现更稳定、可靠且不间断连接。无论是家庭用户还是企业组织,在今天都离不开对于互联网连接的依赖。而为了确保持续在线并避免单点故障导致服务中断......