C++ | QQ后端暑期实习面试
tcp三次握手,四次挥手
断点续传
文件断点续传是一种机制,允许在网络传输中的文件传输过程中出现断开连接或传输中断的情况下,能够恢复传输并继续传输未完成的部分。其原理如下:
- 检测支持:首先,服务器端和客户端需要支持文件断点续传功能。服务器必须能够接收并处理客户端请求的文件的部分内容,并且客户端必须能够发送和接收文件的部分内容。
- 断点记录:当文件传输开始时,客户端和服务器都会记录已成功传输的字节数或文件的偏移量。这些记录通常保存在服务器端的文件或数据库中。
- 传输请求:如果传输过程中发生中断,客户端可以发送一个特殊的请求到服务器,请求从断点处继续传输。这个请求通常包含之前传输的字节数或文件的偏移量,以便服务器知道从哪里开始继续传输。
- 服务器响应:服务器接收到客户端的断点续传请求后,根据请求中的偏移量,定位到文件的相应位置,并从该位置开始继续传输文件。服务器将继续传输的部分内容作为响应发送给客户端。
- 客户端接收:客户端接收到服务器的响应后,将继续传输的部分内容写入本地文件的相应位置。
- 继续传输:客户端和服务器通过以上步骤的循环,直到整个文件传输完成。在每次传输中断后,客户端发送断点续传请求,服务器根据请求继续传输文件的未完成部分,直到整个文件成功传输完成。
- 通过文件断点续传的机制,即使在网络不稳定或传输过程中断的情况下,文件传输可以被恢复和继续,提高了传输的可靠性和效率。这在大文件传输、网络不稳定的环境或需要长时间传输的场景中非常有用。
多态的实现,怎么知道调用的是哪个虚函数,虚函数的工作原理
多态分为静态多态和动态多态。静态多态是指在编译期实现的多态,具体可以分为函数重载和模版。函数重载是通过name mangling实现。动态多态是在运行期实现的多态,主要是通过重写虚函数实现,需要使用虚函数表和虚函数指针。
每个包含虚函数的类都有一个虚函数表(vtable)。虚函数表是一个指向虚函数指针的数组,这些指针指向类的虚函数实现。每个对象包含一个指向虚函数表的指针,称为虚指针(vptr)。当对象被创建时,构造函数会初始化这个虚指针,指向对象所属类的虚函数表。当通过基类指针或引用调用虚函数时,实际上是通过虚指针找到虚函数表,然后在表中找到对应的函数指针并调用它。这个过程确保调用的是实际对象的函数实现,而不是基类的实现。
虚函数表(vtable)存储在静态内存区域中,每个类有一个虚函数表。虚指针(vptr)是每个对象的隐式成员,存储在对象的内存布局中,指向该对象所属类的虚函数表。
Http2.0和1.0的差别
-
头部压缩:
HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是⼀样的或是相似的,那么,协议会帮你消除重复的部分。
这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存如这个表,生成⼀个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。 -
二进制格式:
HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧。增加了数据传输的效率。
-
数据流:
HTTP/2 的数据包不是按顺序发送的,同⼀个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。
每个请求或回应的所有数据包,称为⼀个数据流( Stream )。每个数据流都标记着⼀个独一无二的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数。
客户端还可以指定数据流的优先级。优先级⾼的请求,服务器就先响应该请求。 -
多路复用:
HTTP/2 是可以在⼀个连接中并发多个请求或回应,而不用按照顺序⼀⼀对应。
移除了 HTTP/1.1 中的串行请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,⼤幅度提高了连接的利用率。
举例来说,在⼀个 TCP 连接里,服务器收到了客户端 A 和 B 的两个请求,如果发现 A 处理过程非常耗时,于是就回应 A 请求已经处理好的部分,接着回应 B 请求,完成后,再回应 A 请求剩下的部分。 -
服务器推送:
HTTP/2 还在⼀定程度上改善了传统的「请求 - 应答」工作模式,服务不再是被动地响应,也可以主动向客户端发送消息。
举例来说,在浏览器刚请求 HTML 的时候,就提前把可能会用到的 JS、CSS ⽂件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送(Server Push,也叫 Cache Push)。
InnoDB和MyISAM索引的区别
1. 索引类型
- InnoDB:
- 主键索引(Clustered Index):InnoDB 的主键索引也是聚集索引。数据表中的数据按照主键索引的顺序存储。这意味着数据行的物理顺序与主键的顺序一致。
- 非主键索引(Secondary Index):非主键索引存储的是主键值和索引字段的值,实际上是通过主键来查找具体的行。
- 全文索引(Full-text Index):从 MySQL 5.6 开始,InnoDB 也支持全文索引。
- MyISAM:
- 普通索引(Non-clustered Index):MyISAM 的所有索引都是非聚集的,即索引的顺序与数据的存储顺序无关。数据行的位置和索引条目是分开的。
- 全文索引(Full-text Index):MyISAM 在 MySQL 5.6 之前支持全文索引,但从 MySQL 5.6 起,InnoDB 也支持了全文索引。
2. 索引存储结构
- InnoDB:
- 聚集索引(Clustered Index):InnoDB 使用聚集索引来组织数据,主键决定了数据的存储顺序。聚集索引的叶子节点存储的是实际的表数据。
- 非聚集索引(Secondary Index):非聚集索引的叶子节点存储的是主键值以及索引字段的值。因此,进行非主键索引的查找时,需要先通过主键索引查找数据行。
- MyISAM:
- 非聚集索引(Non-clustered Index):MyISAM 的所有索引都存储了指向数据的指针,索引的叶子节点存储的是数据行的物理位置。数据表中的数据行是按照文件的顺序存储的,而不是按照索引的顺序。
3. 索引维护和性能
- InnoDB:
- 事务支持:InnoDB 支持事务(ACID),因此在执行插入、更新或删除操作时,索引维护是原子的。
- 性能:由于聚集索引的数据和索引存储在一起,对于主键查找非常高效。但由于非主键索引需要二次查找(通过主键查找),在一些场景下可能会导致额外的开销。
- 锁机制:InnoDB 使用行级锁,可以提高并发性。
- MyISAM:
- 没有事务支持:MyISAM 不支持事务,这可能影响数据一致性和并发处理。
- 性能:MyISAM 的索引维护比 InnoDB 更简单,因为它的索引和数据是分开的。对于简单的读操作,性能可能会更高,但对于复杂的更新操作,可能会稍逊。
- 锁机制:MyISAM 使用表级锁,这可能影响并发性和性能。
4. 索引的其他特性
- InnoDB:
- 自增主键:InnoDB 支持自增主键,使用聚集索引时,自增主键的插入效率很高。
- 外键支持:InnoDB 支持外键约束,确保数据的完整性和关系的约束。
- MyISAM:
- 表级锁:MyISAM 使用表级锁,在高并发的写操作中可能会成为瓶颈。
- 外键不支持:MyISAM 不支持外键约束,数据的完整性需要通过应用程序逻辑来维护。
C++20新特性
1. Modules(模块)
模块是C++20引入的一种新特性,用于替代传统的头文件机制,旨在改善代码的模块化和编译时间。
主要特性
- 模块化:将代码分割成独立的模块,可以显著减少编译时间和依赖管理的复杂性。
- 更快的编译速度:通过模块化,可以减少重复编译,提高编译速度。
- 避免宏污染:模块可以避免宏带来的命名冲突问题。
- 明确的接口:模块显式地定义了导出和导入的接口,提高了代码的可读性和安全性。
示例代码
// my_module.cpp
export module my_module; // 定义并导出模块
export void greet() {std::cout << "Hello from module!\n";
}// main.cpp
import my_module; // 导入模块int main() {greet();
}
2. Coroutines(协程)
协程是一种用于简化异步编程的新特性,使得可以通过更直观的方式来编写异步代码。
主要特性
- 异步操作:协程允许函数在需要等待某些操作完成时挂起并返回调用者,然后在条件满足时恢复执行,即实现一个hook完成yield和resume。
- 状态保持:协程可以在挂起时保持其状态,当恢复执行时可以从中断的地方继续。
- 高效的资源管理:协程相比于传统的线程更轻量级,具有更低的上下文切换开销。
示例代码
#include <iostream>
#include <coroutine>struct Generator {struct promise_type;using handle_type = std::coroutine_handle<promise_type>;struct promise_type {int value;auto get_return_object() { return Generator{handle_type::from_promise(*this)}; }auto initial_suspend() { return std::suspend_always{}; }auto final_suspend() noexcept { return std::suspend_always{}; }void return_void() {}void unhandled_exception() { std::exit(1); }auto yield_value(int val) {value = val;return std::suspend_always{};}};handle_type h;Generator(handle_type h) : h(h) {}~Generator() { h.destroy(); }bool next() { return h.resume(), !h.done(); }int value() const { return h.promise().value; }
};Generator sequence() {for (int i = 0; i < 3; ++i)co_yield i;
}int main() {auto gen = sequence();while (gen.next()) {std::cout << gen.value() << "\n";}
}
3. Ranges(范围库)
范围库提供了一组更强大和灵活的方式来操作集合,使得代码更简洁和易读。
主要特性
- 视图和适配器:范围库通过视图和适配器提供了对集合的惰性求值操作,使得可以在不复制数据的情况下进行链式操作。
- 更好的与算法结合:范围库与标准库算法结合得更加紧密,使得代码更具表达力和简洁性。
- Pipeline风格:支持通过管道操作符进行链式调用,极大地简化了代码。
示例代码
#include <iostream>
#include <vector>
#include <ranges>
#include <algorithm>int main() {std::vector<int> v = { 5, 2, 1, 3, 0, 4, 6 };// 过滤和变换范围auto result = v | std::views::filter([](int n) { return n % 2 == 0; })| std::views::transform([](int n) { return n * n; });for (int n : result) {std::cout << n << " ";}std::cout << "\n";std::ranges::sort(v);for (int x : v) {std::cout << x << " ";}
}
4. Concepts(概念)
概念用于为模板定义约束条件,提高模板的可读性和错误信息的清晰度。
主要特性
- 约束模板参数:通过概念可以为模板参数定义约束条件,从而限制模板实例化时的类型。
- 提高可读性:概念使得模板代码更具可读性,因为可以明确指出模板参数的预期行为和性质。
- 更好的错误信息:在不满足概念约束时,编译器可以提供更清晰的错误信息,便于调试。
示例代码
c#include <concepts>
#include <iostream>// 定义一个概念,约束类型必须支持加法操作
template<typename T>
concept Addable = requires(T a, T b) {{ a + b } -> std::convertible_to<T>;
};template<Addable T>
T add(T a, T b) {return a + b;
}int main() {std::cout << add(1, 2) << std::endl; // 合法// std::cout << add("Hello, ", "world!"); // 非法,不满足Addable概念
}
进程,线程,协程
关系
- 进程包含线程:一个进程可以包含一个或多个线程,线程是进程的一部分,共享进程的资源。
- 线程和协程都是实现并发的手段:线程由操作系统调度,而协程由程序自身调度。
区别
- 内存和资源:
- 进程:拥有独立的内存空间和资源。
- 线程:共享进程的内存和资源。
- 协程:在用户态下运行,通常在单个线程内实现。
- 调度和上下文切换:
- 进程:由操作系统调度,上下文切换开销大。
- 线程:由操作系统调度,上下文切换开销相对小。
- 协程:由程序自身调度,上下文切换开销最小。
- 并行和并发:
- 进程:可以在多核CPU上实现真正的并行执行。
- 线程:可以在多核CPU上实现并行执行,但需要处理同步和竞争问题。
- 协程:在单线程内实现并发处理,适用于I/O密集型任务,不适用于CPU密集型任务的并行处理。
| 进程 | 线程 | 协程 |
|---|---|---|
| 线程1 | 协程1 | 函数调用1 |
| 协程2 | 函数调用2 | |
| 线程2 | 协程3 | 函数调用3 |
| 协程4 | 函数调用4 | |
| 线程3 | 协程5 | 函数调用5 |
| 协程6 | 函数调用6 | |
| 资源 | 资源 | 资源 |
智能指针
1. std::unique_ptr
概述
- 独占所有权:
std::unique_ptr表示唯一所有权的智能指针,即一个对象只能有一个std::unique_ptr实例管理。 - 不可复制:
std::unique_ptr不可复制,但可以移动(使用std::move)。
主要特性
- 自动释放:当
std::unique_ptr超出作用域时,它所管理的对象会自动被删除。 - 轻量级:由于没有引用计数,
std::unique_ptr的开销较小。
2. std::shared_ptr
概述
- 共享所有权:
std::shared_ptr表示共享所有权的智能指针,即多个std::shared_ptr实例可以管理同一个对象。 - 引用计数:
std::shared_ptr使用引用计数来跟踪对象的使用情况,当引用计数为零时,自动删除对象。
主要特性
- 自动释放:当最后一个
std::shared_ptr超出作用域时,它所管理的对象会被删除。 - 线程安全:引用计数的增减是线程安全的。
3. std::weak_ptr
概述
- 弱引用:
std::weak_ptr是与std::shared_ptr配合使用的智能指针,用于解决循环引用问题。 - 不影响引用计数:
std::weak_ptr不会影响对象的引用计数,因此不会阻止对象的删除。
主要特性
- 观察者模式:
std::weak_ptr可以观察std::shared_ptr管理的对象,但不能直接访问对象,必须通过lock方法获取std::shared_ptr。
编程题,给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可能的分割方案。
LeetCode 131原题,同时最好也把132,1278,1745几个加强版也做了。
class Solution {
public:std::vector<std::vector<std::string>> partition(std::string s) {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::vector<std::vector<std::string>> ans;std::vector<std::string> path;int n = s.length();std::function<void(int)> dfs = [&] (int idx) {if (idx == n) {ans.push_back(path);return;}std::string tmp;for (int i = idx; i < n; ++i) {tmp += s[i];bool f = true;// 可以提前使用dp预处理,或者记忆化结果for (int i = 0; i * 2 + 1 < tmp.length(); ++i) {if (tmp[i] != tmp[tmp.size()-1-i]) {f = false;break;}}if (f) {path.push_back(tmp);dfs(i + 1);path.pop_back();}}};dfs(0);return ans;}
};
最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB
相关文章:
C++ | QQ后端暑期实习面试
tcp三次握手,四次挥手 断点续传 文件断点续传是一种机制,允许在网络传输中的文件传输过程中出现断开连接或传输中断的情况下,能够恢复传输并继续传输未完成的部分。其原理如下: 检测支持:首先,服务器端和…...
实用网站推荐
学习 前端 精简CSS格式 Font Awesome 图标库 BootCDN 加速服务 合集 AI工具集 动漫、音乐 娱乐 嗷呜动漫 奈飞同步 视频下载 B站视频解析下载 文件操作 ioDraw制作图 Convertio — 文件转换器 PDF处理 LOGO...
Linux |Nethogs 监控网络使用情况
引言 互联网上为 Linux 系统提供了许多开源的网络监控工具。例如,你可以利用 iftop 命令来监测网络带宽的消耗,使用 netstat 或 ss 命令来获取网络接口的统计信息,或者通过 top 命令来查看系统中正在运行的进程。 然而,如果你真正…...
大语言模型训练过程中,怎么实现算力共享,采用什么分片规则和共享策略
目录 大语言模型训练过程中,怎么实现算力共享,采用什么分片规则和共享策略 一、算力共享的实现 二、分片规则与共享策略 三、总结 DeepSpeed、Megatron-LM是什么 DeepSpeed ZeRO技术一般不实现调参的 ZeRO技术的实现方式 ZeRO与调参的关系 NCCL是什么 一、NCCL概…...
JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测
JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现TTAO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现TTAO-Transformer-LSTM多变量回归预测,三角拓扑聚合…...
斐波那契数列(Fibonacci)数列 c++详解
Fibonacci数列是一个在数学和计算机科学中非常著名的数列。这个数列以其特殊的递推关系而闻名,也因其在自然界中的多次出现而引人注目。 定义: Fibonacci数列的定义如下: F(0) 0F(1) 1对于 n > 1,F(n) F(n-1) F(n-2) 也就…...
第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)
第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…...
家具购物小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,家具分类管理,家具新品管理,订单管理,系统管理 微信端账号功能包括:系统首页,家具新品,家具公告࿰…...
测试面试宝典(三十四)—— token是做什么用的?
Token 在软件系统中通常具有多种重要用途。 首先,它用于身份验证和授权。用户登录成功后,系统会生成一个唯一的 token 并返回给客户端,客户端后续的请求携带这个 token 来证明其身份和访问权限,避免了每次请求都需要重新输入用户…...
计算机网络基础:4.HTTP与HTTPS
一、回顾设定 想象你在经营一家繁忙的餐厅,顾客们通过点餐系统(网卡)下单,订单被前台(路由器)接收并分发到各个厨房区域(网络设备)。光猫像是食材供应商,通过高效的物流系…...
【深度学习入门】安装conda/miniconda、所需包类、CUDA与conda/Miniconda间的关系
深度学习入门 须知 本教程跟随李沐老师课程随笔,课程链接点击此处。 CUDA和Anaconda的关系 CUDA Toolkit是由Nvidia官方提供的完整工具包,其中提供了Nvidia驱动程序、开发CUDA程序相关的开发工具包等。 Anaconda在安装Pytorch等会用到的CUDA的框架时…...
0725,进程间传递文件描述符,socketpair + sendmsg/recvmsg
我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎掉了我要碎…...
放大电路总结
补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…...
深度学习1-简介
人工智能(AI)旨在打造模仿智能行为的系统。它覆盖了众多方法,涵盖了基于逻辑、搜索和概率推理的技术。机器学习是 AI 的一个分支,它通过对观测数据进行数学模型拟合来学习决策制定。这个领域近年来迅猛发展,现在几乎&a…...
Java基础语法 (基础介绍 二)
目录 Java 基础语法 第一个Java程序 基本语法 Java标识符 Java修饰符 Java变量 Java关键字 Java注释 Java 空行 Java 对象和类 Java中的对象 Java中的类 构造方法 创建对象 访问实例变量和方法 实例 源文件声明规则 Java包 Import语句 一个简单的例子 Java…...
SAPUI5基础知识18 - 自定义CSS和主题色
1. 背景 在上一篇博客中,我们通过使用SAPUI5提供的CSS类实现元素间距的调整。在本篇博客中,让我们看一下如何实现自定义的CSS样式。 2. 背景知识 2.1 CSS基础语法 CSS,全称为级联样式表(Cascading Style Sheets)&a…...
Postman中API测试的艺术:测试用例复用的高级技巧
Postman中API测试的艺术:测试用例复用的高级技巧 在API测试过程中,复用测试用例可以显著提高测试效率和一致性。Postman作为一个强大的API开发工具,提供了多种机制来实现测试用例的复用。本文将深入探讨Postman中API测试用例复用的技巧&…...
Flutter Geocoding插件使用指南:简化地理编码与逆地理编码
Flutter Geocoding插件使用指南:简化地理编码与逆地理编码 简介 geocoding 是一个Flutter插件,提供了简便的地理编码(将地址转换为经纬度坐标)和逆地理编码(将经纬度坐标转换为地址)功能。它利用了iOS和A…...
“手撕”全网最细的JDBC教程(安装导入使用)
目录 一、什么是JDBC 二、JDBC的安装 三、JDBC如何导入 四、怎么使用JDBC编写代码 一、什么是JDBC JDBC由Java提供给数据库的一组通用的API。 在平常的业务中,是比较少使用像cmd命令行来操作数据库的,更多的是操作代码(Pythonÿ…...
C++指针选择题带答案
1、有如下语句int a10,b20,*p1,*p2;p1&a;p2&b;如图1所示,若要实现图2所示的存储 结构,可选用的赋值语句是___________。 A)*p1*p2; B)p1p2; C)p1*p2; D)*p1p2; 2、变量的指针,其含义是该…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
