首页 > 其他分享 >把哈希表换成 tire 树,居然为公司省下了几千万

把哈希表换成 tire 树,居然为公司省下了几千万

时间:2024-09-12 16:51:46浏览次数:10  
标签:tire 优化 省下 request header 1% 哈希 Cloudflare 计算资源

有没有想过,仅仅省下1%的计算资源,能为一家大公司带来多大的影响?你可能觉得,1%听起来微不足道,完全不值得一提。但今天我们聊一下一个技术优化点,就是关于如何通过微小的优化,Cloudflare这样的大型网络公司如何省下了大量的计算资源,背后还有不少值得我们学习的智慧。

你也在为计算资源头疼吗?

如果你是个开发者,尤其是负责维护大规模服务的开发者,你一定对计算资源的消耗有深刻的体会。无论是服务器的 CPU 使用率还是内存消耗,甚至是网络带宽,稍有不慎就可能让成本暴增。而且,问题不止是花钱那么简单,资源浪费还会拖慢你的系统,影响用户体验,最终给公司带来巨大的损失。

我要说的是 Cloudfllare 公司的案例,它不是什么宏大的技术革新或颠覆性的变革,而是从一些不起眼的小地方着手,积少成多,最终实现了1%的节省。这背后到底有什么诀窍?我们一起来看看。

1. 换个数据结构,省时又省力

在Cloudflare的案例中,他们的第一个关键优化是引入了更高效的数据结构。在大规模的数据处理中,数据结构的选择往往是决定性能的关键因素。

他们提到了将原有的哈希表结构换成了更适合他们需求的trie(字典树)结构。

下述是然来的 hash 表结构


scss

代码解读

复制代码

// PERF: heavy function: 1.7% CPU time pub fn clear_internal_headers(request_header: &mut RequestHeader) {     INTERNAL_HEADERS.iter().for_each(|h| {         request_header.remove_header(h);     }); }

这是优化之后的版本


rust

代码解读

复制代码

