MySQL主键与外键设计原理详解
一、主键设计基础1.1 概念定义主键是用于唯一标识表中每一行记录的特殊字段。其核心特性包括: 唯一性:表中每个主键值必须不同 非空性:主键字段不能为NULL 稳定性:主键值一旦确定不应频繁变更 在MySQL中,主键通过PRIMARY KEY语法定义,可以是单字段或组合字段。主键会自动创建聚集索引,直接影响数据存储方式。 1.2 创建示例学生课程关系模型 123456789101112## 学生表| 字段名 | 类型 | 说明 ||--------|------|------|| id | int | 主键 || name | varchar(50) | 学生姓名 |## 课程表| 字段名 | 类型 | 说明 ||--------|------|------|| id | int | 主键 || title | varchar(100) | 课程名称 || student_id | int | 外键,关联学生表id | 1.3 验证示例学生课程验证 123456789INSERT INTO students (id, name) VALUES (1,...
MYSQL 基础操作语句整理
一、查询数据操作 (SELECT)1.1 基础语法12345SELECT [DISTINCT] 字段列表|* FROM 表名 [WHERE 条件表达式] [ORDER BY 字段 [ASC|DESC]] [LIMIT 起始位置, 记录数量] 1.2 执行流程 确定数据来源 (FROM 表名);筛选符合条件的记录 (WHERE 子句);选择需要显示的字段 (SELECT 子句);对结果进行排序 (ORDER BY 子句);限制返回记录数量 (LIMIT 子句) 1.3 高级用法示例 去重查询:在 employees 表中查询所有员工不同的部门编号 12SELECT DISTINCT department_id FROM employees 条件组合查询:在 orders 表中,查询 2023 年之后下单且订单状态为 "completed" 或 "shipped" 的前 10 条订单记录,并按订单金额降序排列 123456SELECT order_id, order_amount FROM orders WHERE...
TCP 文件传输系统:事件驱动与线程池协同架构下的代码解构与设计实践
一、引言在网络通信领域,TCP 协议凭借其强大的可靠性与稳定性,成为文件传输系统的首选。本教程聚焦于基于 TCP 的多线程文件传输系统,深入剖析事件驱动与线程池协同工作的架构设计。支持双向消息交互与文件传输,由九个核心文件构成,全面覆盖网络连接建立、事件监听、线程管理以及数据传输等关键环节。 二、代码结构分析1. 文件概览 文件名 主要功能 核心函数列表 head.h 全局结构体定义与函数声明 结构体:Train(封装消息与文件传输数据)、Queue_t(定义客户端连接队列结构)、Res_t(线程池资源相关结构体);函数声明:Ready(服务器套接字初始化)、EpollAdd(将文件描述符添加到 epoll 监听列表)等 client.c 客户端主逻辑实现 main函数包含事件驱动循环,集成消息处理、连接状态管理及用户输入响应等模块,负责客户端的连接管理与数据通信。 Server.c 服务器核心逻辑 main函数基于 epoll...
Leecode 0162. Find Peak Element
162. Find Peak Element题目A peak element is an element that is strictly greater than its neighbors. Given a 0-indexed integer array nums, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks. You may imagine that nums[-1] = nums[n] = -∞. In other words, an element is always considered to be strictly greater than a neighbor that is outside the array. You must write an algorithm that runs in O(log n) time. Example...
进程间通信:pipe 与 socketpair 对比
一、pipe 机制详解1.1 管道的基本概念管道 (pipe) 是 Unix 系统中最古老的 IPC 机制之一,它通过一对文件描述符实现进程间的单向通信: 一个文件描述符用于读取数据 (fd[0]) 另一个文件描述符用于写入数据 (fd[1]) 数据在管道中以先进先出 (FIFO) 的方式传输 管道本质上是内核维护的一个缓冲区,其大小因系统而异 (通常为 64KB),当缓冲区满时,写入操作会阻塞;当缓冲区空时,读取操作会阻塞。 1.2 pipe () 系统调用12#include <unistd.h>int pipe(int pipefd[2]); 成功时返回 0,失败时返回 -1 并设置 errno pipefd[0]:读取端文件描述符 pipefd[1]:写入端文件描述符 1.3 父子进程通信实现使用 pipe 进行父子进程通信的典型流程: 创建管道 调用 fork()...
多进程文件传输服务器与客户端实现
引言本文将详细解析一个基于多进程模型的文件传输系统,该系统包含服务器端和客户端两部分。服务器端采用进程池设计模式,通过预先创建多个工作进程来处理客户端的文件请求,提高系统的并发处理能力。客户端则负责接收服务器传输的文件并显示传输进度。 一、系统整体架构该系统主要由以下几个部分组成: 服务器端: 主进程:负责监听客户端连接、管理工作进程池 工作进程:实际处理文件传输任务 进程间通信:通过 UNIX 域套接字传递文件描述符 客户端: 连接服务器 接收文件数据 显示传输进度 二、核心数据结构1. Train 结构体1234typedef struct Train{ int size; char data[1024];}Train; 功能描述:用于文件数据的传输封装 结构说明: size:表示data数组中有效数据的长度 data:存储实际的文件数据,最大为 1024 字节 2. WorkerData 结构体12345typedef struct WorkerData{ pid_t pid; int...
网络编程中的系统调用与信号处理机制
一、sendfile 系统调用解析1.1 技术要点sendfile 作为基于 Unix/Linux 操作系统的高效文件传输系统调用,其函数原型定义为: 1ssize\_t sendfile (int out\_fd, int in\_fd, off\_t \*offset, size\_t count); 各参数语义阐释如下: out_fd:数据输出目标文件描述符,常用于指向网络编程中的套接字描述符。 in_fd:数据输入源文件描述符,需支持内存映射(mmap)操作。 offset:文件读取偏移指针,设为 NULL 时启用系统默认偏移并自动更新。 count:指定待传输数据字节长度。 sendfile 的核心优势在于零拷贝技术,数据传输在内核空间完成,避免用户与内核空间的数据拷贝开销。传统 I/O 需四次上下文切换与四次数据拷贝,而 sendfile 仅需两次上下文切换和两次数据拷贝,大幅提升传输效率。 1.2 应用场景sendfile...
Leecode 0142. Linked List Cycle II
142. Linked List Cycle IIGiven the head of a linked list, return the node where the cycle begins. If there is no cycle, return null. There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail's next pointer is connected to (0-indexed). It is -1 if there is no cycle. Note that pos is not passed as a parameter. Do not modify the linked list. ...
Leecode 0019. Remove Nth Node From End of List
19. Remove Nth Node From End of ListGiven the head of a linked list, remove the nth node from the end of the list and return its head. Example 1: 12Input: head = [1,2,3,4,5], n = 2Output: [1,2,3,5] Example 2: 12Input: head = [1], n = 1Output: [] Example 3: 12Input: head = [1,2], n = 1Output: [1] 题目大意给定一个链表的头节点,要求删除链表的倒数第 N 个节点,并返回删除后的链表头节点。 解题思路可以使用双指针法高效解决这个问题,只需一次遍历: 定义两个指针 fast 和 slow,初始都指向虚拟头节点 先让 fast 指针向前移动 N 步 然后让 fast 和 slow 同时向前移动,直到 fast 到达链表末尾 此时 slow...
Leecode 0707. Design Linked List
707. Design Linked ListDesign your implementation of the linked list. You can choose to use a singly or doubly linked list.A node in a singly linked list should have two attributes: val and next. val is the value of the current node, and next is a pointer/reference to the next node.If you want to use the doubly linked list, you will need one more attribute prev to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed. Implement the MyLinkedList...
多进程并发服务器的选择与放弃
一、早期搭建原因与后续放弃原因1.1 早期搭建原因 硬件适配与稳定性保障:早期服务器开发受限于单核 CPU 与有限内存,进程池架构通过预创建固定进程,规避频繁进程操作开销,利用进程资源隔离特性,防止单业务异常拖垮整个系统。 技术成熟与高效处理:多进程编程结合epoll事件驱动模型已趋成熟,凭借epoll对活跃事件的精准处理,服务器在高并发场景下实现资源高效利用。 性能优化策略:无锁化调度与动态负载均衡,有效化解多进程资源竞争,均衡任务分配,提升服务整体处理性能。 1.2 后续放弃原因 资源管理局限:业务扩张与用户增长时,固定进程池难以适配动态负载。高并发下请求排队导致响应延迟,且进程独占内存,数量过多易造成资源浪费,灵活性不足。 切换开销较大:进程池虽减少创建销毁频率,但上下文切换仍有开销。多核时代,线程作为轻量级单元,切换开销远低于进程,更适合高并发短周期任务,削弱多进程架构优势。 新技术的冲击:Node.js、Golang 等语言框架自带高效异步 I/O 与协程模型,开发效率和性能俱佳;Nginx...
Linux 进程间文件描述符传输技术详解
导言在 Linux 系统编程中,进程间通信(IPC)是核心课题。传统 IPC 机制如管道、消息队列和共享内存各有优势,但在高性能服务器、分布式系统等场景下存在局限,亟需更灵活的通信方式。 一、文件描述符传输的原理文件描述符作为进程私有资源标识,无法直接跨进程传递。因为不同进程的文件描述符表相互独立,同一数值在不同进程中可能指向不同资源。例如父进程中文件描述符 3 指向网络套接字,直接传递数值 3 给子进程,子进程的 3 可能指向标准输入。因此,需借助 Unix 域套接字等专门 IPC 机制传递。 在 Linux 中,文件描述符是进程访问 I/O 资源的抽象句柄,默认具有进程私有性。而在高并发服务器、分布式文件系统等场景下,传递文件描述符能提升资源复用与协作效率。其实现核心是利用 Linux 辅助数据机制,常通过 socketpair 创建 UNIX 域套接字,配合 sendmsg 和 recvmsg...
多进程编程:早期服务器实现逻辑
一、核心逻辑的伪代码解释1.1 主程序逻辑1234567891011121314151617181920212223主程序开始: 打开文件"1.txt"用于读写 如果文件打开失败: 输出错误信息并退出程序 向文件中写入"nonono"字符串 如果写入失败: 关闭文件 输出错误信息并退出程序 强制将缓冲区数据写入磁盘 分配能存储3个workerData_t结构体的内存空间 如果内存分配失败: 关闭文件 输出错误信息并退出程序 调用MakeWorker函数创建3个工作进程 如果创建失败: 释放已分配的内存 关闭文件 输出错误信息并退出程序 对于每个工作进程: 等待该进程执行结束 释放内存空间 关闭文件 ...
聊天改了又改版:基于 epoll 的简易多人聊天服务器与客户端实现
导言今天是聊天室,改了又改版本,目前更改部分包括:放弃了好用但是实现复杂的链表,采用数组来实现信息存储;时间结构采用ctime函数;用epoll代替select;生成历史记录文件等。 本代码实现的简易多人聊天系统主要包含两个部分: 服务器端:支持多客户端连接,具备消息广播、私聊以及超时检测功能。 客户端:负责与服务器建立连接,实现消息的发送与接收。 系统采用 TCP 协议进行通信,并运用 epoll 实现 I/O 多路复用。相较于传统的 select/poll 模型,在高并发场景下,epoll 展现出更出色的性能。 一、核心技术点解析1.1 epoll I/O 多路复用epoll 是 Linux 系统下高效的 I/O 事件通知机制,本项目主要使用了以下函数: epoll_create():用于创建 epoll 实例。 epoll_ctl():可添加、删除或修改被监控的文件描述符。 epoll_wait():用于等待事件发生。 服务器和客户端均通过 epoll 同时监控 socket 和标准输入,实现了非阻塞的...
select 与 epoll 的核心区别整理
一、底层数据结构与核心代码对比 特性 select epoll 数据结构 固定大小位图(bitmap)。这种结构通过位标记文件描述符是否就绪,存在明显局限性:一是 FD_SETSIZE 限制了可监控的文件描述符数量上限,二是每次轮询都需遍历整个位图,效率随连接数增加而降低。 采用红黑树 + 就绪链表的组合。红黑树用于高效管理所有注册的文件描述符,插入、删除操作时间复杂度为 O (log n);就绪链表则存放当前就绪的事件,epoll_wait 调用时仅需处理就绪链表,避免无意义的遍历,大幅提升高并发场景下的查询效率。 核心代码示例 c #include fd_set readfds; FD_ZERO(&readfds); FD_SET(fd, &readfds); select(max_fd + 1, &readfds, NULL, NULL, NULL); c #include int epollfd = epoll_create(1024); struct epoll_event event; event.data.fd =...
基于多人聊天室系统的实现,详细学习 epoll 函数基础
导言:在 Linux 高并发网络编程中,epoll 作为事件驱动的 I/O 多路复用方案,是构建高性能服务器的核心技术。本文从原理、使用到实践,全面解析 epoll 的技术要点。 一、epoll 的核心优势 事件驱动:相较于select/poll的遍历式轮询,epoll 采用事件驱动架构,由内核主动推送就绪 I/O 事件。高并发场景下,仅少量连接就绪时,epoll 可精准定位活跃连接,避免全量扫描带来的 CPU 损耗,大幅提升资源利用率。 海量连接:select受限于固定长度数组(默认上限 1024),难以应对高并发。epoll 采用动态数据结构,连接上限仅受系统文件描述符表限制(可通过ulimit -n调整),可支撑数万至数十万级并发连接。 高效结构:epoll 以红黑树管理监控列表,文件描述符操作时间复杂度为O(log n);就绪事件链表支持O(1)级快速检索。这种设计确保海量连接下的高效响应与处理。 二、核心函数解析123456789101112131415161718192021#include <sys/epoll.h>int...
Leecode 1201. Ugly Number III
1201. Ugly Number III题目Write a program to find the n-th ugly number. Ugly numbers are positive integers which are divisible by a or b or c. Example 1: Input: n = 3, a = 2, b = 3, c = 5 Output: 4 Explanation: The ugly numbers are 2, 3, 4, 5, 6, 8, 9, 10... The 3rd is 4. Example 2: Input: n = 4, a = 2, b = 3, c = 4 Output: 6 Explanation: The ugly numbers are 2, 3, 4, 6, 8, 9, 10, 12... The 4th is 6. Example 3: Input: n = 5, a = 2, b = 11, c = 13 Output: 10 Explanation: The ugly numbers are...
Leecode 0024. Swap Nodes in Pairs
24. Swap Nodes in PairsGiven a linked list, swap every two adjacent nodes and return its head. You must solve the problem without modifying the values in the list's nodes (i.e., only nodes themselves may be changed.) Example 1: Input: head = [1,2,3,4] Output: [2,1,4,3] Explanation: Example 2: Input: head = []$ Output: [] Example 3: Input: head = [1] Output: [1] Example 4: Input: head = [1,2,3] Output: [2,1,3] 题目大意给定一个链表,要求两两交换相邻节点(如 1→2→3→4 变为...
Leecode 0074. 搜索二维矩阵
74. 搜索二维矩阵给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 示例 1: 12输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3输出:true 示例 2: 12输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13输出:false 解法1:二分查找由于矩阵具有特殊的有序性,可以将其视为一个有序的一维数组来处理: 整个矩阵可以看作是按行拼接而成的有序数组 使用二分查找高效定位目标值 通过计算将一维索引转换为二维矩阵的行和列 1234567891011121314151617181920212223242526272829303132class Solution {public: bool...
Leecode 0146. LRU Cache
146. LRU CacheDesign a data structure that follows the constraints of a Least Recently Used (LRU) cache. Implement the LRUCache class: LRUCache(int capacity) Initialize the LRU cache with positive size capacity. int get(int key) Return the value of the key if the key exists, otherwise return -1. void put(int key, int value) Update the value of the key if the key exists. Otherwise, add the key-value pair to the cache. If the number of keys exceeds the capacity from this operation, evict the...