自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 「中高级试题」:MVCC实现原理是什么?

具体流程如下:先拿该行记录的事务ID(4)去跟Read View中的up_limit_id相比较,判断是否小于,通过对比发现不小于,所以不符合条件,继续判断4是否大于等于low_limit_id,通过比较发现也不大于,所以不符合条件,判断事务4是否处理trx_list列表中,发现不再次列表中,那么符合可见性条件,所以事务4修改后提交的最新结果对事务2 的快照是可见的,因此,事务2读取到的最新数据记录是事务4所提交的版本,而事务4提交的版本也是全局角度的最新版本。事务提交后,释放锁。

2025-07-22 20:58:06 1017

原创 深入理解Redis 数据结构—字典

字典是一种映射的键值对数据结构,其中键是唯一的,通过唯一的键可以快速找到对应的值。字典包含广泛用在Redis数据库中。其中所有数据类型的键值对都使用字典作为底层实现。Hash类型的键值对也是基于字典实现。字典的结构包含一个字典,包含根据特定类型处理的函数dictType、两个哈希表ht[2],字典只用到了ht[0],遇到了扩容才会使用ht[1]。一个字典包含两个哈希表,每个哈希表dictht包含一个table数组,size记录数组的大小,sizemask等于size-1。

2025-07-22 20:49:52 711

原创 详解MySQL隔离级别

读未提交(read uncommitted)一个事务还没提交时,它修改的数据都可以被别的事物看到。读已提交(read committed)一个事务提交之后,它修改的数据才会被别的事物看到。可重复读(repeatable read)一个事务执行过程中看到的数据,总是和这个事务开启时看到的数据是一致的。在可重复读的隔离级别下,未提交的事务对其他事务也是不可见的。串行化(serializable)数据的读和写都会加锁读会加读锁写会加写锁。

2025-07-22 20:48:11 583

原创 可见性、有序性和原子性问题

操作系统进入多核、多进程、多线程时代,这些升级会很大的提高程序的执行效率,但同时也会引发可见性原子性有序性问题。多核CPU,每个CPU都有各自的CPU缓存,每个线程更新变量会先同步在CPU缓存中,而此时其他线程,无法获取最新的CPU缓存值,这就是不可见性。count += 1含有多个CPU指令。当发生线程切换,会导致原子问题。编译优化器会调整程序的执行顺序,导致在多线程环境,线程切换带来有序的问题。开始学习并发,经常会看到volatile。

2025-07-22 20:46:25 695

原创 Java反编译工具

而我们平时经常用的语言C、Java、Python属于高级语言,这些语言程序员能看的懂。有了反编译,我们就可以看懂Java编译器生成的字节码,比如Synchronized的实现原理(监听器monitor)、枚举、语法糖、泛型,这些都需要用到反编译工具。简单的总结为:高级语言就是程序员认识的语言,而低级语言是机器认识的语言。idea是绝大多数Java程序员使用的编辑器,使用idea打开文件比较方便、快捷。javap是jdk自带的反编译命令,可以对代码进行反编译,但是反编译的并不是java文件。

2025-07-22 20:43:52 310

原创 SQL Server 内存占用高分析及解决办法

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。SQL Server对服务器内存的使用策略是。

2025-07-22 20:34:46 1079

原创 “基础-中级-高级”Java程序员面试集结

Java高级“程序猿”面试部分(题目已经用红框标出来),我总共分8个部分,有高并发、Redis缓存、分布式、消息队列、高可用、微服务、分库分表、读写分离等,而且每部分的每个题目都有做相应的面试官心理分析以及面试题目剖析,能让我们在面试的时候清楚的了解到此时题目的重点是在哪里,从何下手攻克!Java中级开发,以上列举的题目就大概这么些,答案我整理成PDF有40多页,篇幅原因不好全部附上答案,截取一部分答案展示一下,更多完整的答案,不论是基础部分的还是中级、高级都可找小编免费下载,私信我 “答案” 即可!

2025-07-22 20:29:16 271

