当前位置: 首页 > news >正文

【项目日记】高并发服务器项目总结

在这里插入图片描述

生活总是让我们遍体鳞伤,
但到后来,
那些受伤的地方一定会变成我们最强壮的地方。
-- 《老人与海》--

高并发服务器项目总结

  • 模块关系图
  • 项目工具模块
    • 缓冲区模块
    • 通用类型模块
    • 套接字socket模块
    • 信道Channel模块
    • 多路转接Poller模块
  • Reactor模块
    • 时间轮TimeWheel模块
  • 连接Connection模块
  • Accepter模块
  • TcpServer模块

模块关系图

在这里插入图片描述

项目工具模块

缓冲区模块

底层使用字符容器储存数据,通过两个指针:读偏移和写偏移管理空间:

  • 对于写入:确保空间足够,在写偏移后拷贝数据,写偏移向后移动
  • 对于读取:确保可读数据足够,在读偏移后读取数据,读偏移向后移动
  • 空间不足时及时扩容

通用类型模块

想要实现的效果:

Any a;
a = 123;
a = "123"
a = vector<int>(n , 0);

为了实现这种效果,首先Any类肯定不能带有模版参数,不然就不能自由转换了!

  • 可以在内部设计一个内部类placeholder(继承holder父类),它是一个模板类,是实际储存数据的对象;
  • 当我们创建了一个Any对象时,会创建一个父类指针,管理placeholder对象
  • 通过模版函数,我们可以实现对placeholder对象赋值。
  • 可以通过交换placeholder对象管理的资源实现自由赋值。

套接字socket模块

这个模块对外提供一键创建服务端套接字和客户端套接字的方法(是对内部接口的一个封装):

  • 创建套接字接口:以数据流的方式创建一个套接字文件
  • 绑定端口信息
  • 进入监听模式
  • 发起连接:组织目标端口信息,进行申请连接
  • 启动地址重用:可以快速重启服务,跳过系统释放端口的时间;允许多个 socket 监听相同的地址和端口;避免地址已在使用错误。
  • 设置非阻塞读取

对外提供的接口

  1. 构建服务端套接字:创建套接字,设置为非阻塞,将地址与端口设置为可重用,绑定地址信息,进行监听。
  2. 构建客户端套接字:创建套接字,连接服务器
  3. 发送数据
  4. 接收数据

信道Channel模块

该模块是用来管理一个文件描述符的,对该描述符的事件进行监控,触发事件就调用对应的回调函数:

  • 当前需要监控的事件集
  • 当前连接触发的事件集
  • 管理该文件描述符的Reactor模型(EventLoop)
  • 可读事件触发的回调函数
  • 可写事件触发的回调函数
  • 错误事件触发的回调函数
  • 断开事件触发的回调函数
  • 任意事件触发的回调函数

提供一系列接口帮助我们管理对该文件描述符的监控。触发事件通过HandleEvent()函数进行处理。

多路转接Poller模块

该模块是对epoll接口的二次封装,管理一系列的文件描述符。内部储存文件描述符与其对应的信道Channel;
可以通过信道对epoll中监控的文件描述符进行更新监控事件集
提供一个开始监控接口Poll,该函数中阻塞式等待事件就绪。得到就绪事件就进行将就绪事件更新到对应的信道中,然后将信道放入活跃队列中等待上层处理。

Reactor模块

时间轮TimeWheel模块

时间轮模块是用来执行定时任务的,项目中可以用来管理超时连接,及时进行释放操作。
为了可以实现定时执行任务,首先需要对封装出一个任务对象Timer:

  • 任务ID uint64_t _id :用来标识任务
  • 超时时间 uint32_t _timeout;
  • 是否被取消:bool _canceled; 这样取消任务时,通过哈希表找到对应任务,设置该标志位就好了,效率高!
  • 回调任务 _task_cb void()类型
  • 释放操作函数 _release :用于删除TimeWheel保存的定时器对象信息
  • 任务释放时执行回调函数

