自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL架构

MySQL属于关系型数据库,而关系型数据库的存储是以表的形式进行的,对于表的创建,数据的存储,检索,更新等都是由MySQL存储引擎完成的。研究过SQL Server和Oracle的读者可能很清楚,这两种数据库的存储引擎只有一个,而MySQL的存储引擎种类比较多,如MyIsam存储引擎,InnoDB存储引擎和Memory存储引擎。●当向某个表写入数据的时候,必须将和这个表相关的所有缓存设置为失效,如果缓存内容很多,则消耗也会很大,可能使系统僵死,因为这个操作是靠全局锁操作来保护的。

2024-08-12 11:26:41 635

原创 Collection 类关系图

Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。

2024-08-02 11:37:55 294

原创 MySQL 中的几种锁

MySQL 中的锁。

2024-07-14 12:23:17 629

原创 Redis五种基本数据类型的底层实现

redis五种基本类型可以涵盖项目中大多数的使用场景,而它们的底层实现在面试的过程中也是提问的提问的比较多的,今天就花时间来深入理解一下这五种基本数据类型的底层实现吧!

2024-06-11 23:52:14 699

原创 静态代理、jdk动态代理、cglib动态代理傻傻分不清?

那当然是有的,这种方式就是动态代理了,和静态代理不同的是,静态代理的代理类在代码运行前已经被我们手动创建好了,并且已经生成了class文件,而动态代理则是在程序运行时才创建的代理类,也就是说动态代理中的代理类不是我们手动在java代码中定义的,而是在运行的时候“动态”生成的。其实很简单,就和上边那张图一样,开始的时候客户端会来调用代理类的方法,由于在代理类内部持有目标对象的引用,此时代理类会直接调用目标对象的方法来完成这个功能,同时呢,代理类还可以自己添加一些增强逻辑,做一些额外的功能。

2024-06-03 23:28:48 574

原创 假如Redis⾥面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?

使⽤用 keys 指令可以扫出指定模式的 key 列列表。但是要注意 keys 指令会导致线程阻塞⼀一段时间,线上服务会停 顿,直到指令执⾏行行完毕,服务才能恢复。这个时候可以使⽤用 scan 指令, scan 指令可以⽆无阻塞的提取出指定模式 的 key 列列表,但是会有⼀一定的重复概率,在客户端做⼀一次去重就可以了了,但是整体所花费的时间会⽐比直接⽤用 keys 指令⻓。

2024-05-26 23:35:35 927

原创 深入PriorityQueue底层原理与源码解析

优先级队列:一般使用堆数据结构实现,堆一般使用数组存储集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。

2024-05-24 23:42:39 567

原创 什么是回表,如何解决回表问题

执行这样一条SQL: select name from A where name="s;name字段是有索引,所以MYSQL在通过name进行査询的时候,是需要扫描两颗B+tree树的。下面表中:主键id是聚簇索引,name是辅助索引。

2024-05-23 23:56:22 313

原创 环形链表(双指针)

设置两个快慢指针,循环若能相遇则是环形链表,否则不是。

2024-05-22 23:44:38 168

原创 为什么说change Buffer写缓冲区,仅适用于辅助索引页

应用的场景:对于写多读少的场景,页面在写完以后马上被访问到的概率是比较小的,这时使用change Buffer效果最好什么情况下进行merge?如果索引设置了唯一性,在进行修改时,InnoDB就必须要做唯一性校验,因此必须查询磁盘,做一次10操作。change Bufer作用:在进行DML操作的时候,如果请求的是辅助索引(非唯一索引)并且没有在缓冲池中,并不会立刻将磁盘页加载到缓冲池,而是在CB记录缓冲变。change buffer: 写缓冲区,是针对于二级索引页的更新优化措施。改,不会在CB中操作。

2024-05-22 23:40:57 314

原创 LRU缓存机制

也就是说,在每次插入结点/访问结点的时候,都会将相应结点移动到双向链表的尾部,从而达到按访问顺序进行排序的目的。loadFactor的默认值为0.75f,是官方给出的一个比较好的临界值。LinkedHashMap的底层数据结构和HashMap一样,采用数组+单向链表(JDK1.8之前)的形式,只是在节点Entry中增加了before和after变量,用于维护一个双向链表来保存LinkedHashMap的存储顺序。总结:这就是LRU的底层实现了,get和put方法的时间复杂度都是O(1),执行效率非常高。

