自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ByteBuffer 用法详解

ByteBuffer 是 Java NIO 中用于处理字节数据的关键类,提供了比传统 byte[] 更灵活和高效的字节操作方式。

2025-04-02 17:41:45 786

原创 RocksDB

RocksDB项目是起源于Facebook,是,特别适合用于需要低延迟和高吞吐量的场景。。RocksDB 借鉴了开源leveldb项目的重要代码以及Apache HBase的想法。最初的代码是从开源 leveldb 1.5 fork出来的。以形式嵌入程序中,为大规模分布式应用在ssd上运行提供优化。RocksDB不提供高层级的操作,例如备份、负载均衡、快照等,而是选择提供工具支持将实现交给上层应用。正是这种高度可定制化能力,允许RocksDB对广泛的需求和工作负载场景进行定制。

2025-03-06 14:42:46 644

原创 RocketMQ源码之消息刷盘分析

RocketMQ有同步刷盘与异步刷盘的方法,可以根据场景进行选择刷盘的方式,同步刷盘对性能影响比较大,但是可靠性比较高,因为要等到消息刷盘以后才给生产者返回确认消息;异步输盘方式只要写入到缓存以后就给生产者返回确认消息,同时采用后台异步的方式进行刷盘,提高了性能以及吞吐量。

2025-01-18 23:06:47 752

原创 RocketMQ源码分析之事务消息分析

RocketMQ采用两阶段提交(2PC)的思想来实现事务消息,当事务消息失败或者超时,同时采用补偿的方式处理这个问题。这两个阶段分别为正常事务消息的发送与提交以及事务消息的补偿。我们看看官方文档给的事务消息的流程图:1、事务消息的发送与提交MQProducer将事务消息发送给MQServer(Broker服务器),这时的消息称为半消息,半消息是不能被消费者消费的。

2025-01-18 23:05:17 935

原创 rocketmq集群启动和下线

先关掉broker的读写权限,客户端对这个节点的读写操作会报nopermission异常,客户端会重试其他节点。配置文件broker-a.properties。观察该节点无读写流量后,再执行下机器操作。配置文件目录conf。

2025-01-18 23:01:51 863

原创 rocketmq基本架构

到此为止,Broker注册的代码就分析完成了,总而言之,Broker注册就是Broker将相关的元数据信息,如Broker名字,Broker地址、topic信息发送给NameServer服务器,NameServer接收到以后将这些元数据缓存起来,以供后续能够快速找到这些元数据,生产者和消费者也可以通过NameServer服务器获取到Broke相关的信息,这样,生产者和消费者就可以和Broker服务器进行通信了,生产者发送消息给Broker服务器,消费者从Broker服务器消费消息。

2025-01-18 23:00:09 1440

原创 rocketmq概念和理论

读写队列的数量可以动态修改,初始读写队列都是16,缩容时,写队列先调整为8,读队列不变,后8个queue中的消息消费完毕后,再将写队列调整为8,整个缩容过程不会丢失任何消息。:相同consumer group中的每个consumer平均分摊同一topic中的消息。:所有的消息都存储在同一个Commitlog文件中,确保消息发送时顺序写文件,尽最大的能力确保消息发送的高性能和高吞吐量。○ 物理偏移量(8字节):这是消息在CommitLog文件中的物理位置,即消息的起始字节在文件中的偏移量。

2025-01-16 20:59:25 829

原创 查看进程的线程数

原文链接:https://blog.youkuaiyun.com/baidu_35692628/article/details/126218742。动态查看进程的线程数及活跃线程数total/running/sleeping等。进程树,查看主线程和对应的多个子线程,可看到主线程和子线程之间的关系。列出进程的所有线程,类似ps -T -p pid。列出进程的所有线程:主线程/子线程/线程名等。然后查看Threads字段对应线程数。/proc目录下活动进程的线程数。还能看到线程的资源占用情况。查看所有进程对应的线程。

2024-12-10 14:24:01 392

转载 【Java基础】抽象类与接口的区别与使用场合

抽象类与接口的区别最重要的区别是,接口的方法不可以有实现,并且是绝对的抽象方法。抽象类可以有实例方法用来实现默认行为。 接口中的变量申明默认是final, 而抽象类中变量申明可以是非final。 接口中的成员默认是public修饰,而抽象类中成员可以是private, protected等等。 接口通过关键字implements被其他类实现,而抽象类则是通过extends关键字被其他类扩...

2020-04-23 19:44:05 332

转载 mysql哪些情况不走索引