时间轮TimeWheel的本质是一个数组,一个指针定时移动,到哪里就释放该位置的所有任务Timer。

class TimeWheel
{using TaskPtr = std::shared_ptr<Timer>;using WeakPtr = std::weak_ptr<Timer>; // 辅助shared_ptr 不会增加引用计数
private:int _capacity;                                 // 最大容量 表盘最大数量(默认60秒)int _tick;                                     // 移动表针std::vector<std::vector<TaskPtr>> _wheel;      // 时间轮std::unordered_map<uint64_t, WeakPtr> _timers; // 定时任务对象哈希表int _timerfd;                            // 定时器fdEventLoop *_loop;                        // 对应的Eventfdstd::unique_ptr<Channel> _timer_channel; // 管理_timerfd的channel类!//...
}

这里使用智能指针进行管理,方便操作。引用计数归零时自动释放。设置一个timefd,系统每1s都会想其中写入一个1。读取到数据,就移动指针,释放该时间的定时任务指针。
EventLoop模块
该模块是真正的Reactor模型,管理一下数据:

    std::thread::id _event_id;               // 线程IDint _eventfd;                            // eventfd 用于通知事件std::unique_ptr<Channel> _event_channel; // 管理Event事件的Channel对象Poller _poller;                          // epoll模型std::vector<Functor> _tasks; // 任务池std::mutex _mtx;             // 互斥锁保护线程TimeWheel _timer_wheel; // 时间轮

该模块的执行逻辑为:

  • 通过EventLoop模块通过的接口可以添加管理的信道(文件描述符)
  • 启动监控后,对epoll中的文件描述符进行事件监控。
  • Poller模块Poll函数中返回就绪的活跃信道集。
  • 对每个活跃信道执行handleEvent处理就绪事件
  • 对于外部设置的任务,需要保证是在该eventloop所在线程内部执行,如果不是放入任务池中等待执行。

EventLoop模块与TimeWheel模块整合
Reactor模型内部加入一个时间轮,负责执行超时连接销毁任务,对外提供接口:

  1. Void TimerAdd(uint64_t id, int delay, Task_t cb):加入定时任务
  2. void TimerRefresh(uint64_t id):刷新定时任务
  3. void TimerCancel(uint64_t id):取消定时任务
  4. bool HasTimer(uint64_t id):判断是否有该任务

连接Connection模块

连接模块是对上面模块的整体整合,具有以下参数:

    uint64_t _conn_id;           // connection连接IDSocket _socket;              // 管理的套接字int _sockfd;                 // 套接字fdEventLoop *_loop;            // connection连接关联的EventLoop对象Any _context;                // 上下文数据Channel _channel;            // 管理连接事件Buffer _in_buffer;           // 输入缓冲区 存放Socket中读取的数据Buffer _out_buffer;          // 输出缓冲区 存放要发送给对端的数据bool _enable_active_release; // 是否开启超时销毁 默认是falseConnStatu _statu;            // Connection连接状态// 5 个 回调函数 --- 注意使用智能指针 防止在执行任务之前Connection销毁using ConnectedCallBack = std::function<void(const PtrConn &)>;         // 连接时进行的回调函数using MessageCallBack = std::function<void(const PtrConn &, Buffer *)>; // 处理数据时的回调函数using ClosedCallBack = std::function<void(const PtrConn &)>;            // 关闭连接时的回调函数using AnyEventCallBack = std::function<void(const PtrConn &)>;          // 处理任意事件时的回调函数ConnectedCallBack _conn_cb;  // 连接回调函数类型MessageCallBack _message_cb; // 处理时回调函数ClosedCallBack _closed_cb;   // 关闭阶段的回调AnyEventCallBack _event_cb;  // 任意事件触发的回调// 还需要组件内的连接关闭回调 因为服务器组件内会把所有的连接管理起来 一旦某个连接关闭 就应该从管理的地方移除自己的信息!ClosedCallBack _event_closed_cb;
  • 该连接管理的底层套接字
  • 管理该套接字的信道:用于处理新连接事件
  • 连接关联的EventLoop模块,用于事件监控
  • 通用类型上下文
  • 输入/输出缓冲区
  • 新连接/处理消息/关闭连接/任意事件 回调函数
  • 连接内部连接关闭函数