2024-05-19 18:03:54 234

原创 Buffer Pool中是如何管理Page页

3)lru ist :表示正在使用的缓冲区,管理cean page和dity pae,该缓冲区以 midpoint 为基点,前面的链表称为new 列表区,存放经常被访问的数据,占63%,后面。注意:脏页在fush链表和LRU链表中都存在,但是两者互不影响,LRU链表负责管理page的可用性和释放,而fush list负责管理脏页的刷盘操作。2)flush list:表示的是需要刷新到磁盘的缓冲区,管理dirty page,内部page是按照修改时间排序。Page根据状态可以分为3中类型。

2024-05-19 09:59:47 311

原创 什么是Buffer Pool,介绍一下Buffer Pool

Buffer Pool:缓冲池,用来缓存表数据和索引数据的,减少磁盘IO。Buffer Pool有缓冲数据页(Page)和对缓存数据页进行描述的控制块组成。

2024-05-18 17:19:46 503

原创 InnoDB存储引擎的内存结构,都有哪几部分组成,各自的作用是什么

从MySQL5.5版本开始,默认使用的就是InnoDB存储引擎,它擅长处理事务,具有自动崩溃恢复的特性,使用非常广泛.。InnoDB存储引擎架构主要由两部分组成,内存结构和磁盘结构。

2024-05-18 16:53:34 155

原创 滑动窗口总结

---核心:左右双指针(L,R)在起始点,R向右逐位滑动循环。---核心:左右双指针(L,R)在起始点,R向右逐渐滑动循环。如果窗内元素满足条件,L向右缩小窗口,并更新最优结果,如果窗内元素满足条件,R向右扩大窗口,并更新最优结果。满足XXX条件(计算结果,出现次数,同时包含)如果窗内元素不满足条件,L向右缩小窗口。如果窗内元素不满足条件,R向右扩大窗口。例如:长度最小的子数组。----每次滑动过程中。----每次滑动过程中。子串/子数组/子序列。-----R达到结尾。使用思路(寻找最短)

2024-05-16 23:19:44 284

原创 有序数组的平方

双指针变种,两头向中间遍历,既然找不到最小值在哪,那就判断最大值,逆序插入。

2024-05-15 21:55:28 232

原创 有多少小于当前数字的数字

用一个哈希表hash(本题可以就用一个数组)来做数值和下标的映射。最后在遍历原数组nums,用hash快速找到每一个数值 对应的 小于这个数值的个数。例如,数组:1 2 3 4 4 4 ,第一个数值4的下标是3,第二个数值4的下标是4了。首先要找小于当前数字的数字,那么从小到大排序之后,该数字之前的数字就都是比它小的了。思想,哈希到数组之后,递推加起前面的所有数字,最后减去本身。最简单的思路来说,就是双重for循环进行遍历,来判断个数,所以可以定义一个新数组,将数组排个序。优化思路,其中一个思路就是。

2024-05-15 21:54:40 337

原创 独一无二的出现次数

题目中要求的是是否有相同的频率出现,那么需要再定义一个哈希表(数组)用来记录频率是否重复出现过,boolean flag [1002];定义布尔类型的就可以了,因为题目中强调1

2024-05-14 20:49:35 173

原创 找到出现了K次的数

然后看这个数组的每个位置,假设0位,这个位置如果是7的整数倍,那么数字A一定没在这个位置出现过。就是说给一个数组arr[] 给两个数字3, 7 其中3和7 就是K和M。这个数组中 有一种数出现了3次,其他数字都出现了7次 ,怎么找到出现了3次的数。我们用这个数组每个位置1的和表示多个数字,虽然这样数字就区分不开了,先不管。一个数组中有一种数出现了K次,其他数都出现了M次,M>1 ,K<M。假设其他所有数字出现了7次,只有一种数字(A)出现了2次。每个数字都累加到这个数组中。

2024-05-14 20:07:23 267

原创 找数字