原创 MySQL 索引底层原理,解锁数据库优化的关键密码(下)

但之前都是基于单值索引,由于文章篇幅原因也只是在文末略提了一下联合索引,并没有大篇幅的展开讨论,所以这篇文章就单独去讲一下联合索引在B+树上的存储结构。本文主要讲解的内容有:• 联合索引在B+树上的存储结构• 联合索引的查找方式• 为什么会有最左前缀匹配原则?• 实战在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多博客和技术文章,其中有几篇讲述的与事实相悖。

2025-07-22 20:16:23 842

原创 MySQL 索引底层原理,数据库优化的关键密码(中)

我们可以看一下 B-Tree 的叶子节点之间是没有指针的,B+Tree 优化后增加了叶子节点之间的指针,如果我们遍历数据,从当前节点遍历完之后,就可以根据节点间的指针快速找到下一个节点去遍历。讲到这,穿插一下 B+Tree 为什么要比 B-Tree 多一个节点间指针呢?那就讲一下索引的另一种数据结构就是。

2025-07-22 20:06:08 975

原创 MySQL索引底层原理,数据库优化的关键密码(上)

到这里做个总结吧!这篇文章主要讨论了MySQL索引的底层原理和优化方法。索引的定义索引是一种用于快速查找数据的数据结构,类似于字典的目录,帮助MySQL高效获取数据。索引的好处通过索引可以大大减少数据查找的遍历次数,从而提高查询效率。例如,在一个百万级甚至千万级的表中,使用索引可以将查询时间从几秒甚至几十秒减少到几毫秒。索引的底层数据结构文章详细介绍了索引底层可能使用的数据结构,包括二叉树、红黑树、HASH 和 B-Tree,并解释了为什么 MySQL 最终选择了 B+Tree 作为索引的数据结构。

2025-07-22 19:41:25 589

原创 为什么mysql使用B+树作为索引的数据结构?

如果想要在哈希表中存放数据,首先用对这个数据进行散列算法(基本的就是取模运算),假如数组长度是13 ,进行模13之后是0-12,正好对应的数据的下标,如果计算出的下标一样的,就会在下标位置跟上链表。如上图: 在B+树上有两个头指针,一个指向根节点,另一个指向关键字的最小叶子节点,而且所有叶子节点(及数据节点)之间是一种链式环结构,因此可以对B+树进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始的随机查找。最长子树的不能超过最短子树的2倍,通过变色和旋转,在插入和查询上做了平衡。

2025-07-21 20:34:13 1257

原创 java--对象的输入输出流、字节流、序列化与反序列化

是用于写对象的信息与读取对象的信息。对象信息一旦写到文件上那么对象的信息就可以做到持久化了。打印流可以打印任意类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印。Properties(配置文件类): 主要用于生产配置文件与读取配置文件的信息。输入字节流的转换流:InputStreamReader 是字节流通向字符流的桥。注意: 以后编码与解码一般我们都使用统一的码表。编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码。解码: 把码值查找对应的字符,我们把这个过程称作为解码。

2025-07-21 20:26:19 136

原创 java--单元测试、内省

一个文件的完整路径信息。一般绝对路径是包含有盘符 的。绝对路径的缺陷: 因为绝对路径是有盘符开头的,有些系统是没有盘符的。相对路径是相对于当前程序的路径。当前路径就是执行java命令的时候,控制台所在的路径。BeanUtils主要解决 的问题: 把对象的属性数据封装 到对象中。类文件路径就是使用了classpath的路径找对应的资源文件。如果需要使用到类文件路径首先先要获取到一个Class对象。内省主要解决 的问题: 把对象的属性数据封装 到对象中。

2025-07-21 20:24:50 192

原创 java--http协议

