自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 主从同步延迟——Java全栈知识(35)

当数据库主库有较大更新并发操作时,可能会导致主从同步延迟,因为从库里面读取 binlog 的线程仅有一个,当某个SQL 在从库上执行的时间稍长或者由于某个 SQL 要进行锁表就会导致主从同步延迟,主库的 SQL 大量积压,未被同步到从库里。例如,对于一个用户管理系统来说,注册+登录的业务读军操作全部访问主库,用户的介绍、爱好、等级等业务,可以采用读写分离,因为即使用户改了自己的自我介绍,在查询时却看到了自我介绍还是旧的,业务影响与不能登录相比就小很多,业务上一般可以接受。

2024-07-14 13:50:52 299

原创 MySQL的主从复制——Java全栈知识(34)

主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。MySQL 支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。主从复制之后所有数据都一致,从库也可以作为主库给其他从库复制。

2024-07-14 13:49:59 357

原创 页分裂和页合并——Java全栈知识(33)

上篇文章我们讲到了 MySQL 的数据页,我们说到了 InnoDB 的索引是以 B+树的形式构建的,而且 B+树的节点都是一个数据页。但是 B+树在使用过程中难免会有节点分裂和节点合并的过程。因为我们是以数据页为基本单位构造的 B+树,那么 B+树的节点分裂和节点合并就会造成数据页的页分裂和页合并。我们都是知道,B+树是按照索引字段建立的,并且在 B+树中是有序的,假如有下面一个索引的树结构,其中的索引字段的值并不连续。

2024-06-28 20:39:51 452

原创 MySQL的数据页——Java全栈知识(32)

通过这种方式,InnoDB 利用 B+树和数据页的组合,实现了高效的数据存储和检索。B+树的非叶子节点对应着数据页,其中存储着主键+指向子节点(即其他数据页)的指针。B+树的叶子节点包含实际的数据行,每个数据行存储在一个数据页中。InnoDB 是以数据页为单位进行磁盘读写和文件 IO 的,也就是一次从磁盘到内存的最小单位就是 16KB,每次从内存到磁盘存储也是 16KB。通过 B+树的搜索过程,可以从根节点开始逐层遍历,最终到达叶子节点,找到所需的数据行。

2024-06-28 20:38:40 290

原创 MySQL事务——Java全栈知识(31)

缓冲池(buffer pool): 主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率刷新到磁盘,从而减少磁盘 IO,加快处理速度。通过名字我们就可以知首,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。所以,这种隔离级别是可以避免脏读的发生的。可串行化 (Serializable)是最高的隔离级别,前面提到的所有的隔离级别都无法解决的幻读,在可串行化的隔离级别中可以解决。

2024-06-28 20:33:46 787

原创 索引创建原则和索引失效情况——Java全栈知识(30)

也就是说我们的联合索引(索引多列)必须要符合最左前缀法则,在查询的时候必须按照索引创建的顺序,不能跳跃前缀的列,否则索引将失效。5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。6). 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。索引列不能参与运算,如果作为条件的索引列参与运算的话,索引也会失效,如下。

2024-06-27 10:24:57 288

原创 索引的分类和回表查询——Java全栈知识(29)

Mysql 的索引按照类型可以分为以下几类,但是我们使用的 InnoDB 只支持主键索引,唯一索引,普通索引,并不支持全文索引。

2024-06-24 22:39:38 501

原创 Mysql索引底层数据结构——Java全栈知识(28)

索引在项目中还是比较常见的,它是帮助MySQL高效获取数据的,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

2024-06-24 22:32:15 892

原创 如何处理优化这个慢查询——Java全栈知识(27)

如果一条 sql 执行很慢的话,我们通常会使用 mysql 自动的执行计划 explain 来去查看这条 sql 的执行情况,比如在这里面可以通过 key 和 key_len 检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过 type 字段查看 sql 是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过 extra 建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复。那这个 SQL 语句执行很慢, 如何分析呢?

2024-06-24 08:45:00 193

原创 什么是慢查询——Java全栈知识(26)

慢查询:也就是接口压测响应时间过长,页面加载时间过长的查询原因可能如下:1、聚合查询2、多表查询3、单表数据量过大4、深度分页查询(limit)

2024-06-23 20:21:41 267

原创 为什么说 Redis 是单线程的?——Java全栈知识(25)

