自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 慢SQL问题全解析:原因诊断与性能优化策略

执行时间长的。

2024-04-29 23:06:03 692

原创 Redis线程模型及性能优化概述

6.0版本,redis采用的是。

2024-04-29 21:11:21 596

原创 Java并发:从超卖问题到锁的升级过程

假如我们现在有一百个线程,商品A库存量为100,售出方法为sale()在没有上锁是,即时我们设置当库存量为零时停止售卖,但是也极有可能出现超卖的情况,这是由于我们售卖的方法没有原子性,在售出的过程中,库存为零时,其他线程可能刚好调用方法,这时条件没有更改,所以是无法及时停止的。

2024-04-19 14:41:48 150

原创 SQL 查询技巧与应用

请你编写一个 SQL 查询,将学生表和班级表的所有行组合在一起,并返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)以及班级名称(class_name)。请你编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式获取每个班级内的学生的前一名学生姓名(prev_name)、后一名学生姓名(next_name)。,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号);

2024-04-18 23:20:19 947

原创 理解Docker:基础镜像、Dockerfile和容器镜像

如果你想将自己写的代码部署到各个不同操作系统的服务器上,那依赖的软件和配置就更多了,需要针对每个环境单独写一套部署脚本,这是很麻烦的,那么就需要加一个中间层,这个中间层就是docker。操作系统是需要硬件配置的,并且如果你在你的电脑中再配一套操作系统,他的运行速度会变慢,性能也会下降,而且,你将程序开发在操作系统A上,那么如果有不同的操作系统想要使用你的程序,那就必须安装操作系统A,这太麻烦了。我们写的代码想要跑起来必须需要环境,而环境是依赖于操作系统的,对于不同的操作系统,环境和配置都是不同的。

2024-04-18 16:12:36 568 1

原创 数据库慢SQL排查及优化问题

查询会花费很长时间才能返回结果的sql语句。:确保查询使用了适当的索引。有时候,缺少或错误使用索引会导致查询变慢。:审查慢查询的SQL语句,看看是否可以通过改写查询或者使用更有效的SQL来提高性能。:确保数据库服务器有足够的资源来处理查询。不足的CPU、内存或磁盘IO可能会导致性能问题。:如果你在应用程序中使用了数据库连接池,确保连接池的配置正确。连接池的设置也可能影响性能。:查看数据库的统计信息,了解表的大小、索引情况和数据分布。这些信息可以指导你哪些地方需要优化。

2024-04-16 22:56:13 588

原创 ShardingSphere:强大的分布式数据库中间件【图文】

Sharding-Proxy :它以代理的形式部署在应用程序与数据库之间,实现了对 SQL 的解析和改写以及请求的转发。使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。是在数据库层面上进行的一种策略,能够将数据根据某种规则分散至多个库或表中,每个分片仅包含数据的一部分。:首先,在应用程序的配置中,你需要配置多个数据库数据源,包括主库(用于写操作)和多个从库(用于读操作)。主库用于写操作,从库用于读操作。

2024-04-16 22:28:48 1973

原创 如何应对MySQL单表数据量过大:垂直分表与水平分表策略解析二

对于数据分表已经知道水平分表和数值分表,但是对于水平分表来说,常用的取模分表和范围分表都很难应对一种情况,比如如果我们想查询的数据并非主键id而是名字,公司,那这样的情况ID取模分表和ID范围分表都无法解决,这样我们的sql语句会并发查询所有的表,这就是读扩散问题。中间层的实现方式就更灵活了,可以加第三方库,但这样就需要根据不同语言实现不同的代码库,比较繁琐,也可以都选择在MYSQL和业务代码之间加个服务去做这个中间层分表路由逻辑。根据id范围分表到user_0表,再进行取模得到最终属于user0_0表。

2024-04-15 20:53:35 368

原创 如何应对MySQL单表数据量过大:垂直分表与水平分表策略解析

话接上回,单表最大数据建议两千万,那如果开发一个项目,预计注册量达到一个亿怎么办。单表内放这么多数据,MYSQL底层B+树的层级结构就可能会变得很高,磁盘io次数变多,性能会大幅度降低。所以考虑数据库分表。这里的分表分为垂直分表和水平分表两种。

2024-04-15 18:14:19 366

原创 为什么MySQL数据库超过2000万条数据,查询依然很快:B+树和数据页结构解析

