自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(278)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 STL:空间配置器 —— 第二级配置器:__default_alloc_template | 自实现reallocate()

对STL第二级空间配置器的讲解内存池的讲解自实现reallocate()函数

2022-05-02 23:06:55 1037 1

原创 C++:共享型智能指针 | 模拟实现my_shared_ptr

前言在前面的文章中,完成了auto_ptr、unique_ptr的介绍和仿写,本文将介绍共享型智能指针——shared_ptr。文章目录前言本文所供智能指针使用的对象一、共享型智能指针1.shared_ptr的结构2. 创建shared_ptr实例3. 检查引用计数二、仿写shared_ptr(一)辅助类:删除器1.删除单个对象2.删除一组对象(二)引用计数类本文所供智能指针使用的对象class Object{private: int num;public: Object(int x =

2022-04-04 20:53:30 1008

原创 C++:多态性与虚函数 | 虚函数的注意点 | 汇编角度来看动态联编过程

多态性与虚函数 | 虚函数的注意点 | 汇编角度来看动态联编过程以对象调用函数时的动态联编

2022-03-20 23:31:46 1234 1

原创 【Linux内核源码剖析】进程原理及系统调用

有一段程序代其执行;有进程专用的系统堆栈空间;在内核有task_struct数据结构;进程有独立的存储空间,拥有专有的用户空间;如果具备前面三条而缺少第四条,那就称为“线程”;如果完全没有用户空间,就称为“内核线程”;如果共享用户空间,则就称为“用户线程”。

2022-11-07 22:53:28 751 1

原创 【Linux内核源码剖析】内核源码的组织结构

如果说CPU是计算机硬件的心脏,那么操作系统的内核就是整个计算机系统的心脏,或者说是最高管理机构。。。

2022-11-06 22:46:23 718 2

原创 【数据结构】TrieTree(字典树、前缀树)—— C++实现

TrieTree(字典树、前缀树、单词查找树)字典树,看名字好像和字符串相关。如果你能看到这一篇文章,那么肯定学过字符串串匹配算法,即BF和KMP的模式匹配。字典树并不是来解决字符串匹配问题,而是用于以下场景:大量的单词(串),实现单词的排序功能、快速检索功能、前缀搜索功能…

2022-10-23 18:29:14 877

原创 【滑动窗口】剑指Offer || :字符串中的所有变位词

因为字符串 p 的变位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 ss 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;起始索引等于 0 的子串是 “cba”, 它是 “abc” 的变位词。起始索引等于 0 的子串是 “ab”, 它是 “ab” 的变位词。起始索引等于 1 的子串是 “ba”, 它是 “ab” 的变位词。起始索引等于 2 的子串是 “ab”, 它是 “ab” 的变位词。输入: s = “abab”, p = “ab”

2022-10-22 22:33:00 132

原创 【数据结构】红黑树(RBTree)详解——C++实现

每一个节点都是有颜色的,不是黑色就是红色。根节点root必须是黑色的。所有叶子节点都是黑色的,叶子节点是NULL节点,不存储实际的数据。每个红色节点必须有两个黑色的子节点,或者说是从每个叶子节点到根节点的所有路径上不能有连续的红色节点。从任一节点到其每个叶子上的所有简单路径都包含相同数目的黑色节点。因为每个节点不是红色就是黑色,所以需要定义一个颜色相关的枚举量。还需要操作其父节点,所以定义一个parent指针。private :// 节点颜色 enum Color {

2022-10-15 23:03:16 690

原创 【Redis】配置文件的学习

设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以可以设置样本的大小。首先就是Redis的单位支持,Redis支持字节类型,表示时大小写无所谓。表示开启他的保护模式,这里默认是yes,表示不支持远程访问,所以改成no。只能接受本机的访问请求,不写的情况下,无限制接受任何IP地址的访问。一个空闲的客户端维持多少秒会关闭,0表示关闭该功能,即永不关闭。一般设置3~7的数字,数值越小样本越不准确,但性能消耗越小。存放pid文件的位置,每个实例会产生一个不同的pid文件。

2022-10-07 22:35:34 380

原创 【Redis】常用数据类型:String、List、Set、Hash、Zset

当字符串长度雄安与1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次会多扩1M的空间。用 < value >覆写 < key >所存储的字符串值,从< 起始位置 > 开始(索引从0开始)。decr < key > :将key中存储的数字值减一。append < key> < value>:将给定的< value >追加到原值的末尾。String的数据结构为简单的动态字符串,采用预分配冗余空间的方式来减少内存的频繁分配。setnx < key >< value >只在key不存在时,设置key的值。

2022-10-05 22:28:10 1253

原创 Redis的概述与安装

Redis是一个开源的key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)、hash(哈希类型)。这些数据类型都支持push/pop,add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。再此基础上,Redis支持各种不同方式的排序。与Memcache一样,为了保证效率,数据都是缓存在内存中。

2022-10-04 23:05:58 736 2

原创 NoSQL数据库介绍

NoSQL(Not Only SQL),泛指“非关系型数据库”,NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。不遵循SQL标准;不支持ACID;远超于SQL的性能。

2022-10-04 22:18:05 524

原创 【数据结构】AVL树——C++实现

AVL树特点:**在BST树的基础上,引入了节点“平衡”的概念,任意一个节点的左右子树高度差不超过1。****为什么要引入平衡这个概念?**在BST树中,由于插入后就是排序好的,那就会存在这样一种情况:如果插入的元素依次增大,就会导致理想中的二叉树,形成了一个链表,如下图,这种情况会导致增删查的时间复杂度并不是O(logn),而是O(n)。为了解决这样情况,引入了平衡的概念。

2022-10-01 22:53:53 1015 3

原创 数据结构与算法:大小根堆和快速排序 解决TopK问题

问题:求出一组序列中值最小的前K个元素在正常做法中,是先对这组元素排序,然后得出前k个元素,但排序算法的时间复杂度为O(n^2)或O(nlogn),问题就是 能不能在线性时间内找到top k的元素呢?

2022-09-24 11:30:28 788 1

原创 数据结构与算法:Bloom Filter(布隆过滤器)解决大数据查重问题

在内存有所限制的情况下(如上面的面试问题),快速判断一个元素是否在一个集合(容器)当中,还可以使用。布隆过滤器到底是个什么东西呢?

2022-09-23 21:58:52 1205

原创 数据结构与算法:bitmap位图法解决大数据查重问题

有1亿个整数,最大值不超过1亿,问都有哪些元素重复,谁是第一个重复的,谁是第一个不重复的,内存限制100M。

2022-09-22 21:33:32 985

原创 数据结构:哈希表解决大数据查重问题

在面试过程中,有时候会被问到,在上亿个数据中,找出第一个重复的数据,或找出所有重复出现的数据。

2022-09-22 17:31:33 1322

原创 数据结构:哈希表——线性探测哈希表、链式哈希表的实现

使关键字和其存储位置满足关系:存储位置 = f(关键字),这就是一种新的存储技术-散列技术。散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key),在查找时,根据这个确定的对应关系找到给定key的映射f(key),如果待查找集合中存在这个记录,则必定在f(key)的位置上。我们把这种对应关系f称为散列函数,又称为哈希函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或者哈希表(Hash Table)。

