自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Oracle共享池

共享池 :将查询的sql语句的。查询缓存 :将查询的sql语句和。

2023-10-04 23:05:03 121

原创 数据库三大范式

参考 原文链接:https://blog.csdn.net/ddzzz_/article/details/119277573。

2023-10-03 20:19:03 119

原创 23.MySQL --- 长事务问题

总之,长事务可能会对数据库的性能、内存消耗、数据一致性和回滚时间等方面带来危害,因此需要合理设计和管理事务,以确保数据库的正常运行和数据的完整性。

2023-10-03 20:15:55 706

原创 22.MySQL --- 多次单表 VS 单次多表

多次单表和单次多表到底哪个效率高

2023-10-03 20:15:22 99

原创 21.MySQL --- 子查询为什么不用

为什么说能不用子查询就不用子查询

2023-10-03 20:14:34 35

原创 20.MySQL --- count(*)和(1)的区别

在MyISAM则不一样。

2023-10-03 20:13:33 23

原创 19.MySQL --- 查询优化

最终选择索引和filesort进行排序是由优化器决定的,走索引要回表什么的会耗时,由联合索引另说。举个例子,A表中有20个数据,B表中有30个数据,在没有索引的情况下,每一个A表的id都要对B表对数据id进行全表遍历,mysql会先将select的数据查出来放到内存中,让数据在内存中进行排序,我们称为 filesort。联合索引 + 索引覆盖,可能效率会快过 filesort,具体看数据量,由优化器视成本决定。会自动将表数据少的那个表作为被驱动表,当然有索引的另说,我们说的是没有索引的情况。

2023-10-03 20:11:58 22

原创 18.MySQL --- 索引失效

索引失效情况1.联合索引 — 最左匹配原则 导致索引失效2.计算 函数 导致索引失效3.类型转换导致索引失效4.!= <> is not null 这些否定导致索引失效5.like以通配符%开头导致索引失效6.or前后字段存在非索引列导致索引失效7.order By 不加 limit 导致索引失效8.总结

2023-10-03 20:10:49 19

原创 17.MySQL --- 索引覆盖

回表的概念为什么需要有回表解决回表问题 — 索引覆盖

2023-10-03 20:08:19 20

原创 16.MySQL --- 索引分类

此处我们拿二级索引举例但是!!!哪怕是通过二级索引找到了数据,其实也就是找到了二级索引的数据条件的对应的主键罢了,最后还是要回表到主键索引去找到真实数据。

2023-10-03 20:06:55 21

原创 15.MySQL --- 其他索引结构

B+树只有叶子结点存放真实数据,非叶子结点只存放主键最小值和数据页页数,二级索引…B树因为非叶子结点也会存储真实数据,导致B树的高度 > B+树的高度。B+树的叶子结点是通过链表相连接的,而B树是没有的。B树是叶子结点和非叶子结点都存放真实数据。先说一下B树和B+树 区别。

2023-10-03 20:05:11 27

原创 14.MySQL --- 索引存储结构B+树

其实这也很好算,我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即16384/14=1170。需要注意的是,InnoDB中的B+树是自平衡的,当插入或删除数据时,会自动重新调整树结构,以保持树的平衡性和性能。是按页加载的,一行行数据加载到一页页里面,也就是说我们的索引数据都是放在一页一页里面的,而一页的大小是16kb,生成B+树的过程中,首先会生成目录页,然后再生成数据页。

2023-10-03 20:01:44 46

原创 13.MySQL --- 页&区&段

当我们查询数据时,其是以页为单位,将磁盘中的数据加载到缓冲池中的。同理,更新数据也是以页为单位,将我们对数据的修改刷回磁盘。mysql中的具体数据是存储在行中的,而行是存储在页中的,每页的默认大小为16k(大小可以通过配置文件修改)事务数据页(Transaction System Page),与数据库相关的所有内容都存储在Page结构里。Undo页(Undo Log Page),数据页(B-Tree Node),系统页(System Page),

2023-10-03 19:59:35 51

原创 12.MySQL --- 死锁问题

两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。

2023-10-03 19:57:29 19

原创 11.MySQL --- 锁分类

在该语句执行完后,就把AUTO-INC锁释放掉**一个事务在持有AUTO-INC锁的过程中,其他事务的插入语句都需要被阻塞,**因为有表级锁的竞争,并发性能很低。一个事务在写,另外一个事务也要写,就会造成脏写的问题,所以在一个事务在写的时候,我们会添加行锁,确保只能有一个事务进行一条数据的写操作。读 - 写 或 写 - 读,即一个事务在进行写操作的时候,另外一个事务在进行读操作,一个事物在进行读操作,另外一个线程在进行写操作。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞。

2023-10-03 19:56:22 21

原创 10.MySQL --- MVCC机制

对应的就是undo log版本链,用户线程进来查询的那条记录,如果有人要进行修改,则会将修改后的内容引一个指针出来指向旧的数据,这样用户线程读取的一直都是之前的那个版本的数据,自然也就解决了不可重复读和幻读的问题了。我将MVCC与CopyOnWrite做比较,在java中底层就是写时复制技术,我觉得两者是互通的。MVCC在MySQL InnoDB中的实现主要是为了提高数据库的并发性能,用更好的方式去处理。当前读实际上是一种加锁的操作,是悲观锁的实现,而MVCC是乐观锁。的多个版本管理来实现数据库的。