内部提供的函数:

  1. 首先是该连接内部遇到事件的函数,作为信道的回调函数
    • 读事件回调函数
    • 写事件回调函数
    • 关闭事件回调
    • 错误事件回调
  2. 线程内发送数据函数
  3. 线程内关闭连接函数
  4. 线程内启动超时管理函数:将该连接的释放函数Release放入EventLoop的时间轮中
  5. 线程内取消超时管理函数
  6. 线程内更新回调函数(协议)
  7. 线程内释放函数ReleaseInLoop(真正的释放函数):修改连接状态,取消定时任务,执行用户设置的关闭连接回调函数,通过内部释放回调函数释放在连接在服务器内的资源。

对外提供的接口:

  1. 基础接口:返回连接id,套接字fd…
  2. 设置回调函数接口
  3. 发送数据接口:在EventLoop中加入发送任务
  4. 关闭连接接口:在EventLoop中加入关闭连接任务
  5. 启动超时销毁接口:在EventLoop中加入启动超时销毁任务
  6. 取消超时销毁接口:在EventLoop中加入取消超时销毁任务
  7. 切换协议接口:在EventLoop中加入取消切换协议任务

Accepter模块

该模块是对监听套接字进行管理的:

    Socket _socket;   // 套接字对象EventLoop *_loop; // 对监听套接字进行事件监控Channel _channel; // 用于对管理监听套接字的事件using AcceptCallBack = std::function<void(int)>;AcceptCallBack _accept_callback;

不同于不同的套接字文件,监听套接字只需要读取事件的回调函数,从监听套接字中读取出新连接的fd,然后对该fd执行获取连接的回调函数。

线程池模块
我们先对线程进行封装,使其包含EventLoop模块。线程中需要执行的函数就是创建一个EventLoop,然后执行Start监控。

线程池对若干个线程进行管理:

    int _thread_size;                   // 从属线程数量int _next_idx;                      // 线程索引std::vector<LoopThread *> _threads; // 管理从属线程std::vector<EventLoop *> _loops;    // 管理从属ReactorEventLoop *_baseloop;               // 主Reactor

每次取出一个线程对外提供时,只需提供线程对应的EventLoop即可

TcpServer模块

这个模块就是最终的服务器模块。主Reactor对监听套接字的进行管理,获取到新连接后就将连接交给一个线程中的从属Reactor进行监控。进而实现高并发的服务器!

该模块管理的成员变量:

    uint64_t _conn_id;                            // 自增长的连接ID;int _port;                                    // 绑定的端口号EventLoop _baseloop;                          // 主Reactor模型Acceptor _acceptor;                           // 监听套接字LoopThreadPool _pool;                         // 从属线程池std::unordered_map<uint64_t, PtrConn> _conns; // 管理连接的哈希表int _timeout;                                 // 超时时间bool _enable_active_release;                  // 是否开启超时销毁 默认是false// 4种 回调函数 --- 注意使用智能指针 防止在执行任务之前Connection销毁using ConnectedCallBack = std::function<void(const PtrConn &)>;         // 连接时进行的回调函数using MessageCallBack = std::function<void(const PtrConn &, Buffer *)>; // 处理数据时的回调函数using ClosedCallBack = std::function<void(const PtrConn &)>;            // 关闭连接时的回调函数using AnyEventCallBack = std::function<void(const PtrConn &)>;          // 处理任意事件时的回调函数ConnectedCallBack _conn_cb;  // 连接回调函数类型MessageCallBack _message_cb; // 处理时回调函数ClosedCallBack _closed_cb;   // 关闭阶段的回调AnyEventCallBack _event_cb;  // 任意事件触发的回调
  1. 提供给Accepterd的回调函数NewConnection,在该函数中对连接赋予一个id,并设置连接的回调函数,将该连接交给线程池中的一个线程进行监管,启动对应的超时销毁任务。
  2. 提供连接的内部释放函数RemoveConnection,销毁连接在服务器中的资源
  3. 提供给上层的设置回调函数接口
  4. 服务器开始运行:启动服务器套接字的监听,创建线程池,开启主Reactor的监控。