2022-09-22 16:50:09 563

原创 负载均衡:理论算法、一致性哈希、常用组件(待补充。。。)

互联网服务的后端使用集群来实现海量的服务请求,为了让集群中的节点均匀的处理服务请求,要用到负载均衡技术。如果做到负载均衡,就达到了控制系统流量的目的。除了保证服务流量的合理分配,还能控制流量走向。

2022-09-15 23:59:19 221

原创 网络编程:select的用法和原理

1)在socket内核中,接收缓冲区中的字节数大于或等于低水位标记SO_RCVLOWAT,此时调用recv或read函数可以无阻塞地读取内核文件描述符,并且返回值大于0。1) nfds:Linux上的socket也叫fd,将这个参数的值设置未所有需要使用socket函数检测事件的fd中的最大值加1.5) timeout:超时时间,即在这个参数设定的事件内检测这些fd的事件,超过这个时间后,select函数将立即返回。3) writefds:需要监听的可写事件的fd集合。

2022-09-12 22:36:32 1312 1

原创 mprpc框架的日志系统的设计实现——异步日志缓冲队列

然后要考虑的问题是:由于我Rpc服务发布方,采用的是muduo网络库,即epoll + 多线程机制,同一时间可能有多个请求,所以要保证该队列的线程安全。一般情况在做项目时,都要有一个日志模块,由于写日志是磁盘I/O,我们不能把这个操作算在业务的执行里,那样效率太低了。所以我们的思路就是,将写日志信息这部操作,放到一个缓冲队列中,然后有一个单独的写日志线程,来做磁盘I/O。设计的比较简单,目前只有普通日志和错误日志,实例化利用单例模式,除了最基本的方法外,还。定义了一个可变参的宏。