在定义一个变量result1 让result1 去异或数组全部,但是只是异或第i位是1的,这样就会得到a。但是没完,因为只是知道了result 的值是a和b异或出来的。result ^ result1 等价于 a ^ a ^ b 得到b。因为result1 = a ,result = a^b。我们找到result中最靠右的1,比如是i。假设a的第i位是1 b的第i位是0。一类是 第i位置上 0的 A组。说明这个位置上a和b的值是不同的。a和b一定是在这两个不同的数组中。一类是第i位置上是1 B组。

2024-05-14 20:02:36 348

原创 如何不用额外变量交换两个数

b = a ^ b;等价于 b = xyy;因为y^y = 0 x^0 = x 所以b = x。这里要注意,i和j 不能指向同一个内存地址。否则会导致成0. 可以是相同的数字,但是不能是相同内存地址。a = a ^ b;等价于 a = x ^ y;a = a ^ b;等价于 a = xyx;这个代码都见过,都写过。

2024-05-13 22:58:12 361

原创 MySQL架构

MySQL属于关系型数据库,而关系型数据库的存储是以表的形式进行的,对于表的创建,数据的存储,检索,更新等都是由MySQL存储引擎完成的。研究过SQL Server和Oracle的读者可能很清楚,这两种数据库的存储引擎只有一个,而MySQL的存储引擎种类比较多,如MyIsam存储引擎,InnoDB存储引擎和Memory存储引擎。●当向某个表写入数据的时候,必须将和这个表相关的所有缓存设置为失效,如果缓存内容很多,则消耗也会很大,可能使系统僵死,因为这个操作是靠全局锁操作来保护的。

2024-05-13 22:52:26 1338

原创 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN

常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。INNER JOIN 会根据 students 表中的 grade_id 和 grades 表中的 id 进行匹配,然后将匹配的结果合并起来。当涉及到多个表的联表查询时,不同类型的 JOIN 可以产生不同的结果。students 表包含学生的信息,其中 grade_id 是一个外键,指向 grades 表中的对应成绩的标识符。现在,假设我们想要查询每个学生的姓名以及他们所属的成绩名称。

2024-04-23 21:43:30 599

原创 如何对生存环境中的数据库进行压测

这个压测结果会根据每个人的机器的性能不同有很大的差距,你要是机器性能特别高,那你可以开很多的并发线程去压测,比如100个线程,此时可能会发现数据库每秒的TPS有上千个,如果你的机器性能很低,可能压测出来你的TPS才二三十个,QPS才几百个,这都是有可能的。举个例子,之前在我门的一个项目的生产环境中,据我们观察,一台4核8G的机器如果每秒抗下500+的请求,那么他的CPU负载就已经很高了,基本上最多可能也就是去抗下每秒1000+的请求,而且那个时候CPU负载基本会打满,机器有挂掉的风险。

2024-04-23 20:31:18 559

原创 互联网公司的生产环境数据库是如何进行性能测试的

(2)网络负载:这个主要是要看看你的机器带宽情况下,在压测到一定的QPS和TPS的时候,每秒钟机器的网卡会输入多少MB数据,会输出多少MB数据,因为有可能你的网络带宽最多每秒传输100MB的数据,那么可能你的QPS到1000的时候,网卡就打满了,已经每秒传输100MB的数据了,此时即使其他指标都还算正常,但是你也不能继续压测下去了。这个指标是很关键的,因为之前我们在数据库架构原理中讲解过,你在内存中更新的脏数据库,最后都会由后台IO线程在不确定的时间,刷回到磁盘里去,这就是随机IO的过程。

2024-04-21 16:19:54 767

原创 生产环境下数据库机器配置如何规划

对于这类系统的数据库机器选型,就不在我们的考虑范围之内了。但是在我们的专栏中,我们希望能够教会大家较为专业化的数据库使用经验,包括数据库的整体架构原理,还有就是如何规划生产环境下的数据库,包括当你有一个生产库之后,要做的事情就是设计压测方案,包括对你的数据库进行压测,包括对你的数据库部署可视化监控系统,等等。我们主要关注的是有一定并发量的互联网类的系统,对数据库可能会产生每秒几百,每秒几千,甚至每秒上万的并发请求量,对于这类场景下,我们应该选择什么样的机器去部署数据库,才能比较好的抗下我们的系统压力。