2023-10-03 19:54:10 23

原创 9.MySQL --- redo bin 二阶段提交

二阶段提交prepare 和 commit所以为什么要这样设计呢?这样的设计怎么就能够实现崩溃恢复呢?如果redo log里面的事务时完整的,也就是已经有了commit标识,则直接提交如果redo log里面的事务处于prepare状态,则需要判断对应的事务在bin log是否存在并完整如果bin log存在并完整,则提交事务如果bin log不完整,则回滚事务这样我们就保证了主从一致此时我们的整体架构就变成了。

2023-10-02 22:52:03 31

原创 08.MySQL --- binlog日志

bin log 以事件形式记录,不是事务日志。对于非事务表的操作,每当语句执行完成则直接写入;对于事务表的操作则会在事务提交时(先记录到缓存中)一次性写入。bin log 是 MySQL 的一种二进制日志,记录引起或可能(更新删除没有匹配的记录)引起数据库变动的事件信息。主要用于数据备份和恢复、主从同步等…在主从同步中有两个线程。

2023-10-02 22:50:54 21

原创 07.MySQL --- undo日志

事务需要保证原子性,也就是事务中的操作要么全部完成,要不什么都不做。每当我们要对一条数据做改动时(insert、delete、update),都需要留一手,把需要回滚的记录都记录下来。

2023-10-02 22:50:10 26

原创 06.MySQL --- redo日志

Checkpoint是一种机制,用于将内存中的数据页刷新到磁盘上,以保证数据的持久性。比如,某个事务将系统表空间中第10号页面中偏移量为100处的那个字节的值1改为2,我们只需要记录一下将系统表空间中第10号页面中偏移量为100处的那个字节的值1改为2,不需要将整个页面从缓冲池刷新到磁盘,这是比较耗时的。我们只是想让已经提交了的事物对数据库中数据所做的修改永久生效,即使后来系统崩溃,在重启后也能把这种修改恢复出来,所以我们其实没有必要在每次事务提交时就把事务在内存中修改过的全部页面刷新到磁盘,只需要。

2023-10-02 22:45:42 132

原创 05.MySQL --- 事务

永久性是指一个事物一旦被提交,它对数据库中数据的改变是永久性的,接下来的其他操作和数据库故障不会对永久性数据产生影响。事务A在读到一条数据后,此时事务B将该条数据修改并提交了,此时事务A再读取该数据,读到的还是原来的内容,不能避免幻读。我的理解是数据一致性,举个例子就能明白,拿转账来说,假设用户A和用户B两者的钱加起来一共是500,那么不管A和B。之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是500,这就是事务的一致性。当一个处在部分提交的状态的事务,,此时事务状态就是失败的。

2023-10-02 22:43:04 17

原创 4.MySQL --- Innodb缓冲池

Buffer Pool也是需要性能开销的,innodb规定:当 innodb_buffer_pool_size 小于1G时,设置多个实例是无效的,InnoDB会默认innodb_buffer_pool_instances 的值为1;当我们对数据库中的记录进行修改时,首先会对缓冲池中的信息进行修改,然后以一定的频率刷新到磁盘上,这里并不是每次更新操作都会立刻写回磁盘,而会采用一种 checkpoint 的机制,触发时才回写到磁盘上,更好的提升整体性能;,从而提高并发处理能力。

2023-10-02 22:40:09 37

原创 3.MySQL --- 查询缓存

查询缓存为什么没用

2023-10-02 22:37:38 17

原创 2.MySQL --- SQL执行流程

SQL执行流程解析树&语法树优化器总结一览

2023-10-02 22:36:09 18

原创 1.MySQL --- 逻辑架构

系统(客户端)访问MySQL服务器之前,做的第一件事就是建立TCP连接经过三次握手之后建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份验证、权限获取TCP连接收到请求后,必须要分配一个线程专门与这个客户端进行交互,所以还会有一个线程池,省去创建和销毁线程的开销Parser 解析器SQL命令传递到解析器时,会被解析器验证和解析,并为其创建语法树,MySQL还会对SQL查询进行语法上的优化,进行重写Optimizer 查询优化器SQL语句在语法解析之后,查询之前会使用查询优化器确定SQL语句的执

2023-10-02 22:34:02 15

原创 Docker搭建Nginx并配置静态资源

注意在Docker部署Nginx和直接在Linux上部署Nginx是有区别的。将静态资源全部放到 /usr/nginx/html 下面就可以直接访问了。然而在Docker上部署Nginx,是两个映射!直接在Linux上部署Nginx,只是一个映射。

2023-10-02 22:29:24 899

原创 如何使用@Validated进行参数校验

当校验参数是变量的时候就需要在Controller加上@Validated才能够使用@NotBlank …当校验参数是对象的时候就直接在参数那里加@Validated。

2023-09-09 20:24:28 189

原创 CAP理论

CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer’s theorem),是加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric Brewer)在 2000 年的 ACM PODC 上提出的一个猜想。,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。,在数据复制的过程中,节点N1 和节点 N2 的数据并不一致(强一致性)。

2023-08-21 21:34:01 24

原创 主键自增 & 非自增

同样的场景有很多,有时候你去小店吃饭,发票上就写了你是今天的第几单,那大概就能估计今天店家做了多少单。如果你发现你的竞争对手,总能非常清晰的知道你的产品每个月新进的注册用户是多少人,你会不会心里毛毛的?列,它是个6字节的隐藏列,你平时也看不到它,但实际上,它也是自增的。前面提到的不建议使用自增id的场景,都是技术原因导致的,而下面介绍的这个,单纯是因为业务。的形式组织起来,再将这些页里的部分信息提取出来放到一个新的16kb的数据页里,再加入。总体看下来,自增的主键遇到页分裂的可能性更少,因此性能也会更高。

2023-08-21 21:33:29 163

原创 分库分表架构

分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,使单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。分库分表包括分库和分表两个部分,在生产环境中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。垂直分表定义:将一个表按照字段分成多表,每个表存储其中一部分字段 带来的提升是:a:为了避免IO争抢并减少锁表的几率,查看详情的用户与商品信息浏览互不影响b:充分发挥热门数据的操作效率,商品信息的操作的高

2023-08-21 21:32:39 45

原创 SpringBoot静态资源无法访问

正常来说我们的SpringBoot启动之后,访问 http://localhost:8080/dist/index.html 是可以访问得到的,但是却报404找不到资源。

2023-08-20 13:21:54 1116

原创 面向对象和面向过程的区别

在面向对象编程中,程序员将问题抽象为对象的概念,并通过定义对象的属性(成员变量)和行为(方法)来解决问题。在面向过程编程中,程序员以步骤为基本单位来设计程序,将问题分解为一系列的步骤,然后按照顺序执行这些步骤。面向对象编程的核心思想是将现实世界中的事物抽象为对象,并通过定义对象的属性和行为来模拟和解决问题。相比之下,面向过程编程更注重步骤和流程的控制,适用于一些简单和直接的问题。而面向对象编程更注重问题的分析和抽象,通过对象的交互来解决问题,适用于复杂和多变的问题。是两种不同的程序设计思想。

2023-08-18 23:30:44 25

原创 IDEA如何设置自动导包

转自 原文链接:https://blog.csdn.net/SQD737420/article/details/124889550。

2023-08-18 23:24:34 4422

原创 SpringSecurity面试题

试想一下,如果我们不使用Spring Security,如果保存用户信息呢,大多数情况下会考虑使用Session对吧?在Spring Security中也是如此,用户在登录过一次之后,后续的访问便是通过sessionId来识别,从而认为用户已经被认证。SecurityContextHolder存放用户信息,认证相关的信息是如何被存放到其中的,便是通过SecurityContextPersistenceFilter。

2023-08-18 23:23:16 80

原创 SpringSecurity原理剖析

定义了认证Authentication的方法,是认证相关的核心接口,也是发起认证的出发点,因为在实际需求中,我们可能会允许用户使用用户名+密码登录,同时允许用户使用邮箱+密码,手机号码+密码登录,甚至,可能允许用户使用指纹登录(还有这样的操作?:是我们最常用的用户名和密码认证方式的主要处理类,构造了一个UsernamePasswordAuthenticationToken对象实现类,将用请求信息封装为Authentication。: 获取当前 request 对应的**权限配置****,

2023-08-18 23:22:11 21

原创 SpringSecurity怎么用

这一个配置非常重要,配置了。

2023-08-18 23:20:47 30

原创 为什么使用JWT

我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。基于token的鉴权机制。

2023-08-18 23:19:59 43

原创 过滤器和拦截器的区别

我们看到过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。

2023-08-18 23:19:24 24

原创 分布式SSO单点登录

访问其他模块,发送请求带着cookie进行发送,服务器获取cookie值,在redis中查询,根据key进行查询,如果找到就是登录状态。访问其他模块时,每次访问在地址栏带着生成字符串,在访问模块里面获取地址字符串,根据字符串获取用户信息。在项目中某个模块登录之后,按照规则生成字符串,把登录之后用户包含到生成字符串里面,返回字符串。在项目中任何一个模块登录后,把数据放到两个地方。按照一定规则生成字符串,字符串可以包含用户信息。session默认过期时间30分钟。可以把字符串通过cookie返回。

2023-08-18 23:18:33 48

原创 Netty源码分析

相较于select和poll机制来说,epoll机制将事件处理交给了操作系统内核(操作系统硬中断)来处理,优化了elect和poll模型的无效遍历问题。​ 进入netty的select源码可以看到,netty底层也是调用NIO的selector方法,但netty用selectCnt来记录轮询次数。如果一个任务的执行时间超过一个时间轮槽的时间间隔,那么它会被插入到更高层级的时间轮,以确保其能够在正确的时间被执行。如果有多个线程提交任务的时候才会调用wakeup方法,就是唤醒我们的线程。

2023-08-17 19:56:18 28

空空如也

空空如也

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

TA关注的人

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