在MySQL中,并不是你建立了索引,并且你在SQL中使用到了该列,MySQL就肯定会使用到那些索引的,有一些情况很可能在你不知不觉中,你就“成功的避开了”MySQL的所有索引。现假设有t_stu表,age,sname上建立了索引索引列参与计算如果where条件中age列中使用了计算,则不会使用该索引 SELECT `sname` FROM `t_stu` WHERE `ag...

2019-09-22 22:06:40 1640 1

原创 KMP算法

定义 Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。算法流程假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置如果j = -1,或者当前字...

2019-09-22 21:11:17 347

转载 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数

#include<iostream>#include<string>#include<vector>using namespace std;int func(string word1, string word2){ int n1 = word1.size(); int n2 = word2.size(); int **dp=new int*...

2019-09-12 11:20:33 3015

原创 不借助辅助空间的二叉树前序、中序、后序遍历(Morris遍历)

二叉树线索化二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息n个节点的二叉树中含有n+1个空指针域。利用二叉树中的空指针域 来存放在某种遍历次序下的前...

2019-09-11 22:25:10 380

原创 MySQL的四种事务隔离级别

一、事务的基本要素(ACID)  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。  2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A...

2019-09-11 21:03:51 146

原创 C++中public、protected、private的总结

private,public,protected成员的访问权限public: 能被类成员函数、子类函数、友元访问,也能被类的对象访问。private: 只能被类成员函数及友元访问,不能被其他任何访问,本身的类对象也不行。protected: 只能被类成员函数、子类函数及友元访问,对外是隐藏的,不能被其他任何访问,本身的类对象也不行,子类对象。类的继承后方法属性变化使用priva...

2019-09-11 21:02:06 197

原创 HTTP1.0与HTTP1.1的区别

HTTP1.0需要使用keep-alive参数来告知服务器要建立一个长连接,而HTTP1.1默认支持长连接; HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401; HTTP1.0是没有host域的,HTTP1.1才支持这个参数; HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求...

2019-09-11 20:59:47 214

原创 socket编程

TCP过程客户端:创建socket 绑定ip、端口号到socket字 连接服务器,connect() 收发数据,send()、recv() 关闭连接服务器端:创建socket字 设置socket属性 绑定ip与端口号 开启监听,listen() 接受发送端的连接accept() 收发数据send()、recv() 关闭网络连接 关闭监听对应关系:客户端的c...

2019-09-10 17:15:42 265

转载 计算机网络中端到端与点到点的区别

数据传输的可靠性是通过数据链路层和网络层的点对点和传输层的端对端保证的。端到端与点到点是针对网络中传输的两端设备间的关系而言的。端到端通信端到端通信是针对传输层来说的,它是一个网络连接,指的是在数据传输之前,在发送端与接收端之间(忽略中间有多少设备)为数据的传输建立一条链路,链路建立以后,发送端就可以发送数据,知道数据发送完毕,接收端确认接收成功。 也就是说在数据传输之前,先为数据的传输开...

2019-09-10 17:12:14 3473 1

原创 http与https

HTTP和HTTPS基本概念  HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。  HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。...

2019-09-10 17:10:01 290

原创 ping

一、ICMP协议ICMP(Internet Control Message Protocol)因特网控制报文协议,工作在网络层。它是IPv4协议族中的一个子协议,用于IP主机、路由器之间传递控制消息。控制消息是在网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP协议与ARP协议不同,ICMP靠IP协议来完成...

2019-09-10 16:50:00 420

原创 DNS域名解析协议

1)主机解析域名的顺序 找缓存、找本机的hosts文件、找DNS服务器2)DNS协议运行在UDP协议之上,使用端口号533)根服务器:ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS服务器先问根域名服务器.com域名服务器的IP地址,然后再问.com域名服务器,依次类推)过程:浏览器先检查自身缓存中有没有被解析过这个域名对应的i...

2019-09-10 16:49:44 324

原创 ARP地址解析协议

ARP协议工作原理:首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。 当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。 当本网络的所有主机收到该A...

2019-09-10 16:45:15 307

原创 哪些函数不能是虚函数

构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针在构造函数中初始化; 内联函数,内联函数表示在编译阶段进行函数体的替换操作,而虚函数意味着在运行期间进行类型确定,所以内联函数不能是虚函数; 静态函数,静态函数不属于对象属于类,静态成员函数没有this指针,因此静态函数设置为虚函数没有任何意义。 友...

2019-09-04 15:38:14 1634

原创 C++空类

空类的大小C++空类的大小不为0,不同编译器设置不一样,vs设置为1原因:C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址; 带有虚函数的C++类大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定(32位的操作系统,指针大小为4个字节); C++中要求对于类的每个实例都必须有独一无二的地址,那么编译器自动为空类分...

2019-09-04 15:19:04 331

原创 C++函数返回引用

函数可以返回引用,但是不能返回局部变量的引用,因为函数调用完毕局部变量会被释放class Test{public: Test(int x = 1) { num= x; cout << "构造函数" << endl; } Test(const Test & a) { num = a.num; cout << "拷贝构造函数" &lt...

2019-09-04 15:10:35 1417

原创 C++ union共用体

C与C++中的union:一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型。C++ union结构式一种特殊的类。它能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。它不能包含虚函数和静态数据变量。它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。Union中得默认访问权限是public。union类型是共享内存的,以成员最大长度的整数倍作为自己的大...

2019-09-03 16:44:42 409

原创 C/C++ 关于大小端模式

大端模式: 数据的高字节存在低地址 数据的低字节存在高地址小端模式: 数据的高字节存在高地址 数据的低字节存在低地址可以用来union测试CPU是大端模式还是小端模式#include<iostream>using namespace std;union Test{ int num; char ch;};int main(){ Test a;...

2019-09-03 16:33:13 343

原创 new和delete的实现原理,delete是如何知道释放内存的大小的?

new简单类型直接调用operator new分配内存;而对于复杂结构,先调用operator new分配内存,然后在分配的内存上调用构造函数;对于简单类型,new[]计算好大小后调用operator new;对于复杂数据结构,new[]先调用operator new[]分配内存,然后在p的前四个字节写入数组大小n,然后调用n次构造函数,针对复杂类型,new[]会额外存储数组大小:new表达式调...

2019-09-02 21:47:18 1905

原创 野指针

野指针指向内存被释放的内存或者没有访问权限的内存的指针成因“野指针”的成因主要有3种:指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如 char *p = NULL; char *str = new char(100); 指针p...

2019-09-02 21:43:49 234

原创 C++内存管理

内存管理对于C++的内存结构,主要有两种说法,一个是{栈区,堆区,全局区(静态区), 常量区,代码区};另一种说法为{栈区,堆区,全局区(静态区), 自由存储区} 栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。  堆,就是那些由new分配的内存块,...

2019-09-02 21:39:22 134

原创 C++ 移动构造函数和拷贝构造函数

我们用对象a初始化对象b,后对象a我们就不在使用了,但是对象a的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么我们不能直接使用a的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷; 拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。浅层复制之所以危险,是因为两...

2019-09-02 15:20:11 10422 7

原创 C++实现只能动态或者静态创建对象

C++中建立类的对象有两种方式:(1)静态建立,例如 A a; 静态建立一个类对象,就是由编译器为对象在栈空间中分配内存。使用这种方法,是直接调用类的构造函数。(2)动态建立,例如 A* p = new A(); 动态建立一个类对象,就是使用new运算符为对象在堆空间中分配内存。这个过程分为两步:第一步执行operator new( )函数,在堆空间中搜索一块内存并...

2019-09-01 19:18:58 335

原创 C++拷贝构造函数

调用拷贝构造函数的三种情况:1)用一个类对象初始化另一个类对象2)函数的形参是类对象3)函数的返回值是类对象拷贝构造函数的参数必须是引用原因:例如 A a; A b(a);用对象a初始化b,需要调用拷贝构造函数,向拷贝构造函数传递实参a时,若参数不是引用,则又需要调用拷贝构造函数,因此导致无限递归调用拷贝构造函数,栈溢出。class A{ publi...

2019-09-01 12:13:03 197

原创 C++ 三个线程顺序打印ABC

#include<iostream>#include<vector>#include<thread>#include<condition_variable>using namespace std;mutex mu;std::condition_variable cond_var;int num=0;void func(char ch...

2019-08-30 16:08:41 3453

转载 C++ 多态

一般继承(无虚函数覆盖)下面,再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系:请注意,在这个继承关系中,子类没有重载任何父类的函数。那么,在派生类的实例中,其虚函数表如下所示:对于实例:Derive d;的虚函数表如下:我们可以看到下面几点:1)虚函数按照其声明顺序放于表中。2)父类的虚函数在子类的虚函数前面一般继承(有虚函数覆盖)...

2019-08-26 23:10:02 130

原创 master公式

master公式:T [n] = aT[N/b] + c* n^k解法:①当a>b^k时,时间复杂度为O(n^(logb a))②当a=b^k时,时间复杂度为O((n^k)*logn)③当a<b^k时,时间复杂度为O(n^k)

2019-08-24 21:34:52 299

原创 C++ 虚析构函数

基类析构函数不是虚析构函数class Base{public: Base(){cout<<"base constructor"<<endl;} ~Base(){cout<<"base destructor"<<endl;}};class Derived:public Base{public: Derived(){cout&l...

2019-08-21 22:20:51 215

转载 linux的锁机制

互斥锁: mutex,用于保证在任何时刻,都只能有一个线程访问该对象。 当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒读写锁: rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程 同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获 取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意: 写锁...

2019-08-21 09:43:21 204

转载 系统调用和库函数的区别

前言从用户的角度来看,系统调用和库函数似乎没有什么区别,它们都是以C函数的形式出现,并且两者都为应用程序提供服务。但从实现者角度来看,它们之间是有根本的区别。那么,它们之间到底有哪些不同呢?在说明之前,先简单了解以下系统调用和库函数。系统调用系统调用指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。它通过软中断向内核态发出一个明确的请求。系统调用实现了用户态进程和硬件设备...

2019-08-19 16:56:17 180

转载 new和malloc的区别

new与malloc1,new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配。2,new返回的时指定对象的指针,而malloc返回的时void*,因此,malloc的返回值一般都需要进行类型转换。3,new不仅分配一段内存,而且还会调用构造函数,而malloc不会。4,new分配的内存需要用delete销毁,malloc要用free来销毁;delete销毁的时候回调用...

2019-08-19 16:42:49 195

空空如也

空空如也

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

TA关注的人

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