欢迎来到小面包的小站🥝
h264封装到RTP数据包进行传输
介绍h264视频编码及其RTP封装传输相关知识
RTSP协议
RTSP协议及相关协议介绍
协程八股
实现 这是一个基于 ucontext 的轻量级协程库,实现了 用户态上下文切换,支持 非抢占式协程调度。核心包括 协程管理(Routine) 和 调度器(Schedule),采用 FIFO 调度策略,协程通过 resume() 切换到运行态,yield() 挂起并交回调度器。 利用 swapcontext() 进行 寄存器和栈的上下文切换,避免线程切换的内核态开销。 支持 动态栈管理,通过 栈快照(memcpy 保存栈数据) 实现挂起与恢复。 适用于 高并发 IO 场景,可扩展为 epoll 事件驱动 结合 异步 IO。 后续优化方向: 多线程支持(work-stealing) 使用 boost::context 提升可移植性 优化调度算法 亮点 纯用户态调度,低开销,高效执行 swapcontext() 仅涉及 寄存器和栈切换,比 std::thread 的调度更轻量。 使用非抢占式调度,确保任务可控 采用栈快照(memcpy 备份数据) 在 yield() 时存储当前执行状态,resume() 时恢复。 避免 setjmp/longjmp 传统方法的局限性,提 ...
使用 vcpkg 运行 redis++ 遇到的问题
问题描述 使用 vcpkg 安装 redis++ 库后,发现该库并没有 .cmake 文件,导致 find_package 无法找到它。 现象分析 通过 ls 命令查看: 1ls /root/vcpkg/installed/x64-linux/lib 可以确认 redis++ 确实已经安装,并且在代码中可以跳转到对应的定义文件。但由于缺少 CMake 配置文件,只能手动指定路径进行连接。 解决尝试 尝试手动指定库路径,但在链接时遇到错误,提示找不到某些函数定义,怀疑是动态库和静态库混用的问题。然而最终仍然没有找到具体原因。 结果总结 好消息:redis++ 通过手动指定路径找到了。 坏消息:仍然无法正确链接,可能与库的静态/动态方式混用有关。 最后还是没能解决这个问题,先摆烂了 😭。
使用 C++ 运行 Kafka 和 Elasticsearch
Elasticsearch 处理方式 Elasticsearch 通常直接使用 HTTP 报文通信,因此不需要额外下载 C++ 库,直接通过 HTTP 请求即可进行操作。 Kafka 处理方式 Kafka 我使用的是 vcpkg 提供的包,但和之前遇到的问题一样,find_package 无法直接找到,所以还是手动加入了库的路径。 遇到的问题 AI 帮的倒忙 在调用某个接口时,AI 生成的代码少了两个参数,导致无法正常执行。最后还是我自己手动跳转到定义里查看并修正了。 Docker Compose 启动多个容器 我使用 docker-compose 一键启动了多个服务,包括 Redis、Kafka 等,但在尝试运行时,Kafka 无法正确收到消息,导致程序无法正常工作。 最终解决方案 去 CSDN 找了代码,终于能正常执行了,AI 这次还是不行 😓。 总结 Elasticsearch 直接用 HTTP 通信,无需额外的 C++ 库。 Kafka 需要手动指定路径才能使用。 docker-compose 方便管理多个容器,但 Kafka 运行过程中可能遇到无法接 ...
消息队列的基础编写
1. 任务封装 首先实现了 Task 类,这是一个简单的包裹类,仅包含任务的 名称 和 参数列表,用于封装任务信息。 2. 任务处理器设计 为了让任务处理更加模块化,我设计了 任务处理器抽象基类,所有具体任务处理方法都需要继承该基类,并重写 process 函数,以实现具体任务的处理逻辑。 3. 处理器注册机制 然后实现了 处理器注册类,用于管理不同任务处理器的映射关系: Key:任务名称 Value:对应的任务处理器类 当需要处理 Task 时,会从注册类中获取与 Task 名称对应的处理器,并传入 Task 进行执行。 示例流程: 如果 Task 是 A 类型,注册类会找到 A 处理器,然后将 Task 传入处理器以获取参数列表并执行。 4. 单元测试 代码编写完成后,学习并使用 Google Test(GTest) 进行单元测试,以验证任务队列的正确性。 总结 Task 作为基础封装类,仅存储名称和参数列表。 任务处理器通过继承基类实现 process 方法。 处理器注册类维护任务名称到处理器的映射,实现动态调用。 使用 Google Test 进行单元测试,提高代码的可 ...
Kafka 基础知识总结
1. Kafka 应用场景 Kafka 作为一款高吞吐的分布式消息系统,适用于多种应用场景: 消息队列:用于解耦生产者和消费者,提高系统的伸缩性。 日志收集:集中存储和处理系统日志,方便分析和监控。 流计算:处理实时数据流,将数据传输给实时计算系统进行计算。 事件溯源:记录事件发生的历史,以便后续回溯和分析。 Metrics 采集:收集和存储系统的监控指标数据。 2. Kafka 组件介绍 Kafka 由多个核心组件组成: 生产者(Producer):负责将消息发送到 Kafka。 消费者(Consumer):从 Kafka 读取消息进行处理。 消息代理(Broker):存储和管理消息,负责接收、存储和转发数据。 协调器(Zookeeper):提供分布式协调和管理任务。 主题(Topic):类似广播频道,生产者将消息发送到指定的 Topic,消费者从 Topic 读取消息。 创建 Topic 命令示例: 1kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-facto ...
docker一点小记录
Docker 基础使用 1. Docker 组件 Docker 主要由以下三个核心组件组成: 镜像(Image):类似于软件的 蓝图,定义了容器运行所需的环境。 容器(Container):基于镜像创建的 实例,可以运行应用。 引擎(Engine):Docker 的 核心管理组件,负责容器的创建、运行、管理等。 2. 如何构建镜像(Blueprint) 编写 Dockerfile 定义镜像构建过程。 构建镜像:1docker build -t my_image . 发布镜像: 登录 Docker Hub:1docker login 推送镜像:1docker push my_image 使用镜像: 运行容器:1docker run -d --name my_container my_image 使用 Docker 执行 CI/CD Docker 可与 Jenkins、GitHub Actions 结合使用,实现 CI/CD: Jenkins + Docker:用于企业级 CI/CD 自动化部署。 GitHub Actions(适用于个人小项目/免费方案) ...
redis八股文
123456789101112131415161718# Redis 基础使用## 进入 Redis 终端使用 `redis-cli` 进入 Redis 交互终端。## Redis 支持的数据类型Redis 支持五种数据类型:- **String**- **Hash**- **List**- **Set**- **Sorted Set(有序集合)**### 1. String```shset name mikeget namedel name 2. Hash 1234hset user name Alicehget user namehgetall userhdel user name PS: user 在这里是表名,name 是 key。 3. List 12345lpush queue taskrpush queue tasklpop queuerpop queuelrange queue 0 -1 PS: -1 表示倒数第一个,lrange queue 0 -1 表示遍历从 0 到最后一个元素。 4. Set 12345sadd myset asadd myset bsa ...
linux一些好用的操作
Linux 知识整理 软硬链接的区别 硬链接 硬链接更像是创建出了 shared_ptr 智能指针,原链接和硬链接都变成智能指针,删除其中一个不会使得文件失效。但是: 不能跨文件系统 不能链接目录 创建硬链接: 1ln file.txt file_link.txt 软链接 软链接就像是原来文件的引用,删除原文件就会导致变成空悬链接(Dangling Link)。 创建软链接: 1ln -s file.txt file_link.txt 使用 crontab crontab 可用于定时执行任务,常见操作如下: 查看某个进程的使用情况 使用 ps 命令 1ps -p 1234 -o %mem,%cpu,vsz,rss %mem:查看进程使用的内存占比 %cpu:查看进程占用的 CPU vsz:查看虚拟内存大小 rss:查看常驻内存大小 使用 top 命令 1top -p 1234 PR:进程优先级 NI:进程 Nice 值 VIRT:虚拟内存总量 RES:物理内存 SHR:共享内存 S:进程状态 COMMAND:执行的具体命令 改变用户权限 使用 chmod 命令修改文件 ...
MySQL 进阶与架构优化
MySQL 事务与锁 锁的类型 行级锁:锁住一行数据,提高并发能力。 表级锁:锁住整个表,适用于大批量操作。 意向锁:表级别的标记,用于加速行锁检测。 乐观锁:不加锁,依赖版本号控制并发更新。 悲观锁:先锁后操作,适用于高并发竞争场景。 死锁的处理 MySQL 死锁检测:自动回滚代价最小的事务。 手动 KILL 事务:手动终止长时间阻塞事务。 优化索引与 SQL 语句:减少锁冲突,降低死锁概率。 MySQL 读写分离与主从同步 主从架构:主库处理写操作,从库处理读操作。 Binlog 实现主从同步: 主库记录 Binlog。 从库读取 Binlog 并重放。 避免主从同步延迟: 关键业务查询主库。 二次查询策略(从库查不到再查主库)。 分库分表策略 水平拆分 水平分表:将一张大表拆成多张小表(如 users_0, users_1)。 水平分库:多个数据库存相同结构的表,降低单库压力。 垂直拆分 垂直分表:将一张表的不同字段拆成多张表(如 user_base 和 user_detail)。 垂直分库:不同业务数据存入不同数据库(如 order_db 和 us ...
MySQL 核心知识点整理
MySQL 数据排序 MySQL 的数据排序主要有两种方式: 有索引:直接按照索引排序。 无索引:采用文件排序。 数据量少:内存排序,使用单路或双路排序(类似于用一只手或两只手抓数据)。 数据量大:磁盘排序,通常采用归并排序。 SQL 语句的执行顺序 连接器校验权限。 分析器解析 SQL 语法,构建解析树。 优化器选择合适的索引和表连接顺序,生成多个执行计划,选择成本最低的执行。 执行器调用存储引擎查询数据并返回。 MySQL 的存储引擎 InnoDB:支持事务、行级锁、外键,默认存储引擎。 MyISAM:不支持事务,读取性能高,适合查询密集型业务。 MySQL 索引类型 普通索引(辅助索引):提升查询效率,但不保证唯一性。 主键索引(聚簇索引):数据存储在 B+ 树叶子节点,查询效率高。 唯一索引:确保字段值唯一,查询速度快。 联合索引:多个字段组合建立索引,遵循最左前缀匹配原则。 全文索引:适用于长文本的模糊查询。 空间索引:存储地理位置信息,如经纬度。 MySQL 事务 事务的实现 锁:确保数据一致性,避免并发冲突。 undo log:记录事务前的数据,回 ...
avatar
🐟认真摸鱼中
小面包🥝
Future is now 🍭🍭🍭
前往小窝
公告栏
欢迎来到小面包的博客!🎉
最新通知:
  • 网站正在持续更新中...
  • 如有问题请留言交流
空降评论复制本文地址
随便逛逛昼夜切换关于博客美化设置切换全屏打印页面