数据页是需要读写的,为了保证写数据到一半突发意外,还引入了校验码,这个被加入到了页尾中,对于单页的数据查找,Mysql还形成了页目录,页目录可以实现二分查找再次降低时间复杂度,剩下的空间才是用来放行数据的。,将他们组成新的行数据,放入到一个新生成的数据页中,各个新的数据页跟之前的页结构没什么太大的区别,而且大小还是16K,同时为了跟之前的数据页进行区分,新的数据页里需要加入页层级的信息,于是数据页之间就有了上下层级的概念,它其实就是我们常说的B+树。假设一条行数据占1K,那一个数据页里能放15行。

2024-04-15 17:22:13 973

原创 解析ShardingSphere:强大的分布式数据库中间件

ShardingSphere是一套开源的分布式数据库中间件,旨在为分布式数据库架构提供一系列服务。作为一套完整的解决方案,ShardingSphere包含JDBC和Proxy两大核心组件,它们均提供标准化的数据分片、分布式事务处理以及数据库治理功能。无论是在Java同构环境中还是在多语言、云原生等异构环境中,ShardingSphere都能够有效地工作。

2024-04-14 23:06:06 1060

原创 深入探索 RabbitMQ:功能丰富的消息中间件一

RabbitMQ是一个开源的消息代理软件,它使用Erlang语言编写,天生被设计用于处理分布式环境中的消息传递问题。Erlang的并发处理能力使得RabbitMQ在处理大量消息传递时表现出色,确保了高可用性和可扩展性。

2024-04-14 20:16:36 551

原创 深入微服务框架:构建高效、可扩展与弹性的现代应用架构

这里准备好的功能我们称为生产者,使用,直接调用我们已经实现的模块称为消费者,管理消费者和生产者的平台我们称为管理平台。模块ABCD...都需要扫描我们的数据库,也都需要额外的实现支付功能,那么我们的这个程序过于冗余,而且每个模块在使用的时候都需要扫描一次数据库,这对于数据库来说压力过大了。假如我们打算开发一个应用程序,就拿支付宝来说,我们常用的业务是支付,但是我们内部也需要其他的业务,我们实现功能AB的时候,每个子模块都是独立开发的。中央管理平台功能:生产者,消费者,注册,服务发现,服务治理,申请调用。

2024-04-13 23:43:09 511 1

原创 46.全排列

防止重复遍历:对已经遍历过的节点进行标记。给定一个不含重复数字的数组。长度达到最大时进行返回。

2024-04-13 16:30:27 201

原创 HashMap的put方法--源码解读

如果为 null,则根据字段阈值中保留的初始容量目标进行分配。否则,由于我们使用的是 2 的幂展开,因此每个 bin 中的元素必须保持在同一索引处,或者在新表中以 2 的幂偏移量移动。onlyIfAbsent – 如果为 true,则不更改现有值。evict – 如果为 false,则表处于创建模式。tab下标(位于Hashmap的数组中的位置)的计算。上一个值,如果为 null,则为 null。我们在这里调用了putVal方法,再次进入。第二次放入:key值相同。我们放入值,会发生什么。

2024-04-11 15:46:44 171

原创 深入理解大型项目服务器部署与数据库优化策略

长久的使用,一个表中的数据量很多,最先出现的问题是,我们进行磁盘io读取数据库数据时,需要几秒的时间,此时我们虽然仍可以使用该表,但是读取时间过长,所以我们此时挑出一列作为。如果是微型的服务,我们是不需要其他操作的,但是如果我们公司想开发一个大型的项目,那么将所有的内容都部署到一台服务器上是不太现实的,这个时候就需要虚。此时数据库暂时解决了,但是如果只有一台服务器,负担五十个表,也是非常困难的,所以我们可以将这五十个表分到不同的服务器上,这就是。,每秒访问次数可达几百万,那么每天可以几十到几百万次访问。

2024-04-11 15:29:43 279

原创 旋转链表--快慢指针思想

相似题型:删除链表的第倒数第n个节点,建议先做。

2024-04-10 19:07:43 217

原创 linux常见使用命令

在这个界面,按下 shift + p 列表就会按照cpu使用情况进行排序,在有多核cpu的情况下,cpu占用率>100%在这个界面,按下 shift + M 列表就会按照内存使用情况进行排序。修改文件的所有者(如果这个文件属于B,那我们需要切换到B下执行命令)修改文件的所属组(如果这个文件属于B,那我们需要切换到B下执行命令)r 可读 w 可写 x 可执行。如果此时想查看哪些进程占用CPU较多。如果此时想查看哪些进程占用内存较多。linux文件访问权限命令。

2024-04-10 15:11:59 500

原创 最长回文子串

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。"aba" 同样是符合题意的答案。

2024-04-09 17:06:31 191

原创 redis中的zset与B+树的区别