2024-04-20 17:12:26 608

原创 聊聊binlog是什么

这时候肯定有同学会问了,最后在redo日志中写入commit标记有什么意义呢?说白了,他其实是用来保持redolog日志与binlog日志一致的。我门来举个例子,假设我门在提交事务的时候,一共有上图中的5、6、7三个步骤,必须是三个步骤都丸行完毕,才算是提交了事务。那么在我门刚完成步骤5的时候,也就是redo log刚刷入磁盘文件的时候,mysql宕机了,此时怎么办?这个时候因为没有最终的事务commit标记在redo日志里,所以此次事务可以判定为不成功。

2024-04-18 22:51:57 1225

原创 初步了解InnoDB存储引擎的架构设计

因为我们想一下,在我们更新“id=10”这一行数据的时候,肯定是不允许别人同时更新的,所以必须要对这行记录加独占锁。当我们把要更新的那行记录从磁盘文件加载到缓冲池,同时对他加锁之后,而且还把更新前的旧值写入undo日志文件之后,我们就可以正式开始更新这行记录了,更新的时候,先是会更新缓冲池中的记录,此时这个数据就是脏数据了。当这个参数的值为0的时候,那么你提交事务的时候,不会把redolog buffer里的数据刷入磁盘文件的,此时可能你都提交事务了,结果mysql宕机了,然后此时内存里的数据全部丢失。

2024-04-17 00:08:38 1093

原创 为了执行SQL语句,MySQL的架构是怎样设计的

举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取users”表中的第一行数据,然后判断一下这个数据 的“id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。所以对数据库而言,我们的数据要不然是放在内存里,要不然是放在磁盘文件里,没什么特殊的地方!今天给大家留一个小的思考题,就是你先别管MySQL有哪些存储引擎,你就从业务场景来出发考虑,有的场景可能是 高并发的更新,有的场景可能是大规模数据查询,有的场景可能是允许丢失数据的。

2024-04-15 21:19:21 1671 1

原创 你的系统是如何跟MySQL打交道的

所以一般我们必须要使用一个数据库连接池,也就是说在一个池子里维持多个数据库连接,让多个线程使用里 面的不同的数据库连接去执行SQL语句,然后执行完SQL语句之后,不要销毁这个数据库连接,而是把连接放 回池子里,后续还可以继续使用。常见的数据库连接池有DBCP,C3PO,Druid,等等,大家如果有兴趣的话,可以去搜索一下数据库连接池的 使用例子和代码,甚至探索一下数据库连接池的底层原理,但这个不是我们专栏的重点,我们就不会拓展了。同时我们可能会有多个系统同时去访问一个数据库,这都是有可能的。

2024-04-13 23:51:05 931

原创 MyBatis 执行流程

加载配置文件:MvBatis 的执行流程从加载配置文件开始。通常,MyBatis 的配置文件是一个 XML 文件,其中包含了数据源配置、SQL 映射配置、连接池配置等信息。 构建 SqlSessionFactory:在配置文件加载后,MyBatis 使用配置信息来构建 SqlSessionFactory,这是MyBatis 的核心工厂类。SqlSessionFactory 是线程安全的,它用于创建 SqlSession 对象。 创建 SqlSession:应用程序通过 SqlSessionFactory

2024-04-12 15:03:02 839

原创 什么是事务传播机制?

Spring Boot 事务传播机制是指,包含多个事务的方法在相互调用时,事务时如何在这些方法之间传播的。

2024-04-11 22:27:35 531

原创 Autowired和Resource的关系?

它等于说是一个标准或者约定,所有的IOC容器都会支持这个注解。假如系统容器从Spring迁移到其他IOC容器中,是不需要修改代码的。2. Resource在获取bean的时候,和Autowired恰好相反,先是byName方式,然后再是byType方式。对于下面的代码来说,如果是Spring容器的话,两个注解的功能基本是等价的,他们都可以将bean注入到对应的field中。1. Autowired是Spring提供的自动注入注解,只有Spring容器会支持,如果做容器迁移,是需要修改代码的。

2024-04-10 22:07:27 460

原创 请求转发和请求重定向的区别