pub fn clear_internal_headers(request_header: &mut RequestHeader) {    let to_remove = request_header        .headers        .keys()        .filter_map(|name| INTERNAL_HEADER_SET.get(name))        .collect::<Vec<_>>();    to_remove.into_iter().for_each(|k| {        request_header.remove_header(k);    });

可以看到,他是先构造了一颗 tire 树,然后在进行操作

那么,为什么是trie呢?因为它能更高效地存储和处理特定类型的数据,特别是字符串相关的操作。每次的字符串查找、匹配操作都能变得更加快速,减少了不必要的计算消耗。

这就好比我们平时在超市找商品,如果货架排布得井井有条,一目了然,那么找起东西来肯定又快又省力。

2. 不只是省电,它还能加速系统响应

有时候,节省计算资源并不仅仅体现在电费账单上,它还直接影响系统的响应时间。你有没有遇到过访问一个网站时,页面加载缓慢,让你心急如焚?这很大程度上与后台的计算效率有关。

Cloudflare在优化trie结构后,明显提升了系统的响应速度。

举个通俗的例子,如果原本的哈希表是一个在黑夜中摸索东西的场景,那优化后的trie结构就是在白天找东西——路径明确,操作直观,不浪费多余的时间。这种提升,虽然看起来只是毫秒级的,但在每天处理数以亿计的请求时,省下来的时间就变得非常可观了。

3. 别小看每一次小改动

也许你会问:“这1%的优化,真有那么重要吗?” Cloudflare给出的答案是肯定的。别看只是1%,但在他们这种大规模系统中,每天的请求数以亿计,这1%就意味着节省了大量的服务器计算资源。试想,如果你每天的电费能减少1%,一年下来呢?这可是一笔不小的费用。

而且,从另一个角度看,任何微小的改动都有可能是更大优化的开始。Cloudflare的工程师们通过这次的优化,深入分析了系统中的其他潜在问题,发掘出更多可以提升的地方。这就像是修车时,你发现一个小问题,结果一修就发现了更多的隐患,最后车子不仅恢复了正常,还比以前跑得更快。

4. 现在,从你的小项目开始优化吧

当然,Cloudflare的规模可能让很多普通开发者觉得遥不可及,但这并不意味着我们不能从中学到东西。你手上的小项目同样可以从数据结构、代码效率等方面着手进行优化。

比如,如果你正在处理大量的字符串数据,不妨考虑一下是否可以用trie这种结构来提升效率。或者你可以先从代码的性能分析开始,看看有没有哪个部分的计算特别耗时。通过一点点的优化,哪怕最终只提升了1%,也会让你长期受益。不过,注意,过早优化,依然是万恶之源,先使用优雅的代码实现,上线后做性能瓶颈分析才是正道,换句话说,一个只有 10 几个 PV的地方,那么是再好的数据结构和算法,也很难体现出商业成本上的价值

5. 未来的路:每一秒都很重要

在如今这个对速度要求极高的互联网时代,每一秒、甚至每一毫秒的节省都至关重要。你以为的“小改动”,可能就是让你的服务脱颖而出的关键。

Cloudflare通过这些小优化,每天节省的计算资源不仅让他们的服务更加高效,也给其他同行树立了一个榜样:技术上的进步不一定是依靠大刀阔斧的改革,有时候,从细微处着手,能带来同样惊人的效果。

不知道,你是否也开始思考自己项目中的那些“隐形”问题了呢?或许,你已经意识到了一些可以优化的地方,但还没来得及动手。那为什么不从今天开始,试着优化一两个小地方呢?也许下次的1%提升,就来自于你的一点点努力。

这个世界上没有小优化,只有还没被发现的优化。

原文链接:https://juejin.cn/post/7412848251844280360

标签:tire,优化,省下,request,header,1%,哈希,Cloudflare,计算资源
From: https://blog.csdn.net/weixin_47588164/article/details/142134677

相关文章

  • 树(tree)和哈希算法(Hash)
    树由n个节点组成的有限集。有一个根节点;其他节点只有一个前驱节点,但可以有多个后继节点。叶子节点(终端结点):只有前驱结点没有后继结点结点度:子节点的个数称之为度树的(广)度:树中各节点度的最大值 深度:从根节点到最底层节点的层数森林:n个互不相交的树的集合二叉树:任意一个节点......
  • 哈希表
    模拟散列表把一个较大范围内的数转化为较小范围的数的集合。模上一个数(x%N+N)%N防止下标出现负数数据结构用一个数组表示要插入的槽,如果哈希产生了冲突,则把数插入到槽中(单链表)。数组+模拟链表拉链法实现代码:#include<cstring>#include<iostream>usingnamespacestd;......
  • 哈希表、算法
    哈希表hash:在编程和数据结构中,"hash"通常指的是哈希函数,它是一种算法,用于将数据(通常是字符串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要,哈希表是一种通过哈希函数将键映射到表中位置的数据结构,以实现快速的数据插入和检索。哈希表(HashTable):也称为散......
  • 【Redis】redis5种数据类型(哈希)
    目录基本介绍命令HSETHGETHEXISTSHKEYSHVALSHGETALLHMGETHLENHSETNXHINCRBYHINCRBYFLOATHSTRLEN内部编码原生字符串类型、哈希类型、序列化字符串json作缓存的区别基本介绍哈希类型中的映射关系是field-value,用于区分redis整体的键值对(key-value)命令H......
  • LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现N*K时间复杂度
    3177.求出最长好子序列II题目链接题目描述给你一个整数数组nums和一个非负整数k。如果一个整数序列seq满足在下标范围[0,seq.length-2]中最多只有k个下标i满足seq[i]!=seq[i+1],那么我们称这个整数序列为好序列。请你返回nums中好子序列的最长长度......
  • 天翼云存储SpinTires问题解析:d3dx9_43.dll文件丢失应对指南
    在使用天翼云存储或运行SpinTires等游戏时,有时会遇到系统提示“d3dx9_43.dll文件丢失”的错误。这个问题通常是由于DirectX组件中的d3dx9_43.dll文件未正确安装、损坏或丢失所导致的。以下是一些应对指南,帮助您解决这一问题:一、了解d3dx9_43.dll文件的重要性d3dx9_43.dll是D......
  • LeetCode刷题-哈希表
    一:哈希表1、有key:value键值对这样的概念;就是字典;通过key得到value2、hash碰撞问题:就是key的内存地址相同;使用链表的方法解决3、字典常见操作#创建哈希表hash_tabel={}#添加元素hash_tabel['name']='admin'hash_tabel['age']=25#删除元素delhash_tabel['name']#修改元......
  • 用友U8 Cloud MultiRepChooseAction SQL注入漏洞复现
    0x01产品简介用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。0x02漏洞概述用友U8CloudMultiRepChooseAction 接口处存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用SQL注入漏洞获取数据库中的信息(例如,管理员后......
  • 2024.9.6 leetcode 70 爬楼梯 (哈希表/动态规划)
    题面70.爬楼梯-力扣(LeetCode)题解:极其经典的一道动态规划,比如要跳到10楼有f(10)种方法,可以分为1、先跳到9楼再往上跳1楼2、先跳到8楼再往上跳2楼,所以f(10)=f(8)+f(9),昨天复习了哈希表,所以用哈希练习一下。classSolution{public:intclimbStairs(intn){uno......
  • 2024.9.4 leetcode 169 多数元素 (哈希表)
    题面 169.多数元素-力扣(LeetCode)题解:复习(自学)了一下哈希表,unordered_map<int,int>umap定义一个表umap.find(nums[i])!=umap.end()判断是否存在umap.insert({nums[i],1})插入umap.erase(nums[i])清除C++容器类<unordered_map>|菜鸟教程(runoob.com)class......