传统链表上面增加索引,增加一层索引时,结构可以类似于哈希表,当增加多级索引时,查找的时间复杂度大大降低,这就是跳表的底层原理实现.查找过程。

2024-04-09 16:25:53 1200

原创 力扣2- 两数相加

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。

2024-04-08 22:43:30 227

原创 MVCC-多版本并发控制

在数据库系统中,并发控制是一个非常重要的话题。为了提高系统的并发性能和吞吐量,现代数据库系统通常使用多种技术来实现对数据的安全访问,其中一种重要的技术就是多版本并发控制(MVCC)。

2024-04-08 21:37:16 924

原创 省份数量【并查集】

是一组直接或间接相连的城市,组内不含其他没有相连的城市。个城市,其中一些彼此相连,另一些没有相连。表示二者不直接相连。

2024-03-29 11:22:01 167

原创 连同网络的操作次数【并查集】

初始化创建一个数组,让每个数组的节点都指向自己(pre[1]=1;1的位置存储1) 两个计算机相连的,先调用find方法分别寻找当前计算机的祖先,找到后返回,调用merge方法,将两个计算机的祖先相连,同时增加网线数,最后执行判断每个节点的祖先,得到有几组。,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。台计算机连接成一个网络,计算机的编号从。

2024-03-29 11:20:17 257

原创 深入解析Spring MVC: 原理、流程

1.是一个基于MVC的web框架;2.是spring的一个模块,是spring的子容器,子容器可以拿父容器的东西,但是反过来不可;2.SpringMVC的前端控制器是DispatcherServlet,用于分发请求。使开发变得简单;4.SpringMVC流程(重点),三大组件:HandlerMapping:处理器映射器用户请求路径到Controller方法的映射HandlerAdapter:处理器适配器。

2024-03-28 20:05:13 831

原创 Java HashMap与ConcurrentHashMap演进与扩容揭秘

1.8中进行了简化,因为复杂的哈希算法的目的就是提高散列性。i.如果是红黑树Node,则将key和value封装为一个红黑树节点并添加到红黑树中去,在这个过程中会莉断红黑树中是否存在当前key。1.7中链表插入使用的是头插法,1.8中链表插入使用的是尾插法,因为1.8中插入key和value时需要判断链表元素个数。c.如果该位置下的元素个数没有超过6,那么则生成一个链表,并将链表的头节点添加到新数组的对应位置。b.如果该位置下的元素个数超过了6,则生成一个新的红黑树,并将根节点的添加到新数组的对应位置。

2024-03-28 19:59:28 574

原创 面向对象的三个特性

接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。案例:大象会跑,猎豹也会跑,但是大象跑的慢,猎豹跑得快,那我们再次将跑这一动作抽象出来,当我们创建大象和猎豹这两个对象时,分别对他重写run方法。案例:我们创建一个类,类里面有我们定义的信息,但我不想让别人看,就可以对该属性私有化(private),别人只能通过我设置的方法查看属性值。案例:大象会跑,猎豹也会跑,我们可以将跑这一动作抽象出来,当我们创建大象和猎豹这两个对象时,分别对他继承,就不需要类内另写这两个动作了。

2024-03-27 20:25:13 165

原创 Java基础二

在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词:1.continue : 指跳出当前的这一次循环,继续下一次循环2. break : 指跳出整个循环体,继续执行循环下面的语句。return 用于跳出所在方法,结束该方法的运行。return 一般有两种用法1.return;: 直接使用 return 结束方法执行,用于没有返回值函数的方法。

2024-03-27 19:40:59 446

原创 Java基础一

抽象类是使用abstract关键字定义的类,可以包含抽象方法和非抽象方法,可以有实例变量和构造方法;接口通过interface关键字定义,只能包含抽象方法、默认方法和静态方法,不包含实例变量或构造方法。

2024-03-26 20:18:44 1125

原创 128陷阱源码揭秘

让先看两段代码,你觉得答案是什么答案:答案一 答案二有两个问题问题二:为什么Integer a与int a比较时相同?

2024-03-26 17:31:17 265

原创 Gitee你需要了解的操作-代码审查

对于小组项目,代码审查很有必要的,你想你们组员写了一部分程序,不管三七二十一就往git上面推,再一合并,结果其他人一拉一用,发现全都是错!你甭不崩溃,这个时候就需要有人监督,只有这个人允许才可以合并,否则?代码审查的重要性在于能够显著提升代码的质量。在大型公司如Google、微软等,代码审查是基本要求,所有代码在合并到主干之前都必须经过审查。代码审查有助于及时发现潜在问题,减少缺陷,使软件更加健壮和易于维护。一号员工推送到XXX分支,审查员测试该段代码,通过合并到主分支。在这个过程中,主分支是收到保护的。