请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。而客户端对于这一切毫无感知的,这就好比,张三(客户端)找李四(服务器端)借钱,而李四没钱,于是李四又去王五那借钱,并把钱借给了张三,整个过程中张三只借了一次款,剩下的事情都是李四完成的,这就是请求转发。

2024-04-09 22:58:00 682

原创 如何解决Redis和数据库的一致性问题?

也就是说,假如一个读线程,在读缓存的时候没查到值,他就会去数据库中查询,但是如果自查询到结果之后,更新缓存之前,数据库被更新了,但是这个读线程是完全不知道的,那么就导致最终缓存会被重新用一个"旧值"覆盖掉。所以,任何的技术方案,都是一个权衡的过程,要权衡的问题有很多,业务的具体情况,实现的复杂度、实现的成本,团队成员的接受度、可维护性、容易理解的程度等等。所以,对于一个读线程来说,虽然不会写数据库,但是是会更新缓存的,所以,在一些特殊的并发场景中,就会导致数据不一致的情况。

2024-04-06 19:07:12 1569

原创 索引失效的场景有哪些

5.类型转换:如果索引列存在类型转换,那么也不会走索引,比如某列为字符串类型,而查询的时候设置了 int类型的值就会导致索引失效。6.使用 is not nul:当在查询中使用了 is not null 也会导致索引失效,而 is nul 则会正常触发索引的,1.联合索引非最左匹配:当使用联合索引时,未遵循最左匹配原则,则不能正常使用索引,也就是索引失效了。4.使用函数:查询列如果使用任意 MySOL提供的函数就会导致索引失效,3.使用列运算:如果索引列使用了运算,那么索引也会失效。

2024-04-01 00:25:03 506

原创 更新一条SQL的执行流程

根据执行计划,MySQL需要对受影响的数据行进行加锁,以确保事务的隔离性和一致性。: 当 Redo Log 缓冲区达到一定大小或者经过一定时间后,MySQL 会将 Redo Log 缓冲区的内容刷新到磁盘上(称为 checkpoint),并调用操作系统级别的 fsync()函数同步数据到磁盘,确保 Redo Log的持久性。当所有更新操作完成并且 Redo Log 已经持久化到磁盘后,MySQL 可以提交事务,并将 Redo Log 的相应部分标记为已提交(commit 状态)。

2024-03-30 22:38:37 668

原创 为什么ConcurrentHashMap不允许null值?

但是,像ConcurrentHashMap,它是为并发而生的,它是要用在并发场景中的,当我们map.get(key)返回null的时候,是没办法通过map.contains(key)检查来准确的检测,因为在检测过程中可能会被其他线程所修改,而导致检测结果并不可靠。假如说,所有的Map都支持null的话,那么map.get(key)就可以返回null,但是,这时候就会存在一个不确定性,当你拿到null的时候,你是不知道他是因为本来就存了一个null进去还是说就是因为没找到而返回了null。

2024-03-27 16:06:33 677 1

原创 消息队列有什么用?

在一个复杂的系统中,不同的模块或服务之间可能需要相互依赖,如果直接使用函数调用或者 API 调用的方式,会造成模块之间的耦合,当其中一个模块发生改变时,需要同时修改调用方和被调用方的代码。而使用消息队列作为中间件,不同的模块可以将消息发送到消息队列中,不需要知道具体的接收方是谁,接收方可以独立地消费消息,实现了模块之间的解耦。而使用消息队列,可以将这些操作封装成消息,放入消息队列中,异步地处理这些操作,不影响主流程的执行,提高了系统的性能和响应速度。

2024-03-19 19:41:22 397

原创 redis如何保证缓存一致性

当有两个线程A、B,同时对一条数据进行操作,一开始数据库和redis的数据都为tony,当线程A去修改数据库,将tong改为allen,然后线程A在修改缓存中的数据,可能因为网络原因出现延迟,这个时候线程B,将数据修改成了Mike、然后将数据库中的tony,也改成了Mike,然后线程A恢复正常,将redis中的缓存改成了allen,此时就出现了缓存数据和数据库数据不一致情况。对于存在过期的数据,因为有过期时间,只会在特定的时间段内数据不一致,下次数据过期后,可以恢复,对于实时性要求不高时,

2024-03-15 22:09:34 984

空空如也

空空如也

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

TA关注的人

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