自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(150)
  • 收藏
  • 关注

原创 【C++内存管理源码解读】

SGI STL的空间配置器与众不同,且与STL标准规范不同。SGI STL的每一个容器都已经指定缺省的空间配置器是alloc。对于new来说,编译器会先调用::operator new分配内存;然后调用Obj::Obj()构造对象内容。对于delete来说,编译器会先调用Obj::~Obj()析构对象;然后调用::operator delete释放空间。标准STL allocator决定将这两个阶段操作区分开来。对象构造由::construct()负责;对象释放由::destroy()负责。

2023-07-10 16:54:33 317

原创 【STL迭代器源码解读】

trivial destructor”一般是指用户没有自定义析构函数,而由系统生成的,这种析构函数称为不重要的析构函数(trivial destructor)首先利用value_type()获取所指对象的型别,再利用__type_traits判断该型别的析构函数是否trivial,若是(__true_type),则什么也不做,若为(__false_type),则去调用destory()函数。

2023-07-10 16:51:27 402

原创 【TCP四次挥手】

序列号,是 TCP 一个头部字段,标识了 TCP 发送端到 TCP 接收端的数据流的一个字节,因为 TCP 是面向字节流的可靠协议,为了保证消息的顺序性和可靠性,TCP 为每个传输方向上的每个字节都赋予了一个编号,以便于传输成功后确认、丢失后重传以及在接收端保证不会乱序。初始序列号,在 TCP 建立连接的时候,客户端和服务端都会各自生成一个初始序列号,它是基于时钟生成的一个随机数,来保证每个连接都拥有不同的初始序列号。原因一:防止历史连接中的数据,被后面相同四元组的连接错误的接收。TCP 有个保活机制。

2023-05-08 11:41:23 742 2

原创 【TCP三次握手】

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:TCP 都可以保证一个报文一定能够到达接收端;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。

2023-05-08 10:32:20 732

原创 【TCP 重传、滑动窗口、流量控制、拥塞控制】

接收方,接收到数据后,进行响应,会发送给发送方自己的窗口大小,当发送方下次发送时,就会知道发送多少的数据,这就是流量控制。快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。快速恢复算法过程中,为什么收到新的数据后,cwnd 设置回了 ssthresh?为什么要有拥塞控制呀,不是有流量控制了吗?和发送窗口有什么关系呢?那么怎么知道当前网络是否出现了拥塞呢?发生超时重传的拥塞发生算法。发生快速重传的拥塞发生算法。拥塞控制有哪些控制算法?

2023-05-06 22:37:09 1495

原创 【HTTPS】

【HTTPS】

2023-05-06 16:57:03 594

原创 【RPC、WebSocket】

于是我们会把每条要发送的数据都包装一下,比如加入消息头,消息头里写清楚一个完整的包长度是多少,根据这个长度可以继续接收数据,截取出来后它们就是我们真正要传输的消息体。字节流可以理解为一个双向的通道里流淌的数据,这个数据是二进制数据,简单来说就是一大堆 01 串。消息头,还可以放各种东西,比如消息体是否被压缩过和消息体格式之类的,只要上下游都约定好了,互相都认就可以了,这就是所谓的协议。该方法在远端服务器上暴露的一个方法,如果我们还能像调用本地方法那样去调用它,这样就可以屏蔽掉一些网络细节。

2023-05-06 15:16:28 926 1

原创 【HTTP/1.1、HTTP/2、HTTP/3】

第一点:对于常见的 HTTP 头部通过静态表和 Huffman 编码的方式,将体积压缩了近一半,而且针对后续的请求头部,还可以建立动态表,将体积压缩近 90%,大大提高了编码效率,同时节约了带宽资源。不过,动态表并非可以无限增大, 因为动态表是会占用内存的,动态表越大,内存也越大,容易影响服务器总体的并发能力,因此服务器需要限制 HTTP/2 连接时长或者请求次数。第二点:HTTP/2 实现了 Stream 并发。

2023-05-06 11:49:25 1430 21

原创 【键入网址到网页显示】

协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。协议栈的下面一半是用 IP 协议控制网络包收发操作, IP 中还包括 ICMP 协议和 ARP 协议。通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈。HTTP 是基于 TCP 协议传输的。每次解析域名都要经过那么多的步骤呢?

2023-05-04 17:36:16 590

原创 【TCP/IP 网络模型】

比如 10.100.122.0/24,后面的/24表示就是 255.255.255.0 子网掩码,255.255.255.0 二进制是「11111111-11111111-11111111-00000000」一共24个1。,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是。当传输层的数据包大小超过。

2023-05-04 14:56:16 1544

原创 【Redis—哨兵机制】

将从节点指向新主节点。

2023-05-04 14:00:32 660

原创 【Redis—主从复制】

Redis 哨兵机制。

2023-05-04 11:40:06 912