2024-03-25 21:49:22 201

原创 MyBatis框架解析与优化

MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。1.一级缓存:默认开启SqlSession级别的缓存,实现在同一个会话中数据的共享一级缓存的生命周期和SqlSession一致当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。2.二级缓存:默认不开启,需手动开启。

2024-03-25 20:29:37 1262

原创 Redis学习三--集群部分概念

Redis 集群通过数据分片和主从复制实现了横向扩展和高可用性。它将数据划分为 16384 个哈希槽,并将这些槽均匀地分配到多个节点上。每个节点负责处理一部分槽的数据,实现了数据的分散存储和负载均衡。在集群中,每个哈希槽有一个主节点和多个从节点。主节点负责处理读写请求,而从节点则通过主从复制机制复制主节点的数据,提供数据的冗余备份和故障恢复功能。当主节点发生故障时,集群会自动进行故障转移。它会选举一个从节点升级为新的主节点,保证服务的持续可用性。

2024-03-24 20:34:59 535

原创 了解Spring:Java开发的利器

Spring是一款开源的轻量级Java开发框架,它由多个模块组成,旨在提高开发人员的效率和系统的可维护性。Spring支持控制反转(IoC)和面向切面编程(AOP),可以方便地访问数据库、集成第三方组件,支持单元测试和RESTful Java应用程序的开发。

2024-03-24 20:25:28 827

原创 Springboot测试找不到bean

3.测试类与我们使用的包名不同,两个都是com.travel才可以,否则扫描不到。5.不是很确定,但是也是我犯的错误。service类上需要加注解。6.没有配置好XML文件。2.Test类引用错误。4.引入的启动类错误。

2024-03-22 16:45:58 240

原创 Redis学习二--常见问题及处理

需要注意的是,双删策略可能会在某些情况下导致数据不一致的问题,比如在分布式系统中,如果第二次删除操作失败,可能会导致缓存中的数据和数据库中的数据不一致。指当一个缓存键(key)对应的数据在缓存中不存在,同时又有大量并发请求访问该缓存键时,这些请求会直接绕过缓存,查询数据库或其他存储系统,导致数据库压力增大。这样,即使在更新数据库的过程中,如果有请求查询该数据,也会从数据库中读取最新数据,而不是从缓存中读取过期的旧数据。2. 在缓存层进行空值缓存,即将查询结果为空的数据也缓存一段时间,避免缓存穿透。

2024-03-22 15:02:43 1130

原创 String,Stringbuffer,StringBuilder的区别

由于String是不可变的,每次对String进行操作都会创建一个新的String对象,频繁的字符串拼接会导致大量的对象创建和内存消耗。StringBuffer是可变的,对字符串的修改是在原有对象上进行,不会创建新的对象,因此在频繁的字符串拼接场景下比String更高效。StringBuffer是线程安全的,它的方法使用了synchronized关键字进行同步,保证在多线程环境下的安全性。如果在单线程环境下进行频繁的字符串拼接和修改,推荐使用StringBuilder以获取更好的性能。

2024-03-17 23:09:00 285

原创 线程池学习-了解,自定义线程池

线程池,主要利用池化思想,线程池,字符串常量池等。

2024-03-17 13:47:18 435

原创 写三个线程t1、t2、t3,t1线程只输出A,t2线程只输出B,t3线程只输出C,总体输出顺序控制在ABABCABABCABABCABABCABABCABABCABAC....循环模块“ABABC”

【代码】写三个线程t1、t2、t3,t1线程只输出A,t2线程只输出B,t3线程只输出C,总体输出顺序控制在ABABCABABCABABCABABCABABCABABCABAC....循环模块“ABABC”

2024-03-13 16:51:46 410

原创 application.properties和application.yml文件的区别

写法区别:properties: 直接赋值,无分层,较为直接yml: 通过分层划分类别,spring.redis下的host与password同属于redis下,所以位置相同,配置属性时在 ” : “后需要一个空格,否则配置文件不生效, 优先级区别:当两个配置,在这两个配置文件当中都存在时,application.properties优先级更高外置配置文件的优先级:外置config文件夹里面的配置文件>外置配置文件的优先级>内置的application.properties>内置的appl

2024-03-13 16:46:52 373

无符号的四位乘法器,实验课作业

包含电路图,波形文件等,适用4*4无符号进位乘法器,计算机组成原理实验内容,包含全部文件,解压后用软件打开运行即可

2023-12-13

空空如也

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

TA关注的人

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