自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis高可用性

Redis 实现高可用主要依赖于三种核心机制,分别是主从复制、哨兵模式、集群模式;

2025-07-30 14:45:00 515

原创 Redis持久化

因为Redis数据是在内存中的,重启时,内存中的数据就会丢失,所以有了数据持久化机制。一共有三种持久化方式,来保证数据不丢失。

2025-07-26 09:45:00 918

原创 Protobuf学习

Protobuf是一种高效的数据序列化工具,通过.proto文件定义数据结构,使用protoc编译器生成头文件和源文件。

2025-07-22 18:17:57 1025

原创 微服务项目文档

微服务项目文档

2025-07-21 16:11:48 931

原创 Git分支管理

Git分支是Git最强大的功能之一,它允许开发者在不同的开发线上并行工作而互不干扰。通过合理使用Git分支,可以大大提高团队协作效率和代码质量。

2025-07-10 22:13:05 843

原创 Git基本操作1

Git是一款分布式版本控制系统,用于高效管理代码版本和团队协作。它通过工作区、暂存区和版本库三个区域协同工作,记录每次修改。

2025-07-09 21:36:27 581

原创 I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket,也就是I/O多路复用,是一种常见的并发编程技术,它允许单个线程或进程同时监视多个输入/输出(I/O)流(例如网络连接、文件描述符)。

2025-05-12 21:07:00 973

原创 TCP Socket编程

想客户端和服务器能在网络中通信,就得使用 Socket 编程,它可以进行跨主机间通信。

2025-05-10 09:49:32 1204

原创 事务、提交方式、回滚

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。一个 MySQL 数据库,不止一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器发起事务处理请求。而每个事务至少一条 SQL 语句,最多很多 SQL 语句,如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。

2025-04-06 11:28:09 670

原创 MySQL索引

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index,查询速度就可能提高成百上千倍。

2025-04-05 09:51:14 719

原创 IP的学习

IP地址的作用:用来定位主机,具有一个将数据从主机A跨网络送到主机B的能力。

2025-04-02 08:54:42 546

原创 TCP、流量控制、滑动窗口、拥塞控制等

三次握手,四次挥手,流量控制,拥塞控制

2025-04-01 10:07:40 919

原创 线程的互斥与同步

1、假设线程1先对n进行++,在属于它的时间片中,线程1疯狂进行++操作,最终将n加到1000,并且继续++时,第一步和第二步已经完成,在寄存器中保存的是1001,准备执行第三步的时候,属于它的时间片到了,那么这时线程1就会被切出去等待,让其他线程执行。3、此时又将线程1切回来,并且回来的时候,属于它的上下文数据也会带回来,继续完成之前没有完成的任务,那么线程1就会继续执行它的第三步操作,将寄存器中的1001写回内存,这时本来线程2已经将n加到了3000,而线程1又将其变成了1001。

2025-03-25 11:50:16 792

原创 线程控制学习

而且通过上面的两个图也可以发现,他们的地址变换很大,因为刚开始,只是一个全局表量,保存在已初始化数据段,而添加_thread修饰后,主线程的g_val就在主线程栈中存储,而新线程的g_val就在对应线程空间的线程栈上。当我们调用pthread_create创建线程后,在线程库中就会新建一个描述线程的结构体,来保存线程的相关数据,而这一部分也是实际的内存,有对应的地址,而pthread_t本质就是一个进程地址空间上的地址。这里的返回值是new出来的,在主线程的线程等待时记得delete。

2025-03-23 21:45:40 565

原创 页表。线程的初步学习

所以线程就是进程内的一个执行流,线程在进程内部执行就是线程在进程的虚拟地址空间上执行,拥有该进程的一部分资源。解释:CPU内部调度时,每个线程都有运行的时间片,当运行的时间片到了之后就会切换其他线程来运行,这样可以保持多个线程同时调度,也就是并发,但是在这种情形下,可能会有一些线程在属于它的时间片中并没有将自己的代码执行完,就要被切出去,这时就需要保存它的上下文,以便下次调度时继续上次的执行,这样每个线程执行的情况就不同,保存的上下文也就不同,也就是属于每个线程所私有的。

2025-03-22 09:48:51 727

原创 make/makefile

make和makefile的学习

2024-11-16 11:34:51 455

原创 Linux下的vim和gdb

主要对linux中的vim和gdb的使用进行了总结

2024-11-13 09:51:06 811

原创 vector和list;迭代器失效

vector和list的使用和注意地方;迭代器失效。

2024-11-01 09:49:12 910

原创 异常和智能指针的相关笔记

2024-10-26 10:01:32 124

原创 解决shared_ptr的循环引用

在实现智能指针shared_ptr中有一个问题就是循环引用的问题,针对循环引用可以使用weak_ptr来解决。

2024-10-26 09:56:50 344

原创 C++11智能指针

由于异常引发的异常安全(上文有异常安全的介绍)可能会导致内存泄漏,所以我们需要来解决内存泄漏的问题,这里有两种方案::1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测工具。

2024-10-25 10:40:37 972

原创 C++11异常安全

