首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

URL是如何关联Nginx location配置块的?

比如/his/2001/test.jpg请求到达时,它的匹配顺序如下图蓝色箭头所示: 事实上,/his/2001/test.jpg请求的匹配共包含6步: 请求首先命中/,暂时/将被设置为最长前缀...,再进入子树看看有没有更长的前缀; 匹配上直接子结点res,由于h在字母表的顺序小于r,因此到左兄弟结点his中继续匹配; 匹配上his后,此时/his被设置为最长前缀; 匹配上直接子树.../his/20,将其设为最长前缀,仍然进入子树尝试更长的前缀匹配; 匹配上直接子树20,由于1在字母表的顺序中小于2,因此到左兄弟结点中去看看; /20匹配命中,且在字母表中/先于1,匹配到此结束...虽然这个请求同时命中了3个location,但2个前缀location中,/res/blog虽然带有^~符号,可惜它却不是最长的前缀匹配;而/res/blog/js虽然是最长前缀,但又不能阻止正则表达式...成功后就选中此location; 若所有正则表达式皆匹配上,则使用第1步中检索出的最长前缀location处理请求

27920

字符串查找----R向单词查找树

查找过程中可能会出现三种情况: 键的尾字符所对应的结点中的值非空----这是一次命中的查找。 键的尾字符所对应的结点中的值为空----这是一次命中的查找。...查找结束于一条空连接----这是一次命中的查找。...key.length()) return x; char c = key.charAt(d); return get(x.next[c],key,d+1); } 插入操作: 插入之前要先进行一次查找,如果命中则插入...根据两种命中的情况分两种插入情况: 结束与空连接----这说明单词查找树中没有与键的尾相对应的结点,因此需要需要为键中为被检查到的每个字符创建结点并将键的值保存在最后一个结点中; 键的尾字符所对应的节点的值为空...字母表的大小为R,在一棵由N个键构造的单词查找树中,命中查找平均所需检查的数量为~(logR)N。 一棵单词查找树中链接总数在RN到RNw之间,其中w为键的平均长度。

1.2K00
您找到你想要的搜索结果了吗?
是的
没有找到

字符串查找----三向单词查找树

在三向单词查找树中,每个结点都含有一个字符,三条链接和一个值。这三条链接分别对应着当前字母小于、等于和大于节点字母的所有键。 三向单词查找算法实现查找和插入很简单。...在查找时,我们首先比较键的首字母和根结点的字母,如果键的首字母较小,则选择左链接;如果较大,则选择右链接;如果相等,则选择中链接。然后,递归地使用相同的算法。...如果遇到了一个空连接或当键结束之时结点值为空,则命中,如果键结束时结点值非空,则命中。插入方法和R向单词查找树基本原理相同。...在一棵由N个随机字符串构成的三向单词查找树中,查找命中平均需要比较字符~lnN次。除~lnN外,一次插入或命中的查找会比较一次被查找的键中的每一个字符。

1.4K10

初始红黑树

小引——2-3树 二叉查找树中,每个结点上有一个键和两个链接,我们称这种结点为2-结点。所以,有着两个键和三个链接的结点我们称之为3-结点。由2-结点和3-结点构成的树称为2-3树。 ?...查找 查找很简单,跟二叉查找树是类似的,以上图为例,查找8的话,首先跟根节点13比较,8小于小于13,于是去左子树中查找,8又大于6而小于9于是去这个结点的中子树中查找,命中。...也因此,插入要复杂一点点,我们分情况讨论: 向2-结点中插入新键 跟二叉查找树中的插入一样,在插入之前,先要进行一次命中的查找(如果命中就不需要新键结点了,直接进行值的覆盖),如果这次命中的查找结束于一个...向一个父结点为2-结点的3-结点中插入新键 这一种情况与上一中情况有相同的地方,命中的查找结束与一个3-结点。...向一个父结点为3-结点的3-结点中插入新键 同样,先临时构造4-结点,并进行分解,向上生长,增加父结点中的键的数量,不过此时父结点也是3-结点,增加之后成为了新的4-结点,我们只能够再次分解向上生长,直到遇到一个