原创 【Redis —缓存常见异常】

【代码】Redis —缓存常见异常。

2023-04-07 23:02:29 918

原创 Redis —单线程

图中的蓝色部分是一个事件循环,是由主线程负责的,可以看到网络 I/O 和命令处理都是单线程。Redis 6.0 版本之后,Redis 在启动的时候,默认情况下会额外。Redis 在 2.6 版本,会启动。,Redis 在启动的时候,是会启动。,也就是 lazyfree 线程。Redis 在 4.0 版本之后。

2023-04-06 22:05:48 686

原创 【Redis —ZSet介绍和应用场景】

Zset 类型的底层数据结构是由。

2023-04-04 14:54:22 4225

原创 Redis —Set、HSet介绍和应用场景

set和list区别。

2023-03-31 15:14:06 5505

原创 【10. MySQL 的Buffer Pool】

如果间断出现这种现象,就需要调大 Buffer Pool 空间或 redo log 日志的大小。MySQL 的数据是存储在磁盘里的,不能每次都从磁盘里面读取数据.这样会使得性能非常差。于是提升查询性能的话,需要加一个缓存,因此Innodb 存储引擎设计了一个。

2023-03-27 15:15:07 327

原创 【10.有关锁的面试】

在数据库层面,有两种策略通过「打破循环等待条件」来解除死锁状态:文章https://xiaolincoding.com/

2023-03-13 10:42:52 271

原创 【9.数据页结构】

InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。数据库的 I/O 操作的最小单位是页,InnoDB 数据页的默认大小是 16KB,意味着数据库每次读写都是以 16KB 为单位的。

2023-03-11 22:42:41 433

原创 【8.索引篇】

在实际的应用当中, d 值是大于100的,这样就保证了,即使数据达到千万级别时,B+Tree 的高度依然维持在 3~4 层左右,也就是说一次数据查询操作只需要做 3~4 次的磁盘 I/O 操作就能查询到目标数据。B+Tree 只在叶子节点存储数据,而 B 树 的非叶子节点也要存储数据,所以 B+Tree 的单个节点的数据量更小,在相同的磁盘 I/O 次数下,就能查询更多的节点。另外,B+Tree 叶子节点采用的是双链表连接,适合 MySQL 中常见的基于范围的顺序查找,而 B 树无法做到这一点。

2023-03-11 18:31:11 493

原创 【7.MySQL行格式存储】

varchar(n) 字段类型的 n 代表的是最多存储的字符数量,并不是字节大小。一行记录最大只能存储。

2023-03-10 23:39:34 405

原创 【6. 执行一条select过程】

存储引擎层流程如下。

2023-03-10 22:04:16 81

原创 【硬件结构】

硬中断(上半部)是会打断 CPU 正在执行的任务,然后立即执行中断处理程序,而软中断(下半部)是以内核线程的方式执行,并且每一个 CPU 都对应一个软中断内核线程,:一个程序执行的时候,CPU 会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增,开始顺序读取下一条指令。:会先将内存中的数据加载到共享的 L3 Cache 中,再加载到每个核心独有的 L2 Cache,最后进入到最快的 L1 Cache,之后才会被 CPU 读取。第二点是事物的串行化。

2023-02-07 16:13:36 378

原创 【数据库与缓存保持一致性】

数据库和缓存一致性

2022-12-28 23:46:01 1220 1

原创 【Redis—过期策略和内存淘汰策略】

noeviction(Redis3.0之后,默认的内存淘汰策略) :它表示当运行内存超过最大设置内存时,不淘汰任何数据,这时如果有新的数据写入,则会触发 OOM,但是如果没用数据写入的话,只是单纯的查询或者删除操作的话,还是可以正常工作。针对「进行数据淘汰」这一类策略,又可以细分为「在设置了过期时间的数据中进行淘汰」和「在所有数据范围内进行淘汰」这两类策略。这两种策略配和使用,在合理使用 CPU 时间和避免内存浪费之间取得平衡。LRU:全称是 Least Recently Used。不进行数据淘汰的策略。

2022-12-24 18:59:12 577

原创 【Redis—持久化】

AOF持久化:以独立日志就把该命令。以追加的方式写入到一个文件里,然后重启 Redis 的时候,先去读取这个文件里的命令达到恢复目数据的目的。在 Redis 中 AOF 持久化功能默认是不开启的,需要我们修改redis.conf注意只会记录写操作命令,读操作命令是不会被记录的,因为没意义。Redis 是先执行写操作命令后,才将该命令记录到 AOF 日志里的,这么做有好处也有风险。'优点' 1. 避免额外的检查开销。

2022-12-24 16:34:11 554

原创 【Redis —String、List介绍和应用场景】

