- 博客(59)
- 资源 (1)
- 收藏
- 关注
原创 MySQL日志
当进行增删改后,回先记录到redo log buffer中记录数据页变化,事务提交的时候会把bufffer中的变化刷新到磁盘中持久保存,这时如果出错可以通过redolog进行数据恢复。开启了查询日志之后,在MySQL的数据存放目录,也就是 /var/lib/mysql/ 目录下就会出现mysql_query.log 文件。而如果脏页成功刷新到磁盘 或者涉及到的数据已经落盘,此时redolog就没有作用了,就可以删除了,所以存在的两个redolog文件是循环写的。默认情况下,查询日志是未开启的。
2022-10-17 01:35:56
477
原创 MySQL的行锁、间隙锁和临建锁
默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key (临键锁)锁进行搜索和索引扫描,以防止幻读。索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。:允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。//共享锁和共享锁兼容,共享锁和排他锁互斥。InnoDB的行锁是针对于索引加的锁,
2022-10-17 01:30:28
637
原创 MySQL的MVCC实现原理
MVCC只在 读已提交 和 可重复读 两个隔离级别下起作用,因为 读未提交 隔离级别下,读写都不加锁, 可串行化 隔离级别下,读写都加锁,也就不需要。无需加锁,也实现数据的安全性和事务的隔离性。,想要实现同一条数据的并发读写,还要保证数据的安全性,就需要操作数据的时候加读锁和写锁,这样就降低了数据库的并发性能。历史数据的版本链,依次匹配,满足哪个版本的匹配规则,就能读到哪个版本的数据,一旦匹配成功就不再往下匹配。(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突。
2022-10-17 01:26:24
680
原创 MySQL的undo log日志
Undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的 rollback segment回滚段中,内部包含1024个undo log segment。可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。物理日志,这个页的内容是什么样的;
2022-10-15 23:47:34
676
原创 MySQL的redolog日志
InnoDB的内存有缓冲池,增删改时修改缓冲池的数据,没有的话,先从磁盘加载存到缓冲区再修改。当进行增删改后,回先记录到redo log buffer中记录数据页变化,事务提交的时候会把bufffer中的变化刷新到磁盘中持久保存,这时如果出错可以通过redolog进行数据恢复。而如果脏页成功刷新到磁盘 或者涉及到的数据已经落盘,此时redolog就没有作用了,就可以删除了,所以存在的两个redolog文件是循环写的。重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的。
2022-10-15 23:44:56
842
原创 非聚簇索引一定回表吗?
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。一个索引包含(覆盖)所有需要查询字段的值,被称之为"覆盖索引"。的查询时,在索引的叶子节点上,已经包含了score 信息,不会再次进行回表查询。举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行。
2022-10-15 16:48:05
1282
1
原创 SQL 性能分析
执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有 SQL语句的日志。最终我们发现,在慢查询日志中,只会记录执行时间超多我们预设时间(2s)的SQL,执行较快的SQL是不会记录的。# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志。-- 查看指定query_id的SQL语句CPU的使用情况。
2022-10-14 23:12:36
990
原创 mysql的索引分类
2.和业务场景有段,对于唯一查找(查找一个值),Hash确实更快,但数据库中经常查询多条数据,这时候由于B+数据的有序性,与叶子节点又有链表相连,他的查询效率会比Hash快的多。这里所描述的是索引存储时保存的形式,复合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时需遵循最左前缀原则。唯一索引:索引列中的值必须是唯一的,但是允许为空值,避免同一个表中某数据列中的值重复,UNIQUE。:主键索引,唯一索引,复合索引,普通索引,全文..
2022-10-14 23:08:11
437
原创 get和post的区别
2、get受限于url长度的限制,传送的数据量较小;post对上传数据大小无限制(大小根据php.ini 配置文件设定),文件上传下载用post。1、传参的方式:get是默认提交方式,通过url传参,url与参数用?隔开,多个参数用&隔开;post数据在请求体中。get会将数据显示在url中,所以post相对安全;但是http协议是不加密的,所以都不安全。3、get一般用于直接获取数据、查询;
2022-10-13 22:06:38
844
原创 MySQL存储引擎
MySQL 支持多种存储引擎,比如 InnoDB,MyISAM,Memory,Archive 等等.在大多数的情况下,直接选择使用 InnoDB 引擎都是最合适的,InnoDB 也是 MySQL 的默认存储引擎。MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。MyISAM: 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那这个存储引擎是非常合适的。InnoDB支持行级锁,而MyISAM支持表级锁。
2022-10-13 22:01:21
141
原创 Redis主从复制的核心原理
3.服务器运行ID(runid):每个Redis节点,都有其运行ID,运行ID由节点在启动时自动生成,主节点会将自己的运行ID发送给从节点,从节点会将主节点的运行ID存起来。(1)如果从节点保存的runid与主节点现在的runid相同,说明主节点之前同步过,主节点会继续尝试使用部分复制(到底能不能复制还要看offset和复制积压缓冲区的情况)。(2)如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的Redis节点并不是当前的主节点,只能进行全量复制。
2022-10-10 23:06:34
325
原创 Redis有哪些数据结构
1.字符串:可以用来做最简单的数据缓存,可以缓存某个简单的字符串,也可以缓存某个json格式的字符串,Redis分布式锁的实现就利用了这种数据结构,还包括可以实现计数器、Session共享、分布式ID。3.列表:Redis的列表通过命令的组合,即可以当作栈,又可以当作队列来使用,可以用来缓存类似微信公众号,微博等消息流数据。
2022-10-09 22:35:43
345
原创 redis常见的缓存淘汰算法
LFU(Least Frequently Used,最不经常使用),在一段时间内,缓存数据被使用次数最少的会被淘汰。LRU(Least Recently Used,最近最少使用),根据最近被使用的时间,离当前最远的数据优先被淘汰。FIFO(First In First Out,先进先出),根据缓存被存储的时间,离当前最远的数据优先被淘汰。
2022-10-09 22:34:51
194
原创 单例模式的实现
既想要实现懒加载,加锁粒度又不能太大,因此有了这种双重校验锁:这里volatile的作用又是什么呢?2.只能通过方法调用getInstance的方式获得,所以构造方法的作用域是private(别的方法不可以通过new的方式实例化这个类);和上面实现方式相比,获取对象的方法加了锁:实质上是对方法内部的资源上了锁,持有资源,可以保证线程安全,但是加锁粒度较大,影响效率;类加载的时候就实例化,线程安全,也保证了单例,没有加锁,执行效率也高,但是类加载时就初始化,浪费内存(没有实现懒加载)1、要求生产唯一序列号。
2022-10-09 16:35:59
137
原创 数据库的事务和锁
解决办法:有预防、避免、检测和解除四个方面,预防就是破坏死锁产生的四个必要条件,但会降低系统的资源利用率,避免的话就是不破坏条件,而是在资源动态分配的过程中防止系统进入不安全的状态,比如经典的银行家算法,检测和解除是配套的一种设施,就是通过检测机构确定死锁的进程或者资源然后再予以解除,常用的就是挂起或者撤销一些进程,从而释放一些资源。反之如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,反而降低了系统的吞吐量。
2022-10-09 16:24:46
646
原创 redis实现分布式锁
在redis集群主从的这种搭建中,会带来另外一个问题:说白了还是CAP原则,分布式可用性和一致性不可能同时满足:假如client1对redis主获取了锁,然后异步复制给了redis从,如果这时redis主宕机,redis从变为主,就会导致client2来加锁的时候,成功加锁,则破坏了分布式锁的原则,导致多个线程对一个分布式锁完成了加锁,脏数据就会由此产生。客户端加锁默认生存时间30s,一旦加锁成功会有一个dog线程,10s检查一次如果客户端还持有锁,会不断延长锁key的生存时间。
2022-10-09 16:19:48
214
原创 Java线程池总结
线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。,多余的空闲线程额存活时间,任务全部完成之后,最大线程数没任务的时候,超过一定时间销毁,只留下核心线程。【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。newFixedThreadPool创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待。
2022-09-24 00:34:29
162
原创 LeetCode-77.组合-回溯算法
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1:输入:n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]示例 2:输入:n = 1, k = 1输出:[[1]]来源:力扣(LeetCode)链接:https://leetcode.cn/problems/combinations。
2022-08-25 00:38:58
233
原创 进程通信、线程通信
进程包含线程,线程是操作系统的最小执行力度、最小单元。进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。
2022-08-24 23:18:37
156
原创 Java线程池总结
线程池是一种多线程处理方式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务,给每个线程每次分配一个任务。每次任务结束线程进行销毁,再有新的任务新创建线程,代价极大。在线程中写一个死循环就可以一直存活,但一直占用cpu和空间。
2022-08-24 23:14:36
204
原创 服务器常用端口号总结
其中8161端⼝是activeMQ的后台管理系统端⼝;61616端⼝则是给java消息服务⽤的tcp端⼝。MQ服务默认配置情况启动,会启⽤“8161”和“61616”两个端⼝。服务器上部署浏览器,https监听443端口。80端口:HTTP 超文本传输,用于网页浏览。SSH协议端口 22 (Xshell端口)443端口:HTTPS 加密的超文本传输。8080端口:Tomcat端口。3306端口:MYSQL数据库。21端口:FTP 文件传输。22端口:SSH 远程连接。53端口:DNS 域名解析。
2022-08-23 23:23:56
1581
原创 扫码登录原理介绍
手机登录&打开网页二维码登录页(二维码有时效5-10分钟左右,超时会过期)----->手机扫码之后跳转到一个页面,这个页面至少有两个按钮:确认登录/取消登录----->手机上点击确认登录-------->手机上显示登陆成功&电脑网页显示登录成功并且跳转,以及显示登陆人信息。1、用户向网站请求登录二维码,网站随机生成uuid,将uuid和登陆链接生成二维码显示到页面,网页端轮询后端接口,直到获取到信息,结束轮询。手机点击确认登录,再次发送请求,服务器拿到用户id,调用登陆方法,登陆成功。
2022-08-20 00:14:52
431
原创 最近遇到问题及解决
1、Java项目打包上传服务器,涉及到访问Linux文件路径报错:解决:Windows与Linux路径写法不同Windows的路径:"D:\\XXXXXXX\\"Linux的路径:"/opt/apache-tomcat-8.0.9/webapps/CollegeBBS/resource/images/"2、在Linux定时器中执行脚本,脚本涉及路径需要使用绝对路径。3、把带引用jar包的java项目打成jar包:3-1 3-2 3-3...
2022-07-08 00:18:53
288
原创 警告: Exception encountered during context initialization - cancelling refre
写Spring的Aop相关时一直报这个错误,查了半天原来是依赖的问题这是需要用到的全部坐标依赖,直接粘贴就行
2022-05-02 22:17:43
489
1
原创 Java实现直接插入排序
算法思想:直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。将待排序的元素插入到已排序元素的正确位置。例子:红色是有序列,绿色是无序列,无序列等待依次插入到有序列中。继续下去,直到安排好最后一个元素。代码:public class InsertSort { public static void main(String[] args) { int[] arr = new int[] {9,3,4,8,1,2,.
2022-04-23 22:31:12
716
原创 The selection cannot be run on any server.
一天没打开eclipse就发生了这种情况,真的无语住了,所有的web项目都在报错。。。好像知道为什么了。。。昨天有个提醒让我升级Java,随手就点了。。。从网上搜了一下,我一共用了两个步骤1、点击Window-Preferences搜索server,进入到Runntime Environment中,选中自己之前一直用的tomcat版本,我之前用的8.0版本,点击Remove,先把他删除掉,然后重新Add点击Add,重新导入选择8.0版本,之后自己操作一下,我的自己就...
2022-04-23 22:20:03
3635
原创 值传递和引用传递
例如:int a = 10;代表着:句柄 = 值;其中a是句柄,10是值按值传递:传递的是右侧值的地址按引用传递:传递的是左侧句柄的地址Java中都是按值传递的
2022-04-20 10:39:46
230
原创 eclipse运行tomcat报错-端口占用
报错:Port 8080 required by Tomcat v8.0 Server at localhost is already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the por...
2022-04-20 10:33:51
1724
2
原创 Java对int[]数组实现增删改查
import java.util.Arrays;public class ArrayTest { public static void main(String[] args) { int[] arr = new int[] {1,2,3,4,6,5,9,8,7}; //kuoRong(arr); //insert(3, 555, 8) ; deletc(5,8); } //数组扩容 public static void kuoRong(int[] arr) { int[] .
2022-04-19 21:20:26
883
原创 tomcat的工作流程
目录1、程序基本内容:2、实现原理:3、浏览器与tomcat4、tomcat核心功能5、总结:tomcat有主方法,servlet借助tomcat运行。tomcat文件夹1、程序基本内容:bin:包含各种脚本conf:是confige的缩写,有很多配置文件,程序启动肯定会读取配置文件lib:程序的主体部分,包含程序的主体代码logs:运行日志,运行期间的各种情况webapps:存放网站,一个文件就代表一个网站给定一个指定目录,能遍历该目录下
2022-04-19 21:10:50
1695
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