61030

编译原理:第三章 词法分析

解释:若对于∑中的任何字α,若存在一条从初态结点s0到某一结点的通路,且这条通路上所有弧的标记符连接成的字等于α,则称α可为DFA M所识别(读出或接受)特别地,若初态结点同时又是结点,则空字ε...若对于∑中的任何字α,若存在一条从初态结点s0到某一结点的通路,且这条通路上所有弧的标记符连接成的字等于α,则称α可为NFA 所识别(读出或接受)特别地,若初态结点同时又是结点或者存在一条从初态节点到态节点的空边...(6)将该状态转换矩阵中所有状态子集重新命名,得到状态转换矩阵,其所示的是与给定的NFA N等价的DFA M(化简的DFA)。 注意:DFA M的初态为该表第一行第一列的状态。...Y,形成M’,使得:X \oversetε \rightarrow 所有M的初态节点 ,所有M的结点\oversetε \rightarrow Y节点 ,那么M’就只有一个初态X和一个态Y。...X、Y的转换图,由X指向Y的弧上标记为正规式r,形成只有一个初态和态的NFA 2.然后分解弧上正规式,用替代规则引入新状态结点,所有的新结点取不同的名字但同一结点的不同射出弧可以同名 3.直到所构造的

4.3K11

深入理解Linux VFS和Page Cache

Linux中VFS依靠四个主要的数据结构来描述其结构信息,分别为超级块、索引结点、目录项和文件对象,这些数据结构大都会与磁盘上的对应上。 超级块(Super Block):超级块对象表示一个文件系统。...索引结点(Inode):索引结点对象存储了文件的相关元数据信息,例如:文件大小、设备标识符、用户标识符、用户组标识符等等。Inode分为两种:一种是VFS的Inode,一种是具体文件系统的Inode。...当内核发起一个读请求时(例如进程发起read()请求),首先会检查请求的数据是否缓存到了page cache中,如果有,那么直接从内存中读取,不需要访问磁盘,这被称为cache命中(cache hit)...如果cache中没有请求的数据,即cache命中(cache miss),就必须从磁盘中读取数据。然后内核将读取的数据缓存到cache中,这样后续的读请求就可以命中cache了。...当内核发起一个写请求时(例如进程发起write()请求),同样是直接往cache中写入,此时不会立即同步到磁盘,而是将写入的page设置为脏页,并将其加入dirty list中,内核会负责定期同步到磁盘保持二者一执行

3K21

动画 | 什么是2-3树?(修改删除操作方式)

要判断一个元素是否存在,我们先将待查找元素和根节点比较,如果它和其中任意一个相等,那查找命中;否则根据比较的结果来选择查找的方向。 ?...2-3树插入元素 插入元素首先进行查找命中,若查找命中则不予插入此元素,如果需要支持重复的元素则将这个元素对象添加一个属性count。若查找命中,则在叶子节点中插入这个元素。...向2-节点中插入元素 如果命中查找结束于2-节点,直接将2-节点替换为3-节点,并将待插入元素添加到其中。 ?...如果左子节点是2-节点,而兄弟节点是2-节点,则左子结点、父节点中最小的元素和兄弟结点合并成4-结点。 ?...删除任意元素 删除任意元素需要进行命中查找。如果查找命中则忽略之;如果查找命中则像二分搜索树删除任意元素,将带删除元素右子树的最小元素替换到待删除元素上,然后对右子树进行删除最小元素。

1.6K30

手写LRU缓存淘汰算法