可以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html), 可以是互联网。Connection: close/Keep-Alive –表示服务器和浏览器的连接状态。If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT –浏览器最后的缓存时间。Host: www.it315.org:80 –(必须的)当前请求访问的目标地址(主机:端口)Accept: text/html,image/* – 浏览器接受的数据类型。

2025-07-21 20:23:38 659

原创 JVM之运行时数据区和内存溢出异常(二)

从执行引擎来看:当前线程只有处于栈顶的栈帧才是当前栈帧,此栈帧对应的方法为当前方法,执行引擎所运行的字节码指令只针对当前栈帧也就是执行引擎执行的字节码指令只针对栈顶栈帧(方法)每个局部变量槽都可以存放byte,short,int,float,boolean,reference,returnAddress。每个栈帧中包括: 局部变量表,操作数栈,栈帧信息(返回地址,动态连接,附加信息)"栈"通常情况指的就是JVM栈,更多情况下 "栈"指的是JVM栈中的局部变量表。

2025-07-21 20:12:31 257

原创 JVM之Hotspot虚拟机中的对象(一)

在堆中开辟一块内存作为句柄池,栈中的reference数据存储的是该对象句柄池的地址,句柄中包含了对象实例数据和对象类型数据 - 优点: 稳定,对象被移动时(压缩或复制算法),只需要改动该句柄的对象实例数据指针 - 缺点: 多一次间接访问的开销。为了优化减少GC,当对象不会发生逃逸(作用域只在方法中,不会被外界调用)且栈内存足够时,直接在栈上为对象分配内存,当线程结束后,栈空间被回收,(局部变量也被回收)就不用进行垃圾回收了。对象哈希码,对象GC分代年龄)存放在对象头中 (后面详细说明对象头)

2025-07-21 20:08:41 698

原创 java--Hibernate查询、连接池、二级缓存

Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!3) HQL查询, Hibernate Query language hibernate 提供的面向对象的查询语言。4) Criteria 查询, 完全面向对象的查询(Query By Criteria ,QBC)使用场景: 对于复杂sql,hql实现不了的情况,可以使用本地sql查询。Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持!使用查询缓存,可以让list()查询从二级缓存中取!先查询总记录数,再分页查询。

2025-07-21 19:59:35 330

原创 hibernate 程序执行流程

在一对多与多对一的关联关系中,保存数据最好的通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!配置一对多与多对一,这种叫“双向关联”只配置一对多, 叫“单项一对多”只配置多对一, 叫“单项多对一”注意:配置了哪一方,哪一方才有维护关联关系的权限!

2025-07-21 19:58:23 280

原创 java-Spring事务管理及SH整合

编程式事务控制自己手动控制事务,就叫做编程式事务控制。Jdbc代码:// 设置手动控制事务Hibernate代码:// 开启一个事务【细粒度的事务控制: 可以对指定的方法、指定的方法的某几行添加事务控制】(比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚.)声明式事务控制Spring提供了对事务的管理, 这个就叫声明式事务管理。Spring提供了对事务控制的实现。用户如果想用Spring的声明式事务管理,只需要在配置文件中配置即可;不想使用时直接移除配置。

2025-07-21 19:41:38 206

原创 mysql加强

当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成!作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。级联修改: ON UPDATE CASCADE。级联删除: ON DELETE CASCADE。设计原则: 建议设计的表尽量遵守三大范式。1)对默认值字段插入null是可以的。2)对默认值字段可以插入非null。2)唯一字段可以插入多个null。1)唯一字段可以插入null。2)非空字符不能赋null。作用: 对字段的值不能重复。作用: 限制字段必须赋值。1)非空字符必须赋值。

2025-07-21 19:32:22 309

原创 MySQL 17 如何正确地显示随机消息?

假设有一个场景,一个英语学习APP首页有一个随机显示单词的功能,用户每次访问首页的时候,都会随机滚动显示三个单词。已知表里有10000条记录,来看看随机选择3个单词有什么方法,又存在什么问题。

2025-07-20 19:38:52 735

原创 Spring Boot RestController接口如何输出到终端

使用类,可以在使用 curl 执行 Spring Boot REST接口的同时,在控制台输出一些信息,给运维人员知道当前命令执行的状态。

2025-07-20 19:36:33 273

原创 MyBatis踩坑之单字符条件比较

假设有如下需求:用户分为个人账户和机构账户两类,其中个人账户使用身份证注册,机构用户使用机构统一社会信用代码注册,某个功能需要提供根据用户类型(个人/机构)以及对应的证件号码查询用户信息。属性用于设置比较条件,但是在某些特定情况下,字符串的比较会存在一个坑,那就是单字符字符串会被降级为字符类型(char),从而导致比较条件不会生效。中条件语句等号右边的字符串改为整数,二是把条件语句等号右边的字符串加上。Mybatis中可以使用。检查SQL语句调用,发现。解决方案有两种,一是把。语句来实现条件选择,

2025-07-20 19:35:01 215

原创 SpringBoot缩小测试范围、提高测试效率

如果需要指定需要测试的 Bean 及其依赖,而不是加载完整的上下文环境,可以在注解的classes参数中配置需要测试及依赖的类或对象。如果遇到不是项目中自己写的或者可以自动生成的实现类,可以通过配置的方式,在测试配置中注册相关的 Bean。最终做到缩小测试范围,提高测试运行效率。

2025-07-20 19:33:09 733

原创 Spring Boot + Lua = 王炸!

Lua脚本允许你在Redis中执行更复杂的操作,而无需进行多次的网络通信,从而提高性能和可伸缩性,同时确保数据的一致性和原子性。通过适当的错误处理和安全措施,你可以确保Lua脚本在与Redis交互时不会引入潜在的问题,并提高应用程序的稳定性和安全性。Lua脚本的执行是原子的,这意味着在Lua脚本执行期间,没有其他客户端可以插入其他操作。通过遵循这些最佳实践和建议,你可以更安全、高效地使用Lua脚本来实现Redis功能,并确保你的Spring Boot项目与Redis的交互是可靠和可维护的。

2025-07-20 19:24:19 739

原创 SpringBoot 快速实现 api 加密!

所以在实际应用中,要根据情况使用,也可以同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。A传递自己的公钥给B,B用A的公钥对消息进行加密。

2025-07-20 19:23:47 641

原创 Jvisualvm连接远程应用(一:jstatd方式)

连接远程java应用除了jstatd方式,还有jmx方式。不必拘泥于一种,一种不行可以果断尝试另一种,兴许就行了。两天前,我像大家一样,在网络上搜索jvisualvm连接remote 应用的方法,然而,不知道为啥,我的开发机器的visualvm真就连不上远程主机上的应用。试了同事电脑,试了改端口,试了wireshark抓包,(主要是看连接建立了没,我这边的现象是:地址应该没问题,不是网上很多博客说的hostname的问题,在本机向远程机器上的jstatd。

2025-07-20 19:18:11 949

原创 项目中常用到的JavaScript/JQuery代码

当然,由于我主要是写后端java开发,而前端这几年风起云涌,发展很快,新的技术框架层出不穷,我也就没把心思放这块,目前公司只有前端,没有交互开发工程师,所以我们只能硬顶。$('.searchTableDiv table')不能是动态生成的,on函数的第二个参数,表示查找子元素。4、前端搜索:根据主账户查询到其管理的多个子账户后,输入框中根据输入的关键字对子账户过滤。9、字符串比较直接用==

2025-07-20 19:00:04 390

原创 常用Redis最多的10种场景

但使用缓存加速的业务场景,需要注意一下,可能会出现:缓存击穿、穿透和雪崩等问题,感兴趣的小伙伴,可以看看我的另一篇文章《烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?分布式锁可能是使用Redis最常见的场景之一,相对于其他的分布式锁,比如:数据库分布式锁或者Zookeeper分布式锁,基于Redis的分布式锁,有更好的性能,被广泛使用于实际工作中。因此,可以考虑用一个定时任务,异步将分类树的数据,直接缓存到Redis当中,定义一个key,比如:MALL_CATEGORY_TREE。

2025-07-20 18:39:46 553

原创 Redis:五种数据类型及应用场景解析

首先Redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:"123" "456"这样的字符串。

2025-07-20 18:09:11 532

原创 java集合之LinkedHashMap源码分析

LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现LRU缓存策略。LinkedHashMap可以看成是 LinkedList + HashMap。(1)LinkedHashMap继承自HashMap,具有HashMap的所有特性;(2)LinkedHashMap内部维护了一个双向链表存储所有的元素;(3)如果accessOrder为false,则可以按插入元素的顺序遍历元素;

2025-07-18 15:17:00 588

原创 java集合之ArrayList源码分析

ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组。

2025-07-18 15:11:47 742

原创 java集合之HashMap源码分析

HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;(1)HashMap是一种散列表,采用(数组 + 链表 + 红黑树)的存储结构;(2)HashMap的默认初始容量为16(1<<4),默认装载因子为0.75f,容量总是2的n次方;(3)HashMap扩容时每次容量变为原来的两倍;(4)当桶的数量小于64时不会进行树化,只会扩容;

2025-07-18 15:03:27 621

原创 MySQL事务隔离级别和MVCC

从上边的描述中我们可以看出来,所谓的MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写写-读操作并发执行,从而提升系统性能。这两个隔离级别的一个很大不同就是生成ReadView的时机不同,在每一次进行普通SELECT操作前都会生成一个ReadView,而只在第一次进行普通SELECT操作前生成一个ReadView,之后的查询操作都重复这个。

2025-07-18 14:37:28 652

原创 mysql 中的存储过程和自定义函数

set @x=2;结果调用存储过程调用用户变量beginset @x=1;set @x=2;结果:调用存储过程调用用户变量使用光标在存储过程中可以使用光标对结果集进行循环处理。SET @x2=0;#查看结果test1表结构及数据test1表数据结果查询结果使用流程控制。

2025-07-18 14:29:11 610

原创 分布式锁实现的套路

对于锁大家肯定不会陌生,在Java中synchronized关键字和ReentrantLock可重入锁在我们的代码中是经常见的,一般我们用其在多线程环境中控制对资源的并发访问,但是随着分布式的快速发展,本地的加锁往往不能满足我们的需要,在我们的分布式环境中上面加锁的方法就会失去作用。于是人们为了在分布式环境中也能实现本地锁的效果,也是纷纷各出其招,今天让我们来聊一聊一般分布式锁实现的套路。

2025-07-18 14:21:07 664

原创 高性能数据库集群分库分表

读写分离分散数据库读写操作压力,分库分表分散存储压力 增加表操作的次数 类似读写分离,具体实现也是“程序代码封装”和“中间件封装”,但具体实现复杂一些,因为还有要判断SQL中具体操作的表,具体操作(例如count、order by、group by等),根据具体操作做不同的处理。作者:贝聊科技链接:https://juejin.cn/post/6844903630613676040来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2025-07-18 14:17:34 392

原创 关于HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。

2025-07-18 14:15:13 712

原创 MySQL 深分页如何进行性能优化?

在日常业务开发中,分页查询是非常常见的需求。例如在管理后台系统中,展示订单列表、用户列表、日志记录等都需要分页加载。上述查询语句的含义是:跳过 100000 条记录,取第 100001 到 100020 条数据。这种分页方式我们称为“深分页”。分页方式优点缺点简单通用深分页性能差游标分页(Keyset)性能优秀,避免跳过大量数据不支持跳页,只支持顺序加载建议:在数据量大、分页页码深的业务场景中,优先使用游标分页,尤其是管理后台、数据分析系统、接口服务等。

2025-07-18 13:59:04 494

原创 pring Boot监控方案

告警准确率100%的秘诀不是神话,是动态策略+证据链+预测防御。别再埋头抄官网配置了!最后送你句话:“监控系统的终极目标,是让运维能在凌晨三点安心睡觉。附:传统方案 vs 本方案对比表指标传统Prometheus配置本方案部署时间3人天1人天(Spring Boot自动化)误报率30%~50%<5%根因定位手动查链路过1小时自动定位<30秒。

2025-07-18 13:50:33 770

空空如也

空空如也

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

TA关注的人

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