- 博客(53)
- 收藏
- 关注
原创 commit 信息风格迥异、难以阅读,如何规范?
大家好!最近很长时间没有更新了,由于加入新团队新的项目组参与新的工作,导致博客创造搁置了一段时间,今天来记录一下我最近在项目开发过程中学习到的规范。
2024-04-13 13:59:54
416
原创 HashMap源码阅读解惑
当然我们知道目的是为了让h的低16位更有散列性,但为什么是异或运算就更有散列性呢?而不是与运算或者或运算呢?这里我自己证明一下为什么异或就能够得到更好散列性。先来看一下下面的这组运算【与运算 1&0=0, 0&0=0, 0&1=0 都等于0 1&1=1 3次0,1次1】【或运算 1&0=1, 1&1=1, 0&1=1 都等于1 0&0=0 3次1,1次0】【异或运算 0&0=0, 1&1=0,而另外0&1=1, 1&0=1 2次1,2次0】
2023-09-06 17:47:28
158
原创 总结Spring是如何解决循环依赖的
答:Spring通过三级缓存解决了循环依赖,其中一级缓存为单例池(),二级缓存为早期曝光对象,三级缓存为早期曝光对象工厂(当A、B两个类发生循环引用时,在A完成实例化后,就使用实例化后的对象去创建一个对象工厂,并添加到三级缓存中,如果A被AOP代理,那么通过这个工厂获取到的就是A代理后的对象,如果A没有被AOP代理,那么这个工厂获取到的就是A实例化的对象。
2023-05-25 17:07:22
937
原创 如何理解MVCC
MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。通俗的讲,数据库中同时存在多个版本的数据,并不是整个数据库的多个版本,而是某一条记录的多个版本同时存在,在某个事务对其进行操作的时候,需要查看这一条记录的隐藏列事务版本id,比对事务id并根据事物隔离级别去判断读取哪个版本的数据。数据库隔离级别读已提交、可重复读。
2023-05-24 10:41:02
493
原创 Filter和Interceptor和Aspect
还有一点需要注意的是,filter中是没法使用注入的bean的,也就是无法使用@Autowired。这个方法执行,就是执行的拦截器的preHandler方法,但这个过程中,controller方法没有从request中获取请求参数,组装方法参数;,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,,就是在一个方法前,调用一个方法,或者在方法后,调用一个方法。,先初始化listener,然后再来就filter的初始化,,获取我们想要获取的数据,比如:在过滤器中修改字符编码;
2023-05-18 09:29:55
356
原创 Redis两个缓冲区
Redis 是一种基于内存的键值存储数据库,它采用异步复制(Asynchronous Replication)来实现数据的主从备份和数据的高可用性,主要通过两个缓冲区来实现复制功能,即 Replication Buffer 和 Repl Backlog Buffer。Replication Buffer 是 Redis 主服务器中的一个缓冲区,主要用于保存写命令请求,它以固定大小的循环数组的形式存储,当数组被写满之后,新写入的元素会从数组头部覆盖老数据。
2023-05-15 18:03:39
795
原创 Redis主从复制是怎么实现的
全量复制、基于长连接的命令传播、增量复制。主从服务器第一次同步的时候,就是采用全量复制,此时主服务器会两个耗时的地方,分别是生成 RDB 文件和传输 RDB 文件。为了避免过多的从服务器和主服务器进行全量复制,可以把一部分从服务器升级为「经理角色」,让它也有自己的从服务器,通过这样可以分摊主服务器的压力。第一次同步完成后,主从服务器都会维护着一个长连接,主服务器在接收到写操作命令后,就会通过这个连接将写命令传播给从服务器,来保证主从服务器的数据一致性。
2023-05-14 22:15:13
308
原创 Springmvc拦截器知识总结
每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion和postHandle方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。SpringMVC中的。
2023-05-08 13:55:20
349
原创 Java--io流知识总结
Java 程序通过流来完成输入/输出,所有的输入/输出以流的形式处理。因此要了解 I/O 系统,首先要理解输入/输出流的概念。输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中,输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备。数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。按照流的方向主要分为输入流和输出流两大类。
2023-05-08 09:47:37
655
原创 策略模式--心得
策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法定义了一组算法(业务规则)封装了每个算法这族的算法可互换代替。
2023-05-06 17:26:53
51
原创 Java对象的四种引用方式
弱引用:弱引用和软引用很像,但弱引用的引用级别更低。当然,并不是说当一个对象只有弱引用时,它就会立即被回收,正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列联合使用。强引用:这是Java程序中最常见的引用方式,即程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象。当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。
2023-05-06 15:05:37
194
原创 数据库设计-范式
范式就是数据库的构建规则,目前有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
2023-05-06 09:36:52
486
原创 原型模式--深拷贝和浅拷贝
Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. (使用原型实例指定将要创建的对象类型,通过复制这个实例创建新的对象。从定义中我们我们可以发现,该模式的前提是首先需要有一个对象,然后基于已有的对象复制生成新的对象,新生成的对象状态和原对象是一样的,不一样的是内存地址。
2023-05-04 18:00:25
1051
原创 分布式事务 XA 模式的理解
seata 中 XA 模式的实现是使用数据源代理完成的,底层使用了数据库对 XA 协议的原生支持。mysql 的 java 驱动库中,MysqlXAConnection 类封装类 XA 协议的底层接口供外部调用。跟 TCC 和 SAGA 模式需要在业务代码中实现 prepare/commit/rollback 逻辑相比,XA 模式对业务代码无侵入。
2023-04-24 11:00:18
144
原创 实习过程常用linux命令汇总
如果遇到某个文件夹过大,需要将压缩文件跟个成 N 个指定大小的文件,便于邮件等方式传输,可以使用下边的方法。然后使用 split 指令进行切分。也可以合成一步进行操作。多个压缩文件解压方法如下。首先先压缩成一个大文件。
2023-03-30 11:11:45
60
原创 目前自己常用linux系统的命令
netstst -ntlp 查看占用端口。yum(Ubuntu apt)安装软件。ps -ef|grep 筛选相应进程。git github拉取项目代码。ifconfig 网络设备信息。ls 查看当前目录下的文件。-version 查看版本。uname 查看系统版本。which 查看文件目录。tar -zxvf 解压。rm -rf /* 跑路。ssh 连接远程服务器。df -lh 磁盘空间。du 查看当前占用空间。nohup &后台启动。ps -ef是否有进程。tail -n查看行数。
2023-02-16 15:55:16
69
原创 Spring技术知识总结
Before(前置通知):目标对象的方法调用之前触发After(后置通知):目标对象的方法调用之后触发(返回通知):目标对象的方法调用完成,在返回结果值之后触发(异常通知) :目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。Around(环绕通知):编程式控制目标对象的方法调用。
2023-02-09 12:30:21
235
原创 Redis知识总结
什么是NosqlNoSQL = Not Only SQL(不仅仅是SQL)关系型数据库:列+行,同一个表下数据的结构是一样的。非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。NoSQL泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区,暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的。Nosql特点方便扩展(数据之间没有关系,很好扩展!
2023-02-08 12:27:30
77
原创 JavaSE基础知识总结(一)
自己对于java的特点和优点的理解总结1、它是一门面向对象的编程语言,它吸收了C++语言各种优点的同时去除了C++语言中令人难以理解的多继承、指针等概念。java语言极好地实现了面向对象的理论,是静态面向对象编程语言的代表。2、它可以做到“一次编译 到处运行“,具有平台独立性。跨平台的是java程序而不是JVM,所以需要在不同平台下安装不同版本的JVM。实质上利用了不同系统上都有自己的一套JVM来将Class字节码 文件编译成当前系统所能识别出来的机器语言。
2023-01-29 17:05:08
87
原创 MYSQL幻读的解决方案
第二个例子:对于当前读,如果事务开启后,并没有执行当前读,而是先快照读,然后这期间如果其他事务插入了一条记录,那么事务后续使用当前读进行查询的时候,就会发现两次查询的记录条目就不一样了,所以就发生幻读。我认为快照读就是通过由 MVCC(多版本并发控制)实现的,实现的方式是开始事务后(执行 begin 语句后),在执行第一个查询语句后,会创建一个 Read View,T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 4 条行记录,也是发生了幻读的问题。快照读是如何避免幻读的?
2023-01-27 23:04:39
248
原创 MYSQL事务知识总结笔记
假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取我的余额数据,然后再执行更新操作,如果此时事务 A 还没有提交事务,而此时正好事务 B 也从数据库中读取我的余额数据,那么事务 B 读取到的余额数据是刚才事务 A 更新后的数据,即使没有提交事务。:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样,就好比买一件商品,购买成功时,则给商家付了钱,商品到手;
2023-01-25 17:39:03
96
原创 执行一条 SQL 查询语句,期间发生了什么?
我们常说的索引数据结构,就是由存储引擎层实现的,不同的存储引擎支持的索引类型也不相同,比如 InnoDB 支持索引类型是 B+树 ,且是默认使用,也就是说在数据表中创建的主键索引和二级索引默认使用的是 B+ 树索引。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;
2023-01-22 18:06:23
68
原创 HTTP 与 HTTPS 有哪些区别?
证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。可见,只要自身不做「恶」,SSL/TLS 协议是能保证通信是安全的。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了。HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾广告。,比如通信链路上可以获取通信内容,用户号容易没。,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。,比如冒充淘宝网站,用户钱容易没。
2023-01-05 12:02:51
63
原创 键入网址到网页显示,期间发生了什么?
上下关系是有一定的规则的,上面的部分 会向下面的部分委托工作,下面的部分收到委托的工作并执行。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网 络包发送给对方的操作就是由 IP 负责的。
2023-01-04 18:20:50
67
原创 Springboot解决前后端跨域问题
当前端请求的端口和后端接受请求的端口不一致时会出现如上报错,具体解决方案有两种,一种是当你前端使用VUE时可以用vue的路由来设置,这里不做介绍。具体Springboot如何解决这个问题可以看如下操作。第一步新建一个config文件,然后写一个corsconfig类,具体名字可以自定。然后在这个类中写入如下代码。
2022-12-27 21:39:11
262
原创 Git使用教程
为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。或许你还记得起步的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的快照。在进行提交操作时,Git 会保存一个提交对象(commit object)。知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。
2022-12-24 12:47:43
155
原创 项目排坑---Spring security to execute script from ‘http://localhost:8080/login.html‘
这两天复习自己的项目发现了一个bug,重置密码里有个刷新验证码的功能突然刷新不了了,按F12调试发现出现Refused to execute script from ‘http://localhost:8080/login.html’ because its MIME type (‘text/html’) is not executable, and strict MIME type checking is enabled.login.html。
2022-12-20 23:22:06
163
原创 RESTfulAPI设计的原则,如何设计出符合 RESTful 标准的 API
统一接口:RESTful API 使用 HTTP 协议提供统一的接口,使得客户端能够跨平台访问服务器端的资源。使用 HTTP 协议的各种方法(如 GET、POST、PUT、DELETE 等)来定义 API 的功能。尽量使用 JSON 格式来表示资源,并使用 HTTP 协议的内容协商机制来支持其他格式。使用 HTTP 协议的内容协商机制来支持多种格式的资源表示。尽量使用标准的 HTTP 状态码来表示 API 请求的结果。使用 HTTP 协议的状态码来表示 API 请求的结果。
2022-12-17 21:28:59
642
原创 谈谈滑动窗口算法的思想
学过计算机网络的同学,都知道滑动窗口协议(Sliding Window Protocol),该协议是的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。滑动窗口算法其实和这个是一样的,只是用的地方场景不一样,可以根据需要调整窗口的大小,有时也可以是固定窗口大小。
2022-12-02 20:33:22
130
原创 深入理解CAS
处理器(包括 Intel 和 Sparc 处理器)使用的最通用的方法是实现名为比较并转换或CAS的原语,在 Intel 处理器中,比较并交换通过指令的cmpxchg系列实现。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值V与预期原值A相匹配,那么处理器会自动将该位置值V更新为新值B,否则,处理器不做任何操作,整个操作保证了原子性,即在对比V==A后、设置V=B之前不会有其他线程修改V的值。
2022-11-22 11:20:19
70
原创 谈谈对Volatile的理解
JMM:java内存模型,是java的一种约定,也就是一个概念。为了保证线程安全。线程中分为工作内存和主内存1.线程释放锁前,必须把共享变量立刻刷回主存。2.线程加锁时,必须读取主存中的最新值到工作内存中!3.这锁也是同一把锁。从一个例子来理解这个程序会不会停止?存在的问题是线程程序a不知道主内存的值已经被main线程修改了还在运行就死循环了。说明线程A不可见主线程的变化。接下来就能引进Volatile解决不可见性。如果我们把变量num加Volatile就会停止。验证了可见性。
2022-11-20 18:04:43
86
原创 ThreadLocal深入浅出
首先我们需要明白的是,ThreadLocal 只跟其归属的线程有关,线程死亡了,那么它对应的 ThreadLocal 中存储的信息也就被清除了(线程死亡前一定要释放掉绑定的用户数据,不然会出现 OOM 问题),也就是说,ThreadLocal 只用于在本次请求中持有数据。简单来说,我们把用户数据存入 ThreadLocal 里,这样,只要本次请求未处理完,这个线程就一直还在,当前用户数据就一直被持有,当服务器对本次请求做出响应后,这个线程就会被销毁。对于大型Web,我们可以用ThreadLocal。
2022-11-17 17:11:43
208
原创 一图简单介绍CopyOnWriteArrayList---并发问题
写入时复制技术,是计算机程序设计领域的一种优化策略。比vector好在没有用到传统的synchronize,而是用了juc里的lock锁来提高效率,写入时复制。
2022-11-15 10:36:59
88
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人