以计算机的使用场景为例,当cpu要访问内存中的一条数据时,它会先在缓存里查找,如果能够找到则直接使用,如果没找到,则需要去内存里查找; 同样的,在数据库的访问场景中,当项目系统需要查询数据库中的某条数据时,可以先让请求查询缓存...,如果命中,就直接返回缓存的结果,如果没有命中,就查询数据库, 并将查询结果放入缓存,下次请求时查询缓存命中,直接返回结果,就不用再次查询数据库。...操作系统的缓存 减少与磁盘的交互 数据库缓存 减少对数据库的查询 Web服务器缓存 减少对应用服务器的请求 客户浏览器的缓存 减少对网站的访问 2、缓存有哪些淘汰策略?...当缓存容量达到上限时,它应该在写入新数据之前删除最久使用的数据值,从而为新的数据值留出空间。...,需要通过链表来定位hashmap中应当删除的键值对 一些操作:双向链表中,在后面的节点表示被最近访问 新加入的节点放在链表末尾,addNodeToLast(node) 若容量达到上限,去除最久使用的数据

72810

A*算法解决八数码问题

搜索中利用启发式信息,对当前扩展结点根据设定的估价函数值选取离目标最近的结点进行扩展,从而缩小搜索空间,更快的得到最优解,提高效率。...2.2算法伪代码   创建两个表,OPEN表保存所有已生成而考察的节点,CLOSED表中记录已访问过的节点。算起点的估价值,将起点放入OPEN表。 while(OPEN!...输入格式为一个测试用例由两个中间由一空行隔开的8数码格局组成,输出为对应测试用例的走法路径及相关统计信息,程序假定输入数据符合要求,做检查。...Astar.in: 2 0 3 //初态 1 8 4 7 6 5 1 2 3 // 态 8 0 4 7 6 5 3.2数据结构 3.2.1 open表的数据结构表示 考虑对open表的操作,每次需要得到所有待扩展结点中...说明:A*算法是启发式搜索算法,搜索时充分利用当前状态距目标距离远近的启发信息,选取当前扩展结点中估价函数最小的进行扩展,生成结点数少,搜索空间较小,实现稍复杂, 备注: 程序对输入数据进行检查

1.3K30

分布式缓存

写缓冲 无处不在的缓存 操作系统缓存 CPU缓存 JVM缓存 数据库缓存 CDN缓存 反向代理缓存 前端缓存 应用程序缓存 分布式对象缓存 缓存本身的数据结构 tree hash 缓存命中率 缓存是否有效依赖于能多少次重用同一个缓存来响应业务请求...命中率是缓存的关键指标 如果查询一个缓存,十次查询九次能够得到正确结果,那么他的命中率就是90% 影响命中率的主要指标: 缓存键集合大小 读取缓存数据时通过缓存键进行精准匹配,缓存键越少,效率越高 可用内存空间...,并在请求命中请求原始服务器 客户端连接的是通读缓存而不是生成响应的原始服务器 代理缓存 反向代理缓存 多层反向代理缓存 内容分发网络CDN CDN同时配置静态和动态请求 旁路缓存 cache-aside...缓存的数据通常是态,不需要中间计算,节省了CPU资源消耗 缓存降低了数据库、磁盘、网络的负载压力,使得这些IO设备能获得更好的响应特性,提升系统整体性能 缓存是系统性能优化的大杀器 技术简单 性能提升显著...,如果缓存没有相应的对策,那所有的查询请求都落到数据库上,带来很大的压力,甚至崩溃。

62320

.NET基础面试题整理

垃圾回收的宗旨是提高内存的利用率,它并不是用来清理文件句柄,和数据库连接字符串,端口或者其他有限的资源(接器finalizer,不能被显示调用,不能传递任何参数,即不能被重载,只有垃圾回收器才能调用接器...事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。...,还会将和站点相关的所有Cookie都提交给服务器,这是强制性的 缺点:不能存储过多的信息,安全性差 针对互联网的优化:图片服务器和主站域名不一样 021 http请求 css,js,图片,单独请求,200...表示处理成功,301重定向,400错误请求 307临时重定向,404页面未找到,403禁止,401认证,500server内部错误,503访问人数过多。...list[i] = list[j];//交换双亲结点和它的孩子结点 i = j;//以交换后的孩子结点为根,继续调整它的子树

1.6K21

SQL,何必在忆之一(索引与执行计划篇)

(而B 树的非节点也包含需要查找的有效信息) B+树的主要优点:非终端结点仅仅起高层索引作用,而B树非终端结点的关键字除作子树分界外,本身还是实际记录的有效关键字(含记录指针),因此相同的结点空间,B...B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;...,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针; 小结 B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点; B-树:多路搜索树,每个结点存储M/2到M个关键字...,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中; B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引...;B+树总是到叶子结点命中; B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3 这里更加具体的有待探究,欢迎大佬批评与指点 索引 索引的概念 为了更快与查询,

41120

「资深前端工程师总结」前端面试知识点大全—计算机基础知识

401 Unauthorized 请求授权。 403 Forbidden 禁止访问。 404 Not Found 找不到如何与 URI 相匹配的资源。...不能被服务器所理解 401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 HTTP 401.1 - 授权:登录失败   HTTP 401.2 - 授权...B+的特性: 1).所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的; 2).不可能在非叶子结点命中; 3).非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储...小结: B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点; B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现...,且只出现一次,非叶子结点可以命中; B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点命中; B*树:在B+树基础上,为非叶子结点也增加链表指针