我们常说的 Redis 是单线程的,但是我前面在讲持久化机制的时候又说 RDB 的持久化是通过主进程 fork 出一个子进程来实现 RDB 持久化。那么 Redis 到底是多线程还是单线程的呢?但是在 Redis4.0 之后,Redis 引入了多线程模型,但是 IO 部分还是由单线程完成,而其他的如持久化存储模块、集群支撑模块等是多线程的。(Redis 6.0 之后将网络 IO 改为了多线程)info]前面我们讲到的 RDB 持久化,以及 Redis 集群支撑都是基于多线程完成的。

2024-05-20 21:32:01 463

原创 Redis如何解决缓存击穿问题——Java全栈知识(24)

我们在正常使用缓存的时候的流程大概就是这样的:请求访问缓存,缓存有数据就返回,缓存无数据就去数据库里面查数据写入到缓存中。

2024-05-18 22:53:12 236

原创 Redis如何应对缓存穿透问题——Java全栈知识(23)

我们在正常使用缓存的时候的流程大概就是这样的:请求访问缓存,缓存有数据就返回,缓存无数据就去数据库里面查数据写入到缓存中。

2024-05-18 22:19:13 362

原创 Redis 哨兵机制的工作原理——Java全栈知识(22)

接下来我们详细讲哨兵机制的作用以及实现原理以下是 Redis 哨兵的结构图。

2024-05-18 22:15:00 1220

原创 Redis 主从同步的原理——Java全栈知识(21)

简述全量同步和增量同步区别?全量同步:master 将完整内存数据生成 RDB,发送 RDB 到 slave。后续命令则记录在 repl_baklog,逐个发送给 slave。增量同步:slave 提交自己的 offset 到 master,master 获取 repl_baklog 中从 offset 之后的命令给 slave什么时候执行全量同步?slave 节点第一次连接 master 节点时slave 节点断开时间太久,repl_baklog 中的 offset 已经被覆盖时。

2024-05-18 16:51:22 549

原创 Redis的集群模式——Java全栈知识(20)

哨兵架构下 client 端第一次从哨兵找出 redis 的主节点,后续就直接访问 redis 的主节点,不会每次都通过 sentinel 代理访问 redis 的主节点,当 redis 的主节点挂掉时,哨兵会第一时间感知到。针对于分片,主节点只负责读和写,从节点只负责读操作,从节点的数据是依靠主节点同步过来,也就是和主从模式一样。Redis Cluster 能够自动检测节点的故障。当一个节点失去连接或不可达时,Redis Cluster 会尝试将该节点标记为不可用,并从可用的从节点中提升一个新的主节点。

2024-05-14 18:18:25 744

原创 Redis的数据淘汰策略——Java全栈知识(19)

数据过期策略是 redis 中设置了 TTL 的数据过期的时候 Redis 的处理策略。数据淘汰策略是 Redis 内存不够的时候,数据的淘汰策略:当 Redis 中的内存不够用时,此时在向 Redis 中添加新的 key, 那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规测被称之为内存的淘汰策略。redis 的内存删除策略有:·noeviction: 不会淘汰任何键值对,而是直接返回错误信息。

2024-05-12 20:46:47 540 1

原创 Redis的数据过期策略——Java全栈知识(18)

定期删除会在 Redis 设置的过期键的过期时间达到一定阈值时进行一次扫描,将过期的键删除,但不会立即释放内存,而是把这些键标记为“已过期”,并放入一个专门的链表中。然后,在 Redis 的内存使用率达到定阈值时,Redis会对这些“已过期”的键进行一次内存回收操作,释放被这些键占用的内存空间。惰性删除是 Redis 的被动删除策略,它可以节省 CPU 资源,但是会导致过期的 key 始终保存在内存中,占用内存空间。定期删除是 Redis 的主动删除策略,它可以确保过期的 key 能够及时被删除,

2024-05-11 20:18:04 298

原创 Redis持久化策略——Java全栈知识(17)

1、RDB: 以快照的方式将此刻 Redis 中的数据以二进制的文件形式保存在磁盘中。RDB 的优点是:快照文件小、恢复速度快,适合做备份和灾难恢复。RDB 的缺点是:定期更新可能会丢数据(在最后一次数据快照到服务器宕机之间的数据就会丢失)2、AOF: AOF 是将 Redis 的所有写操作追加到 AOF 文件 (Append Only File)的结尾,从而记录了 Redis 服务器运行期间所有修改操作的详细记录。当 Redis 重新启动时,可以通过执行 AOF 文件中保存的写操作来恢复数据。AO

