数据库MySQL常用的存储引擎,如何根据应用场景选择
InnoDB:支持事务、外键,适用于高可靠性需求的应用。
特点:支持ACID事务、行级锁、外键约束。
ACID是衡量事务的四个特性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
适用场景:需要高并发、数据一致性的应用,如金融系统。
MyISAM:不支持事务,适用于读多写少的应用。
特点:不支持事务、表级锁、存储空间小。
适用场景:读操作多于写操作的应用,如数据仓库。
Memory:数据存储在内存中,适用于需要快速访问的数据。
特点:数据存储在内存中,访问速度快,断电数据丢失。
适用场景:需要快速访问的数据,如缓存表、临时数据。
乐观锁和悲观锁乐观锁:假设不会发生冲突,提交时检查冲突。
实现方式:版本号机制、时间戳机制。
适用场景:读多写少的场景,冲突概率低。
悲观锁:假设会发生冲突,操作前加锁。
实现方式:数据库锁机制(行锁、表锁)。
适用场景:写操作多的场景,冲突概率高。
MySQL多版本控制(MVCC)通过保存数 ...
数据结构和算法红黑树(map)一种自平衡二叉搜索树,保证插入、删除、查找操作的时间复杂度为O(log n)。
特点:每个节点有红黑两种颜色,根节点为黑色,红色节点的子节点为黑色,任意节点到叶子节点的路径上黑色节点数量相同。
适用场景:需要快速查找、插入、删除操作的应用,如关联容器map、set。
Hash表的实现(能手写)通过数组和链表实现,解决冲突的方法有链地址法、开放地址法。
链地址法:每个数组元素是一个链表,冲突时将元素插入链表。
开放地址法:冲突时寻找下一个空闲位置,常用方法有线性探测、二次探测、双重散列。
树的遍历(深度优先和宽度优先)
深度优先:前序、中序、后序遍历。
前序遍历:根节点 -> 左子树 -> 右子树。
中序遍历:左子树 -> 根节点 -> 右子树。
后序遍历:左子树 -> 右子树 -> 根节点。
宽度优先:层次遍历。
层次遍历:按层次从上到下、从左到右遍历节点。
跳跃表的实现一种随机化的数据结构,支持快速查找、插入、删除操作。
特点:在有序链表的基础上增加多级索引,索引层数随机生成。
适用场景 ...
网络UDP和TCP的区别UDP(用户数据报协议) 是无连接的,不保证数据包的顺序和完整性,适用于实时应用。UDP的特点:
无连接:不需要建立连接即可发送数据。
不可靠:不保证数据包的顺序和完整性,可能丢包。
速度快:由于没有连接建立和确认机制,传输速度较快。
适用场景:实时视频、音频传输,在线游戏等。
TCP(传输控制协议) 是面向连接的,保证数据包的顺序和完整性,适用于需要可靠传输的应用。TCP的特点:
面向连接:在传输数据前需要建立连接(三次握手)。
可靠传输:通过确认机制、重传机制保证数据包的顺序和完整性。
流量控制和拥塞控制:通过滑动窗口、拥塞控制算法防止网络拥塞。
适用场景:文件传输、邮件、网页浏览等。
三次握手和四次挥手三次握手:建立TCP连接的过程,确保双方都准备好进行通信。
客户端发送SYN包(同步序列编号)请求建立连接。
服务器收到SYN包,回复SYN-ACK包(确认同步序列编号)。
客户端收到SYN-ACK包,发送ACK包(确认序列编号),连接建立。
四次挥手:断开TCP连接的过程,确保双方都同意断开连接。
客户端发送FIN包(结束标志)请求断 ...
多态内存资源文章说得很详细(虽然我还是不怎么懂,做个笔记吧)https://github.com/MeouSker77/Cpp17/blob/master/markdown/src/ch29.md
多态分配器这玩意最直接的用法就是控制容器的内存,打个比方在我使用vector容器时一般情况下会这么用
1234567891011121314#include<iostream>#include <vector>using namespace std;class node{public: node(){ cout << "build node!" <<endl; }};int main(){ vector<node> arr; arr.resize(10); return 0;}
不难发现这个这个类构造了10个对象,但是众所周知vector 存储元素的实际位置是在堆上,并且vector在资源不足时会自动进行扩容以 ...
惊群效应惊群问题
惊群问题是计算机科学中,当许多进程等待一个事件,事件发生后这些进程被唤醒,但只有一个进程能获得CPU执行权,其他进程又得被阻塞,这造成了严重的系统上下文切换代价。
解决办法
不希望把所有进程都唤醒,就采用定点唤醒某一个进程的做法
比如说C++在std::condition_variable满足条件,线程唤起时,其实际上并不会唤起所有等待的线程,而是随机唤起一个正在等待的线程。这样做的达到的结果跟唤起所有线程一起争抢锁资源的结果一样,但是可以很大程度上避免系统上下报文的切换
尽量避免进程上下文切换。
采用合适的任务分配策略,减少正在等待线程的数量
参考资料 https://zh.wikipedia.org/wiki/%E6%83%8A%E7%BE%A4%E9%97%AE%E9%A2%98
拓展资料nginx是如何解决惊群效应的https://segmentfault.com/a/1190000044210775
虚假唤醒https://zhuanlan.zhihu.com/p/652823880https://www.cnblogs.com/angdh/p/18267978https://cloud.tencent.com/developer/article/1557403
应用层引起的虚假唤起这种虚假唤起是由不合理的代码逻辑引起的,具体看代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <condition_variable>#include <iostream>#include <thread>#include <queue>#include <string>using namespace std::chrono_literals;std::condition_variable cv;std::mutex mtx;std::queue<std::string> ...
计算机语言
未读构造时有无()的区别 当有()时,会将申请到的成员变量的空间初始化,没有时则不会
1234567891011121314151617#include <iostream>#include <stdio.h>using namespace std;class foo {public: //foo() { cout << "foo's constructor" << endl; } //~foo() { cout << "foo's destructor" << endl; } int a;};int main() { char buf[sizeof(foo)]; foo* a = new (buf) foo;//不会将申请到的int空间初始化 char buf2[sizeof(foo)]; foo* b = new (buf2) foo();//则会将申请到的int空间初始化为0。 pr ...
计算机语言
未读brpc-http:proto的使用官方文档:https://brpc.apache.org/zh/docs/client/access-grpc/issues:https://github.com/apache/brpc/issues/1647
他实际上会先解析http的头部的 Content-Type 字段当Content-Type 中的值为,application/x-protobuf,application/proto,application/grpc 时,他将以protobuf来解析http的包体而其他情况将会 将其以其他情况解析(默认json)源码片段
12345678910111213141516171819202122232425262728293031323334if (ct.starts_with("grpc")) { if (ct.size() == (size_t)4 || ct[4] == ';') { if (is_grpc_ct) ...
code-server 安卓手机termux环境搭建在这里是使用的termux这个app。如果手机没有root会有一些限制,比如说无法挂载磁盘,无法访问手机文件。但是跑一些服务是完全没有问题的。
先把termux下载好
安装ssh查看ip
12345678910111213141516# 安装ssh相关依赖 pkg install opensslpkg install openssh# 创建ssh密钥ssh-keygen -Assh-keygen# 设置密码passwd# 查看用户名和ipwhoamiifconfig# 开启ssh服务sshd
code-server安装官方文档https://coder.com/docs/code-server/latest/termux
1234567891011121314151617# 先在电脑上用 ssh连接上手机 (在电脑端链接手机敲太难受了)ssh username@ip -p 8022# 安装相关依赖pkg install -y tur-repo python python3pkg install -y code-servertermu ...
ngnix引用自大佬的博客:https://www.cnblogs.com/hanease/p/15890509.html
基本命令1234nginx -t 检查配置文件是否有语法错误nginx -s reload 热加载,重新加载配置文件nginx -s stop 快速关闭nginx -s quit 等待工作进程处理完成后关闭
默认配置123456789101112131415161718192021222324252627282930313233343536373839# 工作进程的数量worker_processes 1;events { worker_connections 1024; # 每个工作进程连接数}http { include mime.types; default_type application/octet-stream; # 日志格式 log_format access '$remote_addr - ...
openresty入门搭建安装依赖 pcre-devel openssl-devel gcc curl
下载安装包 官网: https://openresty.org/en/download.html
下载最新版
123456wget https://openresty.org/download/openresty-1.19.9.1.tar.gztar -zxvf openresty-1.19.9.1.tar.gzcd openresty-1.19.9.1/./configuresudo make -j6sudo make install
要是报
1gmake[1]: cc: Command not found
则是没有cc指令(其实就是gcc)可以先看看gcc的位置,再创建软链接
12gccPath=$(which gcc)ln -sf $gccPath /bin/cc
再添加环境变量,以及赋权
123echo 'export PATH=$PATH:/usr/local/openresty/bin' >> ~/.bashrcsudo c ...
进程和线程的通信进程间通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字(socket)共六种
1.管道本质:管道的本质其实就是内核中的一块缓冲区,多个进程通过访问同一个缓冲区就可以实现进程间的通信。分类:匿名管道,命名管道
1.1匿名管道没有具体的文件描述符,只能适用于具有亲缘关系的进程间通信,父进程在创建管道的时候操作系统会返回管道的文件描述符,然后生成子进程时,子进程会通过拷贝父进程的pcb来获取到这个管道的描述符。读写特性:1. 没数据 read 阻塞。2. 满数据,write 阻塞。3. 所有读端pipefd[0]关闭,调用 write 导致异常退出进程。4. 所有写端pipefd[1]关闭,调用 read 读完数据,返回0。
1.2命名管道命名管道也是内核中的一块缓冲区,但是它具有标识符,这个标识符是一个可见于文件系统的管道文件,能够被其他进程找到并打开管道文件来获取管道的操作句柄。open打开命名管道的特性:1. 若文件以只读打开,则会阻塞,直到文件被以写的方式打开。2. 若文件以只写打开,则会阻塞,直到文件被以读的方式打开。
管道的特性:(1).半双工通信(数据 ...








