自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM 调优工具

jmap -histo:查看内存信息,实例个数及占用内存大小。Jinfo:查看正在运行的 JAVA 应用程序的扩展参数。YGCT:年轻代垃圾回收消耗时间,单位s。FGCT:老年代垃圾回收消耗时间,单位s。jmap -dump:查看堆内存信息。S0C:第一个幸存区的大小,单位KB。GCT:垃圾回收消耗总时间,单位s。YGCT:年轻代垃圾回收消耗时间。FGCT:老年代垃圾回收消耗时间。FGCT:老年代垃圾回收消耗时间。FGCT:老年代垃圾回收消耗时间。FGCT:老年代垃圾回收消耗时间。

2025-06-24 16:03:39 668

原创 JVM创建对象与内存分配机制深度剖析

一般对象先被分配在 Eden,Eden 满了之后触发 Minor GC,此时把 Eden 区垃圾对象回收,剩余存活对象挪到空的 survivor。对象可以被分配到栈上,并可以被进一步分解时,JVM 不会创建对象,而是把对象的成员变量存入栈中,这些成员上会有一个标识表示它属于哪个类。逃逸分析:分析对象的动态作用域,如果这个对象只在一个方法中使用,其余方法不会引用这个对象,说明这个对象可以存放到栈中。JVM 中的对象一般都是在堆上进行分配的,但是当对象不是很大,也可以为对象在栈上分配内存。

2025-06-24 10:10:03 991

原创 RocketMQ核心源码解读

长轮询的机制是,当 Broker 接收到消费者的 Pull 请求时,如果没有可响应的消息,就把这个 Pull 请求内容缓存起来,当 Producer 发送消息过来时,首先判断这个消息是否可以响应已缓存的 Pull 请求,如果可以,就把 Pull 请求从缓存中拉出来,并把消息通知给消费者。在删除 CommitLog 文件时,Broker 会启动后台线程,每隔 60s,检查 CommitLog 文件,对超过 72h 的数据进行删除,在删除 CommitLog 文件时,并不会检查消息是否被消费过。

2025-06-20 11:24:55 537

原创 MQ常见问题梳理

MQ 如何保证消息不丢失哪些环节可能导致消息丢失生产者发送消息如何保证不丢失同步:消息最安全,但是效率很低。异步:消息安全和效率之间比较均衡,但会加大客户端的负担。因为消息发送后还要维护回调上下文,网络 IO 和内存负担会更高。统一的思路是,给生产者响应,让生产者知道消息是否发送成功。Broker写入数据如何保证不丢失Producer 把消息发送给 Broker 后,消息会先写入到 Page Cache 缓存中,过一段时间再写入磁盘。如果写入磁盘之前断电,这些数据就丢失了。

2025-06-20 11:24:17 855

原创 JVM内存模型深度解析(1.8)

记录当前方法结束后,调用此方法的方法将要执行哪行代码。图片中 main 方法调用了 compute 方法,所以 compute 的方法出口保存着 main 方法将要执行哪行代码。每执行一个方法,都会在栈中为这个方法开辟一块空间,用来存放这个方法中的局部变量。因为 -Xss 设置越小,意味着一个线程栈里能分配的栈帧就越少,意味着方法调用深度也会变浅。存放常量,静态变量,类信息,静态变量的值是一个对象实例时,存放变量的值,会有指令把栈中的值存入局部变量表中。方法区直接占用物理内存。存放方法内的局部变量,

2025-06-19 17:16:03 134

原创 JVM类加载机制(1.8)

使用类(调用类的 mian 方法,new 对象等)时才会加载,在硬盘上查找文件后,通过 IO 读取字节码文件,在加载阶段会在内存中生成一个对应的 Class 对象,作为方法区这个类的各种数据的访问入口。当自己写了和核心包一样的代码,例如 java.lang.String.class,由于第一次加载需要向上委托至引导类加载器寻找这个类,引导类加载器可以寻找到,那么就加载这个类,而不会加载到自己写的类。如果应用程序类加载器中已加载的类中不存在这个类,那么应用程序类加载器委托扩展类加载器。

2025-06-18 11:27:11 307

原创 Redis底层数据结构解析