2024-05-09 21:53:59 443

原创 RabbitMQ是如何保证消息可靠性的?——Java全栈知识(16)

每个只能配置一个,因此我们可以在配置类中统一设置。我们在 publisher 模块定义一个配置类:log . error("触发return callback,");} });} }log . error("触发return callback,");} });} }Slf4j;import orglog . error("触发return callback,");} });} }

2024-05-07 19:27:33 1012

原创 RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter):架构:由于第一个队列没有消费者,所以可以在第一个队列中设置 TTL,当消息过期的时候,这个消息就变成了死信,被丢掉私信交换机中,以此实现延迟任务功能。前面两种作用场景可以看做是把死信交换机当做一种消息处理的最终兜底方案,与消费者重试时讲的作用类似。而最后一种场景,大家设想一下这样的场景: 如图,有一组绑定的交换机()和队列()。但是没有消费者监听,而是设定了死信交换机,而队列则与死信交换机绑定,RoutingKey是blue:

2024-05-06 22:07:50 1121 3

原创 RabbitMQ是怎么做消息分发的?——Java全栈知识(14)

RabbitMQ 的消息分发分为五种模式:分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。

2024-05-06 20:17:11 942 3

原创 分布式 ID 的实现方案——Java全栈知识(13)

数据倾斜是指在分布式计算或数据库环境中,数据分布不均匀的现象。在理想的分布式系统中,数据和计算负载应该均匀分布在所有节点上。然而,由于各种原因,某些节点可能承载比其他节点更多的数据或计算负载,这就是数据倾斜。比如一个系统中共有 500 万数据,但是属于同一个商家的数据就有 400 万,那么如果数据库按照商家做分库分表,就会导致出现严重的数据倾斜。一般来说,数据倾斜发生在分库分表的场景中比较多,因为主要是因为分表字段选择的不够合适导致的。你比如说一个定价系统,然后我们是按照付款方做的分库分表。

2024-05-05 21:14:59 1059 1

原创 什么是数据倾斜?怎么解决?——Java全栈知识(12)

数据倾斜是指在分布式计算或数据库环境中,数据分布不均匀的现象。在理想的分布式系统中,数据和计算负载应该均匀分布在所有节点上。然而,由于各种原因,某些节点可能承载比其他节点更多的数据或计算负载,这就是数据倾斜。比如一个系统中共有 500 万数据,但是属于同一个商家的数据就有 400 万,那么如果数据库按照商家做分库分表,就会导致出现严重的数据倾斜。一般来说,数据倾斜发生在分库分表的场景中比较多,因为主要是因为分表字段选择的不够合适导致的。你比如说一个定价系统,然后我们是按照付款方做的分库分表。

2024-05-04 20:13:16 945

原创 什么是一致性 Hash 算法?——Java全栈知识(11)

哈希算法大家都不陌生,经常被用在负载均衡、分库分表等场景中,比如说我们在做分库分表的时候,最开始我们根据业务预估,把数据库分成了 128 张表,这时候要插入或者查询一条记录的时候,我们就会先把分表键,如 buyer_id 进行 hash 运算,然后再对 128 取模,得到 0-127 之间的数字,这样就可以唯一定位到一个分表。但是随着业务得突飞猛进,128 张表,已经不够用了,这时候就需要重新分表,比如增加一张新的表。

2024-05-04 20:03:58 333

原创 分库分表都有哪些算法?——Java全栈知识(10)

通过分片键进行 hash 取模,取模的数量就是分表的数量。不利于扩容。

2024-05-04 20:02:52 349

原创 登录接口设计的优缺点——开发经验(3)

本文没有具体实现过程,只讨论各个登录方式的优缺点。

2024-04-11 20:53:25 965

原创 Redis如何应对缓存穿透问题——Java全栈知识(9)

我们在正常使用缓存的时候的流程大概就是这样的:请求访问缓存,缓存有数据就返回,缓存无数据就去数据库里面查数据写入到缓存中。

2024-03-26 22:31:25 475

原创 ShardingSphere水平分表——开发经验(2)

替换spring:# ShardingSphere 对 Driver 自定义,实现分库分表等隐藏逻辑# ShardingSphere 配置文件路径# 数据源集合ds_0:rules:SHARDINGtables:sys_user:# 真实数据节点,比如数据库源以及数据库在数据库中真实存在的# 分表策略# 用于单分片键的标准分片场景standard:# 分片键# 分片算法,对应 rules[0].shardingAlgorithms# 分片算法# 数据表分片算法。