相关文章:

【项目日记】高并发服务器项目总结

生活总是让我们遍体鳞伤&#xff0c; 但到后来&#xff0c; 那些受伤的地方一定会变成我们最强壮的地方。 -- 《老人与海》-- 高并发服务器项目总结 模块关系图项目工具模块缓冲区模块通用类型模块套接字socket模块信道Channel模块多路转接Poller模块 Reactor模块时间轮Tim…...

P1332 血色先锋队(BFS)

题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&#xff0c;以抵…...

systemd 与 SysVinit

1. 什么是 systemd 和 SysVinit&#xff1f; systemd 和 SysVinit 都是 Linux 的初始化系统&#xff08;init system&#xff09;&#xff0c;用于管理系统启动、服务、进程和日志。 比较项SysVinitsystemd启动方式逐步启动&#xff08;串行&#xff09;并行启动&#xff08;…...

PythonWeb项目-Django+vue白酒数据推荐系统功能介绍

❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目源…...

AWS Bedrock:开启企业级生成式AI的钥匙【深度解析】

引言&#xff1a;生成式AI的工业革命需要新基建 根据Gartner预测&#xff0c;到2026年超过80%的企业将在生产环境中部署生成式AI。而AWS Bedrock作为首个企业级生成式AI托管平台&#xff0c;正在重塑AI工业化落地的技术范式。本文将深入解构其技术架构与商业价值。 一、Bedroc…...

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…...

【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!

本文基于之前的一个旅游网站&#xff0c;实现 Django 连接 vue3&#xff0c;使 vue3 能携带 CSRF Token 发送 axios 请求给后端&#xff0c;后端再响应数据给前端。想要源码直接滑倒底部。 目录 实现效果 解决跨域 获取 csrf-token 什么是 csrf-token &#xff1f; CSRF攻击的…...

网络安全·第一天·IP协议安全分析

本篇博客讲述的是网络安全中一些协议缺陷以及相应的理论知识&#xff0c;本博主尽可能讲明白其中的一些原理以及对应的防卫措施。 学习考研408的同学也能进来看看&#xff0c;或许对考研有些许帮助&#xff08;按照考研现在的趋势&#xff0c;年年都有新题目&#xff0c;本文当…...

TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入

TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入 0. 前言1. 字符嵌入2. 字词嵌入3. 句子嵌入和段落嵌入相关链接 0. 前言 在自然语言处理中&#xff0c;嵌入 (Embedding) 技术是将文本转化为数值向量的核心方法&#xff0c;使计算机能够理解和处理语言中的…...

剖析AI与5G:是夸大其词,还是时代变革的引擎?-优雅草卓伊凡

剖析AI与5G&#xff1a;是夸大其词&#xff0c;还是时代变革的引擎&#xff1f;-优雅草卓伊凡 在当今科技飞速发展的时代&#xff0c;AI与5G无疑是两大备受瞩目的焦点。近日&#xff0c;一个引人深思的问题浮出水面&#xff1a;“AI是不是被夸大了&#xff0c;就像当年的5G一样…...

Python Cookbook-5.7 在增加元素时保持序列的顺序

任务 你需要维护一个序列&#xff0c;这个序列不断地有新元素加入&#xff0c;但始终处于排序完毕的状态这样你可以在任何需要的时候检查或者删除当前序列中最小的元素。 解决方案 假设有一个未排序的列表&#xff0c;比如: the_list [903, 10, 35, 69, 933, 485, 519, 37…...