当每个节点的长度都在 250~253,这时向头节点插入一个长度超过 253 的 entry,那么前头节点的 prevlen 需要从 1 字节扩充到 5 字节,前头节点扩充之后整体长度超过了 253,它的后一个节点的 prevlen 也需要扩充,以此类推,所有的节点都需要重新调整空间。如果键值对个数小于 hash-max-listpack-entries 值或者所有键值对的字符串总长度小于 hash-max-listpack-value 的值,就使用 listpack。快速创建销毁,数据布局好,访问更快。

2025-06-13 09:29:20 675

原创 RocketMQ 客户端编程模型

根据 Consumer 返回信息保证消息处理的可靠性。如果 Consumer 返回的是 RECONSUME_LATER,Broker 就会过一段时间发起消息重试。消费位点(Consume Offset): Consumer 当前消费到某个消息队列中的哪一条消息的位置。Broker 记录了 Consumer 消费了哪些信息,可以决定继续把哪些消息发送给消费者。但是消费者希望自己决定拉取哪些消息,就可以通过一下参数决定拉取消息范围。一个消息只会被消费者组中一个消费者实例处理,由消费者组中所有消费者实例共享同一个

2025-06-12 16:04:37 554

原创 RocketMQ 核心概念

Broker 集群是基于主从架构的,master 负责响应客户端的请求,slave 负责备份 master 节点上的数据,如果 master 宕机,slave 节点上可以保留数据备份。在分布式系统中,由于网络分区或者其他原因导致导致集群被分割成两个或多个集群,各自独立运行且无法感知其他子集群的存在,这可能导致数据不一致或者错误决策。Dledger高可用集群解决了分布式集群 slave 节点不可主动转换为 master 节点问题,leader 是由所有节点根据 Raft 协议(RocketMQ 分布式集群。

2025-06-11 15:50:41 517

原创 Redis 缓存问题及优化方案

如图所示,线程 1 更新数据库后没有更新缓存,线程 2 获得资源更新了数据库和缓存,在这之后线程1 获得资源并把它设置的 10 更新进缓存。在读多谢少的情况下,不能容忍缓存数据不一致,可以为线程 1 的两个操作加锁,为了提升系统性能,查询数据库 – 更新缓存使用读锁,修改数据库 – 更新缓存使用写锁。通常如果在数据库查询不到数据,不会向缓存中存入数据,导致每次查询不存在数据时,都会将请求发送到数据库中。运营批量上架秒杀商品,这些商品存入缓存的时候过期时间设置相同,这些商品会同时过期,可能发生缓存击穿。

2025-06-05 14:13:28 721

原创 Redis 高并发分布式锁

2、每个 redis 节点不关联从节点,没有主从架构,这时如果超过半数 redis 节点宕机会导致 redis 加锁失败;Redisson 还支持锁续命功能,后台线程发现线程还持有锁,会重置这个锁的过期时间,这种方式避免了锁过期了但是线程还没有结束的情况。可以避免上面的问题,Redisson 使用了 Lua 脚本来保证 redis 语句执行的原子性及支持事务,同时可以减少网络开销。1、每个 redis 节点关联一个从节点,仍然可能发生主从架构锁失效的问题。Redis Redlock 分布式锁原理。

2025-06-04 15:04:01 197

原创 Redis 主从、哨兵与集群架构详解

奇数 master 可以在满足选举条件的情况下节省一个节点,例如比较 3 个 master 节点和 4 个 master 节点,当 1 个 master 宕机时,都能选举新的 master 节点;在数据持久化过程中,仍会有新的修改指令,这些指令会被 master 保存到内存(repl buffer)中,当 slave 完成对 rdb 文件的备份,即把数据加载到内存之后,master 会把内存中的指令发送给 slave。接收到消息的节点会把消息同步出去,而不是只由一个节点向其余节点同步消息。

2025-06-03 22:57:19 583

原创 Redis持久化详解

在子进程保存数据的时候,如果有新的修改数据操作,Redis 会为这些数据生成一个副本,再由子进程把这写数据写入 rdb 文件。就会重写这个 aof 文件,重写是以当前内存数据库的内容为基础,重写后 aof 文件中的内容均是 set key value 的形式。由于 aof 文件中记录的都是指令,其中会存在一些没用的指令,例如对于相同的 key 执行多次 incr 操作,这也会使文件变的很大。AOF 持久化保存数据的方式和 rdb 的不同,它是把每条修改指令保存到 appendonly.aof 磁盘文件中。

2025-06-03 00:40:31 823

原创 深入理解 Redis7 线程模型

Redis 到底是单线程还是多线程?Redis 为了能够与更多进行连接,使用多线程来维护与客户端的 Socket 连接,redis.conf 配置文件中的 maxclients 参数维护了最大客户端连接数。在,Redis 响应网络 IO 和键值对读写的请求,是由单线程完成的。Redis 基于 epoll 实现了 IO 多路复用,这种模式可以将多个并发的请求转化为串行的执行方式。注意:在 Redis7.x 版本中,后端对于比较耗时的操作,可以使用多线程机制来提升后台的工作。

2025-06-01 15:54:32 680

原创 Redis7.0 核心数据结构

相比 String 操作,消耗性能和 CPU 更小。相比 String,存储更节省空间。Hyperloglog 常用操作。Hyperloglog 应用场景。Hyperloglog 结构。同类数据归类存储,方便管理。Bitmap 常用操作。String 应用场景。ZSet 有序列表类型。Bitmap 应用场景。

2025-06-01 14:26:17 679

原创 在 docker 环境下 redis 主从部署示例

参考文章 https://zhuanlan.zhihu.com/p/647155496。docker stop 后面跟的值是要删除那个节点的 CONTAINER ID 值。5、查看主机 ip,这个 ip 不是机器 ip。上面的服务可以看作主节点,接下来配置从节点。3、获取Redis的配置文件。3、获取Redis的配置文件。7、查看主节点和从节点信息。6、 从节点绑定到主节点。或者修改从节点配置文件。4、进入 redis。4、进入 redis。

2025-05-30 21:49:39 138

原创 docker - MySQL8.0 一主两从复制实战

环境:腾讯云轻量级服务器-安装系统(docker CE)1、拉取 MySQL82、创建挂载目录3、准备配置文件还有两个没有使用的参数4、运行 MysSQL 容器创建主从复制的网络运行mysql容器5、登陆 MySQL6、配置远程访问以上是的创建方式。以下是从节点的创建方式。1、创建挂载目录3、准备配置文件4、运行 MysSQL 容器4、登陆 MySQL5、配置远程访问1、创建挂载目录3、准备配置文件4、运行 MysSQL 容器4、登陆 MySQL5、配置远程访问。

2025-05-30 06:18:12 302

原创 MySQL 8.0 新特性

其中 c2 字段为隐藏索引,即这个索引存在,MySQL 也会维护这个索引,但是优化器不会选择 c2 索引,即使使用 force index,优化器也不会选择。之前的版本同时删除两张表 t1, t2,但是 t2 不存在,执行 delete 语句后会报错,但会把 t1 这张表删除了。,再插入一行数据,新的数据的主键值是删除那行数据的主键值,即如果删除那行主键值是3,新插入这行数据的主键值也是3。更新之后,同样的情况,新的数据的主键值是删除那行数据主键值加1,即这行数据的主键值是4。主键不能设置为隐藏索引。

2025-05-28 21:50:49 239

原创 MySQL 常用系统配置

如果 3000 个连接全部使用,那么占用内存最少是 256kb * 3000 = 750M,内存占用最大是 64M * 3000 = 192G。首先预估可以分配给连接的内存有多少,分配给 innodb buffer pool 大概 40G,给操作系统分配 4G,那么给连接可分配的内存不到 20G。连接全部使用,新的连接保存在堆栈中,等待资源释放,如果堆栈连接数达到 300,剩下的连接会被拒绝。默认值是 0,表示不限制,可以把它设置为与服务器 CPU 核数相同或者是 CPU 核数 2 倍。

2025-05-28 20:50:03 266

原创 InnoDB 底层原理

redo log 文件可能不止一个,这些文件是首尾相连的,写入时从第一个文件开始写,写完一个文件继续写另一个文件,写到最后一个文件末尾就又回到第一个文件开头循环写,如下面这个图所示。设置redo log文件存储位置参数,默认值为"./",即innodb数据文件存储位置,其中的 ib_logfile0 和 ib_logfile1 即为redo log文件。,因为每张表对应一个 idb 文件,当有多条更新 sql 语句,要修改不同的表时,由于 idb 文件存放顺序不确定,也就不能顺序写。

2025-05-27 22:59:39 607

原创 MVCC底层原理原理

3、事务 A 再次查询 id 为 1 的那行数据, 会从版本链最下面的那一行开始做匹配,即事务 id 为 100 的记录开始做匹配,此时 read-view 的值不变,仍是 [100, 200] , 300,因为 100 在数组中,所以事务 id 为100 的数据均不可见,又到了事务 id 为 300 的那条记录,数据可见,因此 balance 的值仍为 500。100 和 200 是未提交的事务,300 是已提交的事务中最大的事务 id。多个事务对同一行数据的读和写操作并发执行,不阻塞。

2025-05-26 14:34:25 462

原创 MySQL锁机制及优化方法

一张表被事务 A 加上了行锁,另一个事务 B 想给这张表加上表锁,如果没有意识锁,事务 B 需要遍历每一行数据判断是否有锁,是否可以加上表锁,有了意识锁,事务 B 只需要判断这个标识就可以判断是否可以加表锁。并且是对于有索引的字段才能加上行锁,如果字段没有索引,在 RR(可重复读) 隔离级别下就升级为表锁,RC(读已提交) 隔离级别下不会升级为表锁。例如表中主键值是(1,5,10),间隙就是 (1,5),(5,10) ,间隙锁可以让其他事务没有办法在这两个区间内插入数据。定义:针对一行数据加的锁。

2025-05-26 07:21:28 264

原创 MySQL 事务原理

事务的属性并发事务带来的问题事务隔离级别。

2025-05-24 21:48:35 210

原创 MySQL 索引设计原则

例如 KEY index(name(20), age, position),这个表示使用 name 字段的前 20 个字符建立索引,缺点是如果要对 name 进行排序,就不能使用这个索引了,因为索引树中仅仅包含了前 20 个字符。建立的联合索引尽量包含查询语句中 where,order by,group by 的条件字段,并且建立索引的顺序要依据条件字段的顺序,这样可以满足最左前缀原则。小基数是指这个字段中可能出现的数值种类比较少,例如性别,他的值只有男和女,它的基数是2。

2025-05-23 16:33:31 99

原创 SQL深入优化

通过 EXPLAIN 关键字展示的 Extra 字段中的内容可以判断排序是否使用了索引,这个索引指的是包含排序字段的辅助索引,如果出现了 Using filesort 说明排序过程没有使用辅助索引,而是使用了主键索引(聚簇索引),Using index 则表示使用了辅助索引,Using index 效率会比 Using filesort 效率高。使用了覆盖索引后,排序使用了索引,如果是 select *,则出现 Using filesort,所以能使用覆盖索引尽量使用覆盖索引。

2025-05-23 15:46:56 190

原创 MyQL 索引优化原则

在 MySQL5.6 版本之后,引入了索引下推,即根据联合索引不仅找名字以 'LeiLei' 开头的索引,还会依据 age 和 position 这两个字段去过滤,这样查询出来的索引会少很多,最终直接根据这些索引对应的主键去主键表中查询最终结果。在 MySQL5.6 版本之前,首先根据联合索引里面查找名字以 'LeiLei' 开头的索引,根据这个索引去找主键索引,然后根据主键找到相应的记录,最后筛选出满足 age 和 position 这两个字段条件的数据。like "kk%" 为什么可以使用索引?

2025-05-23 11:42:32 161

原创 Explain工具介绍

查询语句执行顺序,值越大越先执行;值为 NULL,最后执行。如果查询是基于分区表的话,partitions 会显示查询将要访问的分区。:在查询中用到了 key 列的索引哪些字段或者常量(const)。表示关联类型或访问类型,及 MySQL 决定如何查找表中的行。:MySQL 估计要读取检测的行数,不是真实读取的行数。可以查看查询语句的执行计划,分析这个语句的性能瓶颈。通过这个值,可以计算出使用了联合索引的哪些字段。表示这个查询是简单查询还是复杂查询。可能会使用的索引,不一定会使用。查询过程中使用的索引。

2025-05-23 11:05:26 955

原创 MySQL索引底层数据结构与算法

因为 InnoDB 表默认规定如果没有主键列,在已有的数据中查找一列没有重复元素的列进行索引的构建,如果没有主键列也没有一列的元素没有重复的,会自动生成一列隐藏数据进行索引的构建,既然如此,还是自己主动建主键效率会更高。B+ 树的一个特点是节点中的数据从左到右递增排序,如果不使用自增的数据,构建索引的时候还要排序,影响效率;因为构建 B+ 树时就是排好序的,如果从第二个元素开始比较,此时构建好的索引结构第二个元素再整体看来可能不是排好序的,这样查询需要遍历所有的数据。二叉树,红黑树,Hash,B 树缺点。

2025-05-21 20:40:49 259

空空如也

空空如也

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

TA关注的人

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