自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 concurrenthashmap的实现

我们知道hashmap本身是线程不安全的,可以使用concurrenthashmap来实现线程安全。

2024-09-03 23:00:15 173

原创 垃圾收集器

虚拟机后面不会用到的东西就是垃圾。那虚拟机怎么判断后面会不会用到呢?这里就涉及到虚拟机的两个垃圾分代假说:假说1:弱分代假说:大多数对象是朝生夕灭的,即新生代的对象有99%是活不过第一轮收集的假说2:强分代假说:越熬过多次垃圾收集过程的对象,越不容易被收集。

2024-09-01 12:16:31 692

原创 FULL GC的发生时刻

full gc是针对整个java堆和方法区进行的垃圾回收,那么什么时候会触发full gc呢。对象什么时候从年轻代晋升为老年代呢?

2024-08-31 16:38:06 277

原创 幻读,不可重复读及MVCC控制

在事务id为100的数据来读取某一版记录(readview)时,readview会记录下当前readview的一些参数(m_ids:生成readview时活跃的事务id;看自己id是不是在m_ids内部,在,就说明该readview生成时,自己还没有提交,说明这个readview是不包含自己事务修改的,自然不能访问,不在的话就说明自己已经提交了,可以访问。解决幻读和可重复读的关键在于,要确定在读取的数据中,被读取的数据行中,哪个版本是能被当前事务所读取的,哪个版本不能被当前事务所读取的。

2024-08-30 23:26:54 298

原创 sql语句的慢查询优化

对于慢查询语句,我们可以用日志中的sql query log来进行定位,接下来来说说如何去优化这个慢查询语句,一般而言我们可以从两个部分来进行优化:1 优化索引2 语义优化用explain关键字可以查看语句的执行计划,重点关注里面的key(使用索引),select_type(关联查询方式),rows(查询数据量),type(查询方式,这个是最重要的)

2024-08-30 22:48:19 210

原创 一条sql语句是怎么执行的

这里还有一点,buffer pool使用的是不完全的lru算法,buffer pool实际上是分为young区和old区的,即当我们从磁盘取数据页时,这个数据页会放在old区的末尾,只有再次被访问时,才会放到young区被当作热点页,这是为了防止某些全盘扫描导致的大量数据页污染buffer pool。其次,从索引中我们可以知道自己具体要去取哪些数据页,那么我们首先会去缓冲区(buffer pool)中看有没有我们需要的数据页,有就会取出来,没有就去磁盘里读取并存到buffer pool中。

2024-08-30 22:21:04 236

原创 内存分页和分段

无论是分段还是分页,都是为了更好的对内存进行管理才出现的。

2024-08-24 22:48:06 207

原创 TCP为什么是三次握手而不能两次握手?

3 防止旧连接(主要原因),客户端如果在短时间内发送了两次SYN请求,但是实际上只希望开一个tcp连接,那么就可以通过第三次握手的序列号来明确自己要开启的是哪个连接(对第二次握手响应),而又需要废弃掉哪个连接(不对第二次握手响应)2 同步序列号,一个SYN-ACK负责同步一次序列号,第一次握手和第二次握手能够使服务端同步客户端,第二次握手和第三次握手能够使客户端同步服务端。

2024-08-24 15:55:08 434

原创 一个数据包是如何从发送端送至接收端

首先明确什么是数据包在http2.0之后 ,一个完整请求所对应的所有数据叫做数据流,但是在实际发送过程中,一个数据流可能会比较大,无法一次性发送完,因此会将一个数据流分成多个数据包发送。数据包从开始发送到发送结束要经过什么呢?总的来说可以分为以下几个阶段。

2024-08-10 18:52:54 698

原创 http1.0/http1.1/http2.0/http3.0的进化

这篇文章是梳理下自己的思路,不完整,如果有问题还希望大伙指出来。

2024-07-31 22:49:42 156

原创 HTTPS的安全协议-SSL/TLS

1 接受被公钥加密的第三个随机数 用私钥解密 并且加上密码套件进行加密生产会话密钥2 加密算法开始通知的发送 表明后续开始加密通信了3 服务端握手结束 同时把上面做的请求与回应做个摘要 发送给客户端检验值得一提的是数字证书这块:数字证书是由第三方机构CA(数字证书认证机构),服务器将自己的公钥在CA注册,CA会用自己的私钥给公钥进行数字签名并且颁发数字证书。而客户端拿到数字证书之后,使用事先置入在浏览器or操作系统的CA的公钥来确认数字证书的真实性并且取出公钥,用于对第三个随机数加密。

2024-07-31 22:12:28 348

原创 mysql对order by 的实现

首先,根据解释查询计划,在mysql里对order by的排序可以大致分为两种(explain的extra字段标明),一种是using index,一种是using filesort。

2024-04-01 19:32:07 208

原创 InnoDB引擎的查询过程

在mysql种。一条查询语句的流程如下首先判断是否击中查询缓存,是:走查询缓存对应数据;否:走b+树,看数据页的位置;判断数据页是否在buffer pool中:是:返回数据页数据;否:去数据库磁盘查找数据;查找完数据:LRU算法。

2024-03-31 15:40:45 630 1

原创 进程,线程,协程

进程是系统进行资源分配和调度的一个独立单位,是系统运行程序的基本单位,由于进程之间的创建切换销毁开销都比较大,因此人们创建了一种轻量级的进程,即线程,线程被设计为进程的一个执行路径,线程是CPU调度的基本单位,同一进程内的线程会共享进程的堆和方法区资源,因此在线程切换的成本上要远低于进程。可以将线程成为轻量级的进程。线程共享进程的堆和方法区,但是实际上也有自己的私有资源,即程序计数器,虚拟机栈和本地方法栈。程序计数器主要是用来记录现在读到哪个指令了,方便自身的运行以及线程切换。

2024-03-27 22:02:49 223

原创 spring三级缓存以及为什么不用二级缓存

因此采用三级缓存,在这个过程中如果B需要A注入,而A存在代理的话,那么就会生成一个早期的代理对象给B,用于解决循环依赖,而最终的代理对象还是要在beanA完成了属性填充和初始化后再继续进行,这两个生成的代理对象是存在区别的,因此也不算真正破坏到Spring代理在Bean初始化完成后的原则,因为Spring仍然确保了最终的代理对象是在Bean完全初始化后才生成的。3:B的初始化完成了,A继续属性赋值,顺利从⼀级缓存拿到实例化且初始化完成的B对象,A对象创建也完成,删除⼆级缓存中的A,同时把A放⼊⼀级缓存。

2024-03-27 15:31:47 1237

原创 反射的优点和缺点

反射的本质是JVM得到了class对象之后,对class对象进行反编译从而获取到对象的各类信息,当然,这里的反编译并不是真的反编译,因为class对象本身就包含了所有的类信息,不需要反编译,这里是指运行时,通过class对象去动态地获取类相关地信息。反射犹豫需要动态加载类,获取类的各类信息,安全检查等额外开销,并且相对于直接调用中编译器做了很多的优化,反射是没有的,因此导致反射的性能不如直接调用。2、反射的代码可读性下降。我们在运行的时候不必明确指定具体的类,可以让我们在程序运行时再确定,比如动态代理。

2024-03-25 22:22:59 646 1

原创 为什么重写equals就要重写hashcode

但是由于A和B的hashcode计算方式不同(我们没有重写hashcode),那么hashset在计算B的hashcode来放置B时,会发现位置是空的(因此我们向例如hashset这种结构里面存入了A,而A.equals(B)==true的时候,我们希望向hashset里面存入的B是会重复的。这是因为我们在用hash结构去存储数据的时候,是用hashcode去计算这个数据的位置,而不是数据本身的值。),会将B也放进去,导致一个hashset里面出现两个数值重复的值。

2024-03-25 19:22:36 250 1

原创 redis的底层数据结构

redis性能高的原因很大程度上是由于它的每一种数据结构都经过专门设计来应对不同场景,redis的数据结构本质上可以分为两层,对外暴露的数据结构以及内部底层的数据结构。

2024-03-25 17:18:14 1480 2

空空如也

空空如也

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

TA关注的人

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