Ubuntu18系统安装

1、虚拟机安装 请参照之前的《虚拟机安装centos7-NAT网络模式安装》与《虚拟机安装centos7-桥接模式》 2、启动虚拟机进入系统的欢迎界面 选择English后并点击回车键(Enter) 3、进入安装页面 选择Countinue without updating并点击回车键(Enter) 4、键盘配置 选择Done并点击…...

【AIGC】零样本学习方法综述(TPAMI 2023 研究综述)

出版日期为2022年7月18日&#xff1b;工作由国家自然科学基金资助6217616年6061732011和61976141&#xff0c;部分由广东基础和应用基础研究基金资助2022A1515010791&#xff0c;部分由深圳大学自然科学基金会稳定支持计划资助号20200804193857002&#xff0c;部分由SZU的跨学科…...

Redis持久化之AOF

AOF&#xff08;Append Only File&#xff09;持久化&#xff1a;以独立日志的方式记录每次写命令&#xff0c;重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用解决了数据持久化的实时性。 1.使用AOF 开启AOF需要设置配置文件&#xff1a; appendonly yes…...

QT6(12)3.3.1 Qt元对象系统概述:QObject 类与 QMetaObject 类,类型转换 qobject_cast<T>()。

&#xff08;33&#xff09;Qt元对象系统概述&#xff1a; QObject 类&#xff1a; 以及&#xff1a; 老师带咱们学生测试一下&#xff1a; 谢谢老师 &#xff08;34&#xff09;类型转换 qobject_cast( ) &#xff1a; 来自 一言的教导&#xff1a; &#xff08;35&#x…...

Electron使用WebAssembly实现CRC-32 STM32校验

Electron使用WebAssembly实现CRC-32 STM32校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 STM32格式校验的方式。 CRC-32 STM32校验函数WebAssembly源文件 C语言实…...

C++11QT复习 (十五)

文章目录 Day10 标准模板库学习笔记&#xff08;2025.04.02&#xff09;一、函数和数组能否放入 STL 容器&#xff1f;1. 引用不能直接作为容器元素类型✅ 推荐做法&#xff1a;使用 std::reference_wrapper<T> 2. 函数不能直接作为容器元素类型✅ 推荐做法一&#xff1a…...

文件存储的路径简单分析

filename file_pic.filename pic /static/img/filename # 将文件的名称存储在数据库中&#xff0c;方便调取 p_file os.path.join(/home/enen/ee/static/img, filename) file_pic.save(p_file) # 保存文件到指定目录&#xff0c;具体项目是要根据项目的存储地址来看的…...

汽车与航空航天领域软件维护:深度剖析与未来展望

一、引言 在当今科技飞速发展的时代&#xff0c;汽车和航空航天领域的软件应用愈发广泛和深入&#xff0c;软件已成为这些行业系统的核心组成部分。从汽车的智能驾驶辅助系统到航空航天飞行器的飞行控制软件&#xff0c;软件的可靠性、安全性直接关系到整个系统的正常运行和人…...

吉利汽车采用 EMQX 与AutoMQ联合方案构建公私有云一体化的车联网核心架构

吉利汽车集团 数字化基础架构总工程师 洪旅杭 关于吉利汽车 吉利汽车集团在中国上海、宁波、以及海外等地建有造型设计和工程研发中心&#xff0c;研发实力雄厚。在中国、马来西亚建有世界一流的现代化整车和动力总成制造工厂&#xff0c;拥有各类销售网点超过 1400 多家&…...

深圳漫云科技户外公园实景儿童剧本杀小程序:开启亲子互动新纪元

在亲子娱乐需求日益增长的当下&#xff0c;深圳漫云科技推出的户外公园实景儿童剧本杀小程序&#xff0c;凭借其创新玩法与丰富功能&#xff0c;为亲子家庭带来全新体验。该小程序融合户外探险、角色扮演与逻辑推理&#xff0c;不仅满足孩子好奇心&#xff0c;更提升其思维能力…...

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现&#xff1f;本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式&#xff08;Registry Pattern&#xff09;抽象工厂进行基本逻辑定义具体工厂进行对接…...