异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的 直接或间接的调用者处理这个错误。

2024-10-25 10:38:40 293

原创 哈希桶的实现,怎么解决哈希冲突

其实现也是通过取模的方式,只是当冲突出现时,哈希桶的处理方式是将冲突的数据通过链表链接在一起,都挂在同一个映射位置,比如上面的4和44,都映射到4的位置,通过链表链接,查找时在对应的映射位置中遍历查找即可。会发现11,21,31的与capacity模后余数都是1,也需要映射到1对应的位置,这就引发了冲突,即哈希冲突(不同映射值映射到了相同的位置)。闭散列的哈希表也需要增容,因为刚开始存数据的数组大小不能满足,则增容,但是这里的增容不能满了才增容,因为快满时插入数据,冲突的概率很大,效率就低了。

2024-10-20 09:45:00 1127

原创 红黑树的相关笔记

红黑树对应的相关笔记,可参考

2024-10-18 10:41:09 115

原创 红黑树的基本实现

红黑树,也是一种二叉搜索树,只是在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。应用更广泛。

2024-10-18 09:54:03 1296

原创 AVLTree

如何构建AVLTree

2024-10-14 20:16:04 495

原创 C++中的继承

C++中继承的学习内容

2024-09-24 16:07:10 294

原创 函数模板、类模板

函数模板和类模板的学习

2024-09-22 10:49:07 248

原创 TopK的实现

2:为了找10个最小的,即提取出10个数来建堆,建大堆(建大堆即这10个元素中最大的元素在堆顶,然后将剩下的元素依次提取,与堆顶比较,若是比堆顶小,则将堆顶替换为该数据,再进行调整,变为大堆,调整后堆顶数据还是新的10个数据中最大的,然后继续提取,比较,调整)。前提:从1000个数据中找出10个最小的,这里的实现用到了文件操作,现实中若是基数很大,不能直接在内存中保存,则要借助文件将数据保存,然后再提取数据进行比较。在此前,已经介绍了向下调整算法,建堆以及堆排序的实现,这篇文章将实现TopK问题。

2024-07-30 14:47:20 331

原创 堆排序的实现

以数组形式来看就是{64,45,37,23,23,9,7,5,3,1};首先需要知道的是,如果想要对一个数组排升序,要建大堆,排降序,要建小堆。3)交换完后,最后一个数据不动,剩下的数据对堆顶元素进行向下调整;2)交换堆顶(第一个)和堆尾(最后一个)的数据;这里的黄色框内表示没有参与调整。以此循环进行,最终实现排序。具体过程:(以排降序为例)2)交换堆顶和堆尾的数据,4)循环2)3)步骤。

2024-07-19 20:25:01 354

原创 堆排序的前提,建堆

实现堆排序的前提,建堆。建堆后才能进行堆排序,以及后续的TopK问题。

2024-07-17 09:58:26 690

原创 快速排序非递归实现

快速排序的非递归方法实现。

2024-07-12 22:29:04 2612 1

原创 快速排序法排序方法三

cur才进行交换,这句代码的意思是如果刚开始进来访问的位置处的值就比key小,并且++prev后prev和cur指向同一个位置(例如cur=0,prev=cur-1,当访问0位置处的值比key小,则++prev后等于cur,两个同时指向0位置处),则交换不交换都可,所以不交换也行,当不相等时的交换才有意义。下面注释的代码是进行交换的。4,处理完后,prev处及其左边都是比key小的值,其右边都是不小于key的值,再++prev然后和最后位置的基准值交换,这样就可以确保以基准值为中分为左右两个子序列了。

2024-07-11 09:08:44 850

原创 快速排序法排序方法二

2,从左边开始位置begin开始向右边找比key大的值,找到后将其填入到“坑位”,那么当前begin位置就成了新的“坑位”;3,然后从右边end位置开始向左找比key小的值,找到后将其填入到“坑位”,那么当前end位置就又成了新的“坑位”;4,以此反复,当begin和end相遇时,即为最后的一个“坑位”,再将最初保存的基准值填入这个“坑位”;1,将最后一个位置的值作为基准值(key),并且保存下来,那么最后一个位置可以抽象成一个“坑位”;5,最终会形成左边序列比基准值小,右边序列比基准值大;

2024-07-09 09:08:27 1237

原创 快速排序法排序

值得注意的是,在PartSort1中添加的前两行代码,第一行是调用GetMidIndex函数,得到选定的基准值的位置,然后第二行是将该基准值换到最后,因为整体的代码实现是以最后一个位置作为基准值的位置实现的,所以要将基准值换到数组的最后一个中。在上一篇文章中介绍了快排的左右指针的方法来实现,并且最后还提到一个三数取中的方法来确保取定的key(基准值)不是要排序的数组中最大或最小的,因为取到最大或最小的值为基准值,将会使这个算法变成效率最慢,所以才有三数取中法;

2024-07-07 20:31:37 167

原创 快速排序法排序

快速排序算法

2024-07-06 22:16:48 1208 1

原创 数据结构中选择排序

2024-07-06 11:56:05 162

空空如也

空空如也

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

TA关注的人

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