但是 List 并不会为每个消息生成 ID 号,所以我们需要自行为每个消息生成一个全局唯一ID,生成之后,我们在用 LPUSH 命令把消息插入 List 时,需要在消息中包含这个全局唯一 ID。消费者程序在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启动后,就没法再次从 List 中读取消息了。(或者反过来,RPUSH+LPOP)命令实现消息队列。实现了,替代了双向链表和压缩列表。长度大于 32 字节。分布式锁加上过期时间。

2022-12-19 12:44:39 538

原创 【C++网络编程—linux下boost库源码编译安装】

【代码】【C++网络编程—linux下boost库源码编译安装】

2022-12-17 21:50:05 817

原创 【SQLAlchemy】

【代码】【SQLAlchemy】

2022-12-09 16:34:45 449 2

原创 【Python操纵MySQL】

如果镜像源过期,可以使用豆瓣的镜像源,目前挺流行的,有时候清华,科大,阿里的镜像源都不太管事像mac电脑不支持pip命令使用一下命令PyMySQL连接MySQLdb的几种用法:游标的几种方法:

2022-12-07 21:11:13 107

原创 【虚拟内存机制】

页表当中存放的是虚拟地址与物理地址的映射,当映射的物理地址存在,则直接从物理内存中取出数据,如果不存在,则需要进行页面置换,从磁盘当中换入所需要的页面。也就相当于虚拟地址 = 物理内存 + 磁盘。

2022-11-08 21:26:44 579 2

转载 【虚函数指针 虚函数表】

虚函数表说白了就是里面是一组地址的数组(就是函数指针数组),他所在的位置就是虚函数表指针里面所存储的地址,它里面所包含的地址就是我们重写了父类的虚函数的地址(没有重写父类的虚函数那么默认的就是父类的函数地址)。我们把对象从首地址开始的4个字节或者是8个字节,这个位置我们称之为虚函数表指针(vptr),它里面包含一个地址指向的就是虚函数表(vftable)的地址。我们首先来看下没有虚函数的情况下 一个普通的类的实例对象在内存中的分布。此时虚函数表中有一个函数地址。虚函数表中就存放了这个函数的地址。

2022-11-08 17:58:33 1338

原创 【5. 事务】

重写日志, 正如之前说的,MySQL是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再写回到磁盘上。幻读是事务A查询工资单中大于3000的一共有3人,而此时事务B又加了一条4000元进行,此时事务A读到的就是4人。:俩个写事务A,B同时对A = 0进行+1操作,结果B覆盖了A,导致最终结果是1而不是2,事务被覆盖。记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用。,并提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

2022-11-06 11:42:06 336

原创 【4. 主从复制】

在实际工作中,经常用Redis和MySQL搭配使用,当有请求时,首先会从缓存中进行查询,如果存在就直接取出。如果不存在在访问数据库,这样就提升了读取效率,也减少了后端数据库的访问压力。一般对数据库而言都是读多写少,对于数据库的读取数据压力比较大,所以可以采用数据库集群的方案,做主从架构、进行读写分离,同样可以提升数据库并发处理能力。

2022-11-06 10:03:44 348

原创 【3. MySQL日志】

原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。而事务的原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务 的持久性。UNDO LOG称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

2022-11-05 22:53:57 215

原创 【2. MVCC-多版本并发控制技术】

MVCC 在、这俩个隔离级别才有效,因为这俩个情况下考虑快照(读旧数据),而剩下的读为提交和串行化,读的都是最新数据核心点在于ReadView的原理,、这两个隔离级别的一个很大不同就是生成ReadView的时机不同:在每一次进行普通SELECT操作前都会生成一个ReadView只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。

2022-11-05 19:51:36 436 2

原创 【1. MySQL锁机制】

都默认别人不会修改,所以不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。如果出现行锁的时候,想加表锁,那就只能进行全表遍历,看是否有加行锁。然而事务加锁时,记录是不存在的,是无法加行锁,则需要靠间隙锁。,而可重读读只能解决脏读,不可重复读。:乐观锁一般会使用版本号机制或CAS。MySQL默认隔离级别是。意向共享锁(IS锁)意向独占锁(IX锁)

2022-11-05 16:32:58 303

原创 字节青训营抖音APP

第三届字节跳动青训营-后端抖音APP项目

2022-10-28 15:09:09 1977 44

原创 【c ++内存四区】

代码区:存放函数体的二进制代码,由操作系统管理。全局区:存放全局变量,静态变量和常亮。栈区:编译器自动分配释放,存放函数的参数和局部变量等。堆区:程序员分配和释放,若未释放,程序结束时有操作系统回收。在程序编译后,生成了exe可执行程序,未执行该程序前分为 代码区 和 全局区 ,程序执行完后分为栈区和堆区。

2022-10-08 12:49:24 133 4

原创 【57. 有边数限制的最短路】

【代码】【57. 有边数限制的最短路】

2022-10-06 19:18:35 753 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除