借助 AI 工具使用 Python 实现北京市店铺分布地理信息可视化教程

一、项目概述 本项目通过 Python 的pyecharts库&#xff0c;结合 AI 工具辅助代码编写与逻辑梳理&#xff0c;实现北京市店铺数量分布及区域连线的地理信息可视化&#xff0c;最终生成交互式地图图表。 二、准备工作 1. 环境与工具 Python 环境&#xff1a;确保已安装 Pyth…...

如何选择优质的安全工具柜:材质、结构与功能的考量

在工业生产和实验室环境中&#xff0c;安全工具柜是必不可少的设备。它不仅承担着工具的存储任务&#xff0c;还直接影响工作环境的安全和效率。那么&#xff0c;如何选择一个优质的安全工具柜呢&#xff1f;关键在于对材质、结构和功能的考量。 01材质&#xff1a;耐用与防腐 …...

使用Vue、Nodejs以及websocket搭建一个简易聊天室

简易聊天室 说在前面效果展示websocketwebsocket的由来websocket的特点 vue前端静态结构效果代码 点击切换用户以及该用户高亮实现思路效果展示 发送消息功能效果展示 连接服务端 Nodejs服务器端实现步骤代码 说在前面 在学习计算机网络的时候&#xff0c;看到了websocket这个…...

node.js使用pnpm运行时报错“Command failed with exit code 1.“怎么办

目录 遇到的问题 问题排查 遇到的问题 在使用pnpm dev运行时报错"Command failed with exit code 1." 如图 问题排查 是先使用pnpm install指令进行安装 然后使用pnpm dev&#xff0c;出现的问题 查看版本号node 发现是版本号高了 将node_modules文件夹删除 通…...

从GPU加速到深度学习革命 —— AlexNet论文概述

广泛认为&#xff0c;将显卡&#xff08;GPU&#xff09;用于深度学习模型训练这一突破性发现&#xff0c;主要归功于2012年发表的经典论文《ImageNet Classification with Deep Convolutional Neural Networks》。在这篇论文中&#xff0c;Alex Krizhevsky、Ilya Sutskever 和…...

视频分析设备平台EasyCVR打造汽车门店经营场景安全:AI智慧安防技术全解析

一、方案背景 某电动车企业不停爆出维权新闻&#xff0c;支持和反对的声音此起彼伏&#xff0c;事情不断发酵、反转&#xff0c;每天都有新消息&#xff0c;令人目不暇接。车展、车店作为维权事件的高发场所&#xff0c;事后复盘和责任认定时&#xff0c;安防监控和视频监控平…...

Python•判断循环

ʕ⸝⸝⸝˙Ⱉ˙ʔ ♡ 判断🍰常用的判断符号(比较运算符)andor括号notin 和 not inif-elif-else循环🍭计数循环 forrange()函数简易倒计时enumerate()函数zip()函数遍历列表遍历元组遍历字符串遍历字典条件循环 while提前跳转 continue跳出循环 break能量站😚判断🍰 …...

导入python包模块时报错Segmentation fault (core dumped)的解决思路

一、问题概述 有时候我们在Linux环境下执行代码时&#xff0c;会莫名奇妙出现Segmentation fault (core dumped)这个报错&#xff0c;很难定位到问题&#xff0c;就算定位到了&#xff0c;如果发现是导包的问题&#xff0c;也很难判断。所以记录下相关解决方式&#xff0c;以待…...

tcp转串口

windows 在 Windows 系统上&#xff0c;可以使用以下成熟的串口转 TCP 工具&#xff1a; HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虚拟串口和网络通信。下载地址&#xff1a;HW Group com0com com2tcp 开源工具&#xff0c;支持虚拟串口和 TCP…...