1.2K42

怎么设计高效的敏感词过滤系统(一)

态也称可接受状态或结束状态。...3、DFA状态图表示 假定DFA M含有m个状态,n个输入字符,那么这个状态图含有m个节点,每个节点最多有n个弧射出,整个图含有唯一一个初态点和若干个态点,初态节点冠以双箭头“=>”,态节点用双圈表示...,若f(ki ,a)=kj,则从状态结点ki到状态节点kj画标记为a的弧。...4、DFA所接受 对于Σ* 中的任何符号串t,若存在一条从初态到某一态的道路,且这条道路上所有弧的标记连接成的字符串等于t,则称t可为DFA M所接受,若M的初态同时又是态,则空字可为M所识别(接受...这个查找方法能够求解,但是效率不高(注意第2步),我们读到了后边的文字,但是由于没有命中,检索发生了回退,导致效率下降。

7.3K20

小时到分钟 - 一步步优化巨量关键词的匹配

要求将这 60万 条记录中包含的关键词全部提取出来并统计各关键词的命中次数。 本文完整介绍了我的实现方式,看我如何将需要运行十小时的任务优化到十分钟以内。...grep命令的用法不再多提,使用 grep 'keyword' | wc -l 可以很方便地进行统计关键词命中的信息条数,而php的 exec() 函数允许我们直接调用 linux 的 shell 命令...觉醒,意识和思路的觉醒 级 - Trie树 trie树 于是我又来找谷哥帮忙了,搜索大量数据匹配,有人提出了 使用 trie 树的方式,没想到刚学习的 trie 树的就派上了用场。...首先是数据结构树结点的设计,当然它也是重中之重: $node = array( 'depth' => $depth, // 深度,用以判断已命中的字数 'next' => array(...级,却不一定是终极 他径 - 多进程 设计 匹配方法的优化结束了,开头说的优化到十分钟以内的目标还没有实现,这时候就要考虑一些其他方法了。

1.7K60

怎么设计高效的敏感词过滤系统(一)「建议收藏」

态也称可接受状态或结束状态。...,态节点用双圈表示,若f(ki ,a)=kj,则从状态结点ki到状态节点kj画标记为a的弧。...4、DFA所接受 对于Σ* 中的任何符号串t,若存在一条从初态到某一态的道路,且这条道路上所有弧的标记连接成的字符串等于t,则称t可为DFA M所接受,若M的初态同时又是态,则空字可为M所识别(接受...即:若 t∈ Σ* , f(S, t)=P, 其中S为M的开始状态,P∈Z,Z为 态集。 则称 t 为 DFA M所接受(识别)。 如果看懂了DFA的介绍,我们可以这么理解敏感词过滤系统。...这个查找方法能够求解,但是效率不高(注意第2步),我们读到了后边的文字,但是由于没有命中,检索发生了回退,导致效率下降。

1.7K20
领券