2022-09-07 15:43:39 431

原创 RpcChannel的调用过程

比如在该示例中服务名称为UserServiceRpc,提供了Login和Register方法,那么在生成proto文件后,会有两个类,UserServiceRpc使用在rpc服务发布端。某个节点发布了rpc服务和方法,那么其他节点想要调用,首先要按照服务发布方的格式要求。RpcChannel在这里不要理解成管道的意思,这里相当于中继作用,UserServiceRpc_Stub 用于服务请求端。CallMethod实现。

2022-09-06 23:33:20 266

原创 RpcProvider分发rpc服务:socket连接回调和读写事件回调的实现

对于在网络上接收的字符流,在框架内部,RpcProvider和RpcConsumer协商好之间通信用的protobuf数据类型,定义proto的message类型,进行数据头的序列化和反序列化。不定义类型,传过来的字符流,是没办法识别的。该方法表示已建立连接用户的读写事件操作,如果有一个远程RPC服务的调用请求,那么OnMessage方法就会响应。另外,为了防止粘包,可以在头部的message类型里添加 args_size,即参数的长度。(4个字节)(服务名字、方法名字) +

2022-09-06 19:43:52 321

原创 【滑动窗口】剑指 Offer II 014. 字符串中的变位词

为保证cnt 的值不为正,若此时cnt[x]>0,则向右移动左指针,减少离开区间的字符的 cnt 值直到cnt[x]≤0。使用滑动窗口思想,这里维护两个数组代表窗口,让窗口1固定,表示字符串s1的字符,窗口2表示字符串s2,刚开始对窗口的初始化为字符串s1的长度,每次进一个字符出一个字符,比较两个窗口,如果相同,则返回真,遍历完成后,还没有返回真,则为假。初始时,仅统计s1​ 中的字符,则 cnt 的值均不为正,且元素值之和为 −n。输入: s1 = “ab” s2 = “eidbaooo”

2022-09-06 00:00:26 121

原创 RpcProvider的网络服务,以及怎么发布服务方法

那目前实现的功能除了初始化rpc框架和加载配置文件,还设计一个类RpcProvider,实现了框架的网络模块,RpcProvider还需要有提供服务方法:NotifyService()本地的方法会从中得到请求的参数,执行本地服务,然后把响应response填写好,执行回调操作返回。那么问题就是,当接收到一个rpc调用请求时,如何知道要调用哪个应用程序的哪个rpc方法呢?首先的思路是,我们需要一个表,来记录当前节点的服务对象和服务方法信息。如果有请求从网络上发送过来。

2022-09-05 21:09:38 233

原创 Mprpc框架的配置文件

在mprpcApplication类中,初始化函数Init需要加载配置文件,即rpc节点的IP和端口,zookeeper的IP和端口。所以写一个MprpcConfig类。

2022-09-02 21:20:13 233

原创 Mprpc框架基础类的设计

使用getopt来读取。

2022-09-02 20:45:28 177

原创 网络编程:发送0字节数据的效果

网络编程:发送0字节数据的效果。

2022-08-29 22:40:15 640

原创 网络编程:socket的阻塞模式和非阻塞模式

返回值n返回值含义大于0成功发送(send)或接收(recv)n字节0对端关闭连接小于0(-1)出错、信号被中断、对端TCP窗口太小导致数据发送不出去或当前网卡缓冲区已无数据可接收返回值大于0。在这种情形下,一定要判断send函数的返回值是不是我们期望发送的字节数,而不是简单的判断其返回值大于0.\n");}虽然返回值n大于0,但在实际情况下,由于对端的TCP可能因为缺少一部分字节就满了,所以n的值可能为(0, buf_length]。...

2022-08-28 20:17:52 10139 1

原创 仿写muduo网络库:日志的简单实现

在查看muduo库的源代码时,首先发现的是利用了基本的OOP思想。它有一个copyable和noncopyable头文件,方便后续的代码使用。这里的格式采用的是【级别】+ 时间戳 + msg,所以需要时间类。