杂谈:抖音双塔召回模型:亿级内容分发的数学魔法

在信息爆炸的数字时代&#xff0c;我们每天都被海量内容包围。以抖音为例&#xff0c;这个日活跃用户数亿的平台&#xff0c;每分钟就有数以万计的新视频上传。面对如此庞大的内容库&#xff0c;一个核心问题自然浮现&#xff1a;系统如何从这浩瀚的内容海洋中&#xff0c;为每…...

Set 集合

默认情况下&#xff0c; Scala 使用的是不可变集合&#xff0c; 如果你想使用可变集合&#xff0c; 需要引用 scala.collection.mutable.Set Set 默认是不可变集合&#xff0c;数据无序 数据不可重复 遍历集合 创建可变集合 mutable.Set 打印集合 集合添加元素 向集合中…...

青蛙吃虫--dp

1.dp数组有关元素--路长和次数 2.递推公式 3.遍历顺序--最终影响的是路长&#xff0c;在外面 其次次数遍历&#xff0c;即这次路长所有情况都更新 最后&#xff0c;遍历次数自然就要遍历跳长 4.max时时更新 dp版本 #include<bits/stdc.h> using namespace std; #def…...

加油站小程序实战教程08用户注册

目录 1 授权手机号2 前端调用API总结 上一篇我们介绍了小程序的登录功能&#xff0c;当用户未注册的时候&#xff0c;点击自动加油按钮会弹出授权手机号&#xff0c;然后进行注册&#xff0c;本篇我们介绍一下用户注册的开发过程。 1 授权手机号 微搭提供了小程序手机号获取的…...

进程内存分布--之showmap呈现memory-layout.cpp内存分布

上一篇我们讲了&#xff1a;进程内存分布--之pmap呈现memory-layout.cpp内存分布 我们这里讲一个用于分析内存占用的更直观的方式&#xff0c;showmap来看看会是什么呈现效果&#xff1a; 我们再来使用showmap命令来看下它是怎么呈现内存分布的&#xff1a; 可以看到showmap…...

vim/vi程序(1)

今天我们来学习一下一个编辑器,vim(vi是以前的版本),这个是linux常用的编辑器,我们是必须要学习滴,来看. 各种模式示意图&#xff1a; 案例&#xff1a; vim aaa.txt 按i进入编辑模式,此时可以输入 按ESC可以退出 :进入命令模式 输入wq保存并退出 今天大家先简单了解一下基础…...

【Python】案例:计算股票收益率和波动率

【Python】案例&#xff1a;计算股票收益率和波动率&#xff1a; 1、案例需求2、数据准备3、案例实现 1、案例需求 在分析股票数据时&#xff0c;我们需要从这些数据中得到一些关键指标进行评估&#xff0c;比如收益率、波动率&#xff0c;其中收益率又可以细分为简单收益率和…...

从云计算到算网融合:未来已来的算力革命

一、算力网络&#xff1a;重塑数字时代的基础设施 在当今的数字世界&#xff0c;我们似乎已习惯了云计算带来的便利。然而&#xff0c;随着技术的飞速发展&#xff0c;一种全新的架构 —— 算力网络&#xff0c;正悄然崛起&#xff0c;有望彻底改变我们对计算资源的认知和利用…...

高级:消息队列面试题精讲

一、引言 消息队列在现代软件架构中扮演着至关重要的角色&#xff0c;尤其在处理高并发、系统解耦和异步通信等场景下。Kafka 和 RabbitMQ 作为两种主流的消息队列技术&#xff0c;各自具有独特的特性和适用场景。本文将深入分析 Kafka 和 RabbitMQ 的原理、使用场景及相关面试…...

大模型RAG项目实战-知识库问答助手v1版

安装 Ollama 根据官网指导&#xff0c;安装对应版本即可。 下载安装指导文档&#xff1a; handy-ollama/docs/C1/1. Ollama 介绍.md at main datawhalechina/handy-ollama 注意&#xff1a;在 Windows 下安装 Ollama 后&#xff0c;强烈建议通过配置环境变量来修改模型存储…...