2024-03-24 22:16:11 953

原创 推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入,setter方法注入,构造器注入。这三种Bean注入的方式各有优缺点,但是相对来说更推荐使用构造器注入的方式。

2024-03-22 14:33:03 296

原创 HashMap源码分析——Java全栈知识(8)

因为如果我们频繁添加删除元素,使得链表的长度恰好是7左右,如果转化阈值是7则会频繁的转化位链表和红黑树,从而占用大量的CPU资源,设置为6和8就可以很好的避免此类情况。

2023-11-02 15:22:07 168

原创 如何遍历Map集合

这种遍历的方式其实是将map的key生成了一个set的集合,再遍历set根据set中的key获取到对应的value,这种方式可以完成但是效率比较低,不推荐。在阿里巴巴规范中不建议使用第一种遍历方式,如果需要遍历更推荐使用第二种或者第三种方式。

2023-05-18 11:35:38 247

原创 Redis序列化设置以及jetcache连接Redis序列化的设置

单独使用redis的时候可以改序列化工具为json序列化,但是更推荐使用手动序列化然后直接存String,这样更省空间。如果使用jetcache的时候只能改为jdk,kryo序列化工具,暂时不支持使用json序列化工具。

2023-04-23 16:24:32 1326

原创 Error creating bean with name ‘redisAutoInit‘ defined in class path resource [com/alicp/jetcache/aut

问题原因:jetcache 2.7.3所希望用的jedis的版本是 4.3.1 ,和我们springBoot提供的jedis不匹配。问题起因:使用springBoot整合jetcache,使用2.6.2可以完成,但是使用2.7.3就报错。jetcache建议我们使用的jedis版本。springboot提供的版本。

2023-04-15 18:58:15 1045

原创 ArrayList源码分析——Java全栈知识(7)

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。

2023-04-09 23:56:17 781

原创 Java集合详解(1)——Java全栈知识(6)

在java.util包下面大多都是线程不安全的集合,也有少数线程安全的集合例如:Hashtable和Vector,但是这两个集合,都是一些古老的API,从名字就可以看出来,甚至Hashtable没有符合Java的命名规范。因为可能有些HashMap在使用的过程中频繁添加删除元素,导致链表长度频繁的在7和8之间浮动,如果此时阈值是8的话,那么将会频繁的构造红黑树和链表。更适合在外存上使用,而我们引入红黑树是为了解决链表过长导致查询效率下降的问题,HashMap的一个数组空间中不可能会存储大量的元素。

2023-04-08 17:22:27 389

原创 Java全栈知识(5)泛型机制详解

这些也被叫做泛型类,泛型接口,泛型方法。为我们的本意是把子类中的泛型也都指定为Date类型,但是由于泛型擦除机制,此时的父类和子类中同名方法的返回类型就变得不相同了,而重写也就变成了重载,泛型擦除就和多态发生冲突。泛型机制是JDK1.5引入的新内容,所以说需要与老的代码兼容,所以说Java实现的其实是一种”伪泛型“的机制,即在编译期会把里的内容全部擦去,替换为具体的类型。我们可以看到在子类中我们覆盖了弗雷德两个方法,但是因为泛型擦除的机制,编译的时候父类方法中的泛型都被擦除为Object。

2023-04-05 10:16:17 740

原创 Java全栈知识(4)异常的处理的特殊情况

当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止;如果有finally块,系统立即开始执行finally块。只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的return或throw语句;

2023-03-25 14:23:44 382

原创 Java全栈知识(3)接口和抽象类

接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好地降低程序各模块之间的耦合,从而提高系统的可扩展性和可维护性。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当成最终产品,必须有更进一步的完善。抽象类体现的是一种模板设计,抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当成最终产品,必须有更进一步的完善。,抽象类中可以有0个或者多个抽象方法。

2023-03-21 23:06:34 389

原创 Java全栈知识(2)String类String常量池

其实在字符串常量池中是,创建了“ world”对象,并且重新创建了一个新的String对象,内容是“hello world”,然后改变了str1的指向,从而改变了str1中的值,原来的“hello”还在String Pool中,此时的StringPool中一共有三个对象“hello”“ world”“hello world”。如果我们调用new String()方法是直接创建了一个新的String对象,所以两次创建的都是不同的对象,有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中;

2023-03-19 22:01:24 430

空空如也

空空如也

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

TA关注的人

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