2022-08-22 20:04:15 234

原创 Linux内核:fork的学习——笔记自用

工具:source insightLinux源码版本:2.6.11(最新版已经5.几了,根据自己需求选择)

2022-08-14 19:03:03 210

原创 MySQL:分库分表

刚开始多数项目用单机数据库就够了,随着服务器流量越来越大,面对的请求也越来越多,我们做了数据库读写分离, 使用多个从库副本(Slave)负责读,使用主库(Master)负责写,master和slave通过主从复制实现数据同步更新,保持数据一致。slave 从库可以水平扩展,所以更多的读请求不成问题。但是当用户量级上升,写请求越来越多,怎么保证数据库的负载足够?增加一个Master是不能解决问题的, 因为数据要保存一致性,写操作需要2个master之间同步,相当于是重复了,而且架构设计更加复。...

2022-08-12 12:42:29 358

原创 MySQL:读写分离原理和实践

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

2022-08-11 21:03:16 555 3

原创 Linux线程同步对象:互斥体、信号量、条件变量、读写锁

因为某次操作系统唤醒pthread_cond_wait()时tasks.empty()可能仍为true,即操作系统可能在某些情况下唤醒条件变量,也就是说存在没有其他线程向条件变量发送信号,但等待此条件变量的线程有可能醒来的情形。信号量代表一定的资源数量,可以根据当前资源的数量按需唤醒指定数量的资源消费者线程,资源消费者线程一旦获取信号量,就会让资源减少指定的数量,如果减少为0,则消费者线程将全部处于挂起状态;broadcast唤醒所有调用pthread_cond_wait()等待的线程,相当于广播。....

2022-08-10 23:09:12 400

原创 MySQL:MySQL的集群——主从复制的原理和配置

主从复制的流程:两个日志(binlog二进制日志&relay log日志)和三个线程(master的一个线程和slave的二个线程)1、主库的更新操作写入binlog二进制日志中。2、master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。3、slave机器执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志。...

2022-08-10 18:32:46 511

原创 MySQL:日志系统介绍 | 错误日志 | 查询日志 | 二进制日志:bin-log数据恢复实践 | 慢日志查询

对于之前文章里提到的redo log和undo log是存储引擎的日志,而本章介绍的是MySQL Server的日志。

2022-08-09 19:42:55 206

原创 MySQL:你做过哪些MySQL的优化?

给大家讲过MySQL Server网络模块采用经典的I/O复用+线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的,所以线程池就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(MySQL会根据连接量,自动加大线程池的数量)。...

2022-08-09 15:04:37 212

原创 MySQL:redo log日志——笔记自用

事务的ACD特性(原子性、一致性、持久性),都是依靠undo log和redo log日志保证的,redo log 并不是事务commit了才记录,而是begin开始后就记录。

2022-08-08 19:16:09 135

原创 MySQL:意向共享锁和意向排它锁 | 死锁 | 锁的优化

但在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,即锁的粒度比较小,这就决定了在 InnoDB 中发生死锁是可能的。死锁问题一般都是我们自己的应用造成的,和多线程编程的死锁情况相似,大部分都是由于我们多个线程在获取多个锁资源的时候,获取的顺序不同而导致的死锁问题。因此我们应用在对数据库的多个表做更新的时候,不同的代码段,应对这些表按相同的顺序进行更新操作,以防止锁冲突导致死锁问题。4.不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。.

2022-08-08 18:39:18 294

原创 MySQL:已提交读和可重复读的实现原理 | MVCC(多版本并发控制)——笔记自用

从用户的角度来看,好象是数据库可以提供同一数据的多个版本(系统版本号和事务版本号)。undo log:回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,同时也是实现多版本并发控制(MVCC)下读操作的关键技术。:同一个事务开始的时候生成一个当前事务全局性的快照(Read View),第一次select查询时。图示:在该图中,第一个事务id是1000,它利用(DB_ROLL_PTR)保存了上一个事务操作的地址。,也经常称为多版本数据库。3、版本已提交,但是在快照创建前提交的,可以读取。.

2022-08-08 16:26:38 1083

git基本命令和操作的学习 | 必知必会内容

对git和GitHub的学习和使用; 针对大学生或没接触过git的人群; 目的是在团队开发项目时可以学会使用git托管代码; 希望大家一起学习,一起进步。

2022-06-17

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

TA关注的人

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