【云计算】打造高效容器云平台:规划、部署与架构设计

引言 随着移动互联网时代的大步跃进&#xff0c;互联网公司业务的爆炸式增长发展给传统行业带来了巨大的冲击和挑战&#xff0c;被迫考虑转型和调整。对于我们传统的航空行业来说&#xff0c;还存在传统的思维、落后的技术。一项新业务从提出需求到立项审批、公开招标、项目实…...

AI智慧共治新未来——社会综合治理智慧化系统

针对社会综合治理中乱倒垃圾、乱停车、乱贴广告等不文明行为的识别与处置难题&#xff0c;“社会综合治理智慧化系统”融合“技防人防共治”理念&#xff0c;通过人工智能、智能监控与数据驱动的综合手段&#xff0c;构建了一套高效、智能、可扩展的城市治理工具。以下是系统的…...

MySQL学习笔记(四)——DML和DQL

目录 1. DML 1.1 添加数据 1.1.1 给指定字段添加数据 1.1.2 给全部字段添加数据 1.1.3 批量添加数据 1.2 修改数据 1.3 删除数据 2. DQL 2.1 基本语法 2.2 基础查询 2.2.1 查询多个字段 2.2.2 字段设置别名 2.2.3 去除重复记录 2.3 条件查询 2.4 聚合函数 2.5 …...

AWS SNS深度解析:构建高可用、可扩展的云原生消息通信解决方案

引言 在云原生架构中&#xff0c;高效的消息通信是系统解耦、实时响应的核心需求。AWS Simple Notification Service&#xff08;SNS&#xff09;作为一款全托管的发布/订阅&#xff08;Pub/Sub&#xff09;服务&#xff0c;为开发者提供了灵活、可靠的消息分发能力。本文将从…...

大数据(5)Spark部署核弹级避坑指南:从高并发集群调优到源码级安全加固(附万亿级日志分析实战+智能运维巡检系统)

目录 背景一、Spark核心架构拆解1. 分布式计算五层模型 二、五步军工级部署阶段1&#xff1a;环境核弹级校验阶段2&#xff1a;集群拓扑构建阶段3&#xff1a;黄金配置模板阶段4&#xff1a;高可用启停阶段5&#xff1a;安全加固方案 三、万亿级日志分析实战1. 案例背景&#x…...

阿里云域名证书自动更新acme.sh

因为阿里云的免费证书只有三个月的有效期&#xff0c;每次更换都比较繁琐&#xff0c;所以找到了 acme.sh&#xff0c;还有一种 certbot 我没有去了解&#xff0c;就直接使用了 acme.sh 来更新证书&#xff0c;acme.sh 的主要特点就是&#xff1a; 支持多种 DNS 服务商自动化续…...

HCIP第二次作业

一、拓扑图 二、需求 1.按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2.要求SW1为VLAN 2/3的主根及主网关&#xff0c;SW2为vlan 20/30的主根及主网关&#xff0c;SW1和SW2互为备份 3.上层通过静态路由协议完成数据通信过程 4.AR1为企业出口路由器 5.要求全网可达…...

数据驱动可视化实战:图表狐精准生成图表的完整数据范式

一、数据输入黄金法则 图表狐 - AI图表生成工具,在线数据可视化要求数据描述必须包含三个核心要素&#xff1a; [主体对象] [量化指标] [维度划分] 错误示例 ❌&#xff1a; "展示各部门销售额对比" 正确示例 ✅&#xff1a; "2023年Q1-Q4各部门销售额&a…...

代码随想录算法训练营第五十二天|图论专题: 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿

101. 孤岛的总面积 本题要求找到不靠边的陆地面积&#xff0c;那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋&#xff0c;然后再去重新遍历地图 统计此时还剩下的陆地就可以了。 1、从左边和后边向中间遍历 2、从上边和下边向中间遍历…...