- 博客(31)
- 资源 (4)
- 收藏
- 关注
原创 一文应对MySQL面试常见场景
存储过程是一些预编译的 SQL 语句。1、更加直白的理解:存储过程可以说是一个记录集,它是由一些 T-SQL 语句组成的代码块,这些 T-SQL 语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。2、存储过程是一个预编译的代码块,执行效率比较高,一个存储过程替代大量 T_SQL 语句 ,可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全。
2023-07-15 01:10:42
278
原创 一文应对Redis面试常见场景
AOF 日志是主线程写回的,AOF 重写的过程实际上后台子进程 bgrewriteaof 完成,防止阻塞主线程。重写过程和 AOF 日志由主线程写回不同,重写过程是由后台子进程 bgrewriteaof 来完成的,这也是为了避免阻塞主线程,导致数据库性能下降。总的来说,一共出现两个日志,一次拷内存数据拷贝,分别是旧的 AOF 日志和新的 AOF 重写日志和 Redis 数据拷贝。
2023-07-15 00:43:30
354
原创 Java之Object类分析
Object类Object类是Java所有类的始祖,在Java中每个类都扩展了Object。但是并不需要明确写出继承Object类。如果一个类没有明确的指出超类,Object就是这个类的超类。Object类中的方法Object类是Java中所有类的基类。位于java.lang包中,一共有13个方法。方法一:equals()方法该方法比较的是对象是否相等(其实就是比较堆内地址)public boolean equals(Object obj) { return (this == obj
2022-02-28 15:15:49
297
转载 一致性Hash算法
使用Hash存在的问题在使用Hash算法的时候会出现一些缺陷,主要体现在服务器数量变动的时候,所有缓存的位置都要发生改变。试想一下,如果4台缓存服务器已经不能满足我们的缓存需求,那么我们应该怎么做呢?很简单,多增加几台缓存服务器不就行了!假设:我们增加了一台缓存服务器,那么缓存服务器的数量就由4台变成了5台。那么原本hash(a.png) % 4 = 2 的公式就变成了hash(a.png) % 5 = ? , 可想而知这个结果肯定不是2的,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发
2022-02-28 14:12:53
239
原创 HashMap底层源码
结论HashMap底层维护了Node类型的数组table,默认为NULL当创建对象时,将加载因子初始化为0.75当添加key-val的时候,通过key的哈希值得到在table的索引,然后判断该索引处是否有元素,如果没有元素直接添加。如果索引处有元素,继续判断该元素的key是否和准备将加入的key相等,如果相等,则直接替换val;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容。第一次添加,需要扩容table容量为16,临界值为12以后再扩容,则需要扩容ta
2022-02-26 19:46:43
255
原创 HashSet底层源码
结论HashSet底层是HashMap添加一个元素时,先得到hash值,会转成索引值找到存储数据表table,看这个索引位置是否已经存在的有元素如果没有,直接加入如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后在Java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认是8),并且table的大小大于等于 MIN_TREEIFY_CAPACITY(默认是64),就会转成红黑树。继承体系源码解读1、构造函数,底层使用HashMappu
2022-02-26 19:34:29
416
原创 ArrayList底层源码
ArrayList底层源码结论ArrayList中维护了一个Object类型的数组elementData.(transient Object[] elementData;)当创建ArrayList对象的时候,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如果需要再次扩容,则扩容elementData为1.5倍。如果使用的是指定大小的构造器,则初始化elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1
2022-02-26 15:56:01
227
原创 死锁问题总结
什么是死锁线程死锁描述的是这样⼀种情况:多个线程同时被阻塞,它们中的⼀个或者全部都在等待某个资源被释放。由于线程被⽆限期地阻塞,因此程序不可能正常终⽌。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对⽅的资源,所以这两个线程就会互相等待⽽进⼊死锁状态。产生死锁的原因1、竞争资源系统中的资源可以分为两类:可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源;另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后
2022-02-26 10:53:55
979
原创 线程的状态
线程的状态初始状态(NEW):线程被创建,但是还没有调用start()方法。运行状态(RUNNABLE):Java线程中将就绪和运行中两种状态笼统的成为运行。阻塞(BLOCKED):表示线程阻塞于锁。等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。终止(TERMINATED):表示该线程已经执行完毕。线程状态转换图线程状态详解1、初始状态实现Ru
2022-02-26 09:56:20
154
原创 MySQL性能分析——Explain
Explainexplain+SQL语句做什么表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询id*select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序三种情况id相同,执行顺序由上而下id不同,如果是子查询,id序号递增,id值越大优先级越高,越先被执行id相同不同,同时存在。id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。selec
2021-12-22 15:29:25
101
原创 MySQL索引
索引排好序的快速查找数据结构以指针的方式指向数据索引方式:概念数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。优势与劣势优势:提高数据检索效率,降低数据库的IO成本降低数据的排序成本,降低了CPU的消耗劣势:占用空间降低了表的更新速度索引建立花费时间分类单值索引一个索引只包含单个列,一个表可以有多个单列索引一张表建立索引最多不要超过5个唯一索引索
2021-12-22 10:18:57
435
原创 事务的特性——持久性(实现原理)
事务的特性——持久性(实现原理)InnoDB读写数据原理磁盘的IO操作所需要花费的成本十分巨大,因此InnoDB在解决这一问题的时候提供了Buffer Pool作为访问数据库数据的缓冲。Buffer Pool位于内存当中,其包含了磁盘中部分数据页的映射。当需要读取数据的时候,InnoDB会首先尝试从Buffer Pool中读取,如果读取不到才会从磁盘读取并放入到Buffer Pool中。当写入数据的时候,会先写入Buffer Pool页面,并将这样的页面标记为脏页,这些修改过的数据页在之后的某个时刻
2021-12-08 20:23:37
3294
原创 MySQL的WAL机制
MySQL的WAL机制WAL全称为Write-Ahead Logging,预写日志系统。其主要是指MySQL在执行写操作的时候并不是立刻更新到磁盘上,而是先记录在日志中,之后在合适的时间更新到磁盘中。日志主要分为undo log、redo log、binlog。当内存数据页跟磁盘数据页内容不一致的时候,我们成这个内存页为“脏页”。内存数据写入磁盘后,内存和磁盘上的数据页内容就一致了,称为“干净页”。MySQL真正使用WAL的原因是:磁盘的写操作是随机IO,比较耗性能,所以如果把每一次的更新操作都先写入
2021-12-08 20:10:10
6264
原创 事务的特性——原子性(实现原理)
事务的特性——原子性(实现原理)事务的原子性是指一个事务中的所有操作是不可分割的,必须是一个逻辑单元,只能是全部执行成功或者全部执行失败。(典型例子:转账)。那么事务的原子性是如何保证的?在此之前我们先需要说一下MySQL中的WAL机制。WAL机制WAL全称为Write-Ahead Logging,预写日志系统。其主要是指MySQL在执行写操作的时候并不是立刻更新到磁盘上,而是先记录在日志中,之后在合适的时间更新到磁盘中。日志主要分为undo log、redo log、binlog。事务原子性是如何
2021-12-08 15:19:36
7160
原创 MySQL事务
MySQL事务事务简介事务:一个或一组sql语句组成一个执行单元,要么全部执行,要么全部不执行。举例: 转账用户A需要从银行转账,那么就涉及到转出的账户需要扣掉转账的金额,转入的账户需要加上转入的金额,这两个操作的执行为了确保数据的一致性,需要同时成功或同时失败,因此就需要使用事务来进行处理。和事务相关的sql语句commit :提交事务rollback :回滚事务在MySQL中默认情况下,事务是自动提交的,执行一条DML语句即开启了事务,并且自动提交了事务事务的特性(ACID)原子性
2021-12-08 14:33:56
605
原创 关于_int128
#include<bits/stdc++.h>using namespace std;inline __int128 read() { __int128 x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') {
2021-12-04 00:20:06
517
原创 删除有序数组中的重复项
删除有序数组中的重复项方法一(双指针思想)使用cnt来记录新数组的下标,t来记录添加到新数组中的每一个值。首先需要遍历原先数组,原先数组是有序排列的,因此遇到和前一个数不相同的时候就需要添加到新数组中,之后更新t。这时候t就作为最新的需要比较的数,如果之后的数和t不相同,则再添加到新数组中。这里的新数组并没有重新声明,而是在原先数组的基础上替换,cnt就用来表示每一次更新的数组的下标,从0开始。public static int removeDuplicates(int[] nums) {
2021-11-06 16:30:08
115
原创 多数元素Leetcode
多数元素方法一(哈希表)利用哈希表来存储每一个元素以及元素出现的次数,当哈希表已经有该元素时,取出值并加一放入哈希表中,最后只需要遍历哈希表,找到值大于等于数组长度一半的键,返回即可。public static int majorityElement(int[] nums) { Map<Integer,Integer > map = new HashMap<Integer,Integer >(); for(int i=0;i<nums.l
2021-11-06 16:05:51
68
原创 Java集合
ArrayList源码分析(jdk7和jdk8有所不同)jdk7的时候在调用构造函数的时候就创造出长度为10的数组,而在jdk1.8中没有,在第一次调用add方法的时候才创造数组。构造器ArrayList 提供了三种方式的构造器,可以构造一个默认初始容量为 10 的空列表、构造一个指定初始容量的空列表以及构造一个包含指定 collection 的元素的列表,这些元素按照该 collection 的迭代器返回它们的顺序排列的。ArrayList list = new ArrayList();
2021-10-04 16:33:43
68
原创 String、StringBuffer、StringBuilder
String、StringBuffer、StringBuilder异同String:不可变的字符序列;底层结构使用char[]存储StringBuffer:可变的字符序列;线程安全;效率低;底层结构使用char[]存储StringBuilder:可变的字符序列;线程不安全;效率高;底层结构使用char[]存储频繁修改字符串的内容最好不用String,StringBuffer、StringBuilder的使用需要考虑是否线程安全,开发中尽量使用StringBuffer(int capacity)或St
2021-10-04 14:26:56
62
原创 Java类型转换总结
字符串转化为Integer Integer integer; integer = Integer.valueOf(intstr); return integer.intValue();Integet转化为字符串Integer integer = new Integer(value);integer.toString();字符串转化为日期java.sql.Date.valueOf(dateStr);日期转化为字符串datee.toString();字符串转换为BigDecimal
2021-09-15 11:04:17
98
原创 springboot图片上传至Linux的ftp服务器
文件上传Controller @RequestMapping("/upload") @ResponseBody public Map<String,String> uploadImg(@RequestParam("file") MultipartFile file, Model model,HttpServletRequest request) throws IOException{ return fileService.upfile(file,reques
2021-08-12 19:55:10
570
原创 发送邮件工具类
发送邮件工具类package com.wfsc.utils;import com.wfsc.entity.User;import javax.mail.MessagingException;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.io
2021-07-22 14:21:59
265
原创 登录拦截器
登录拦截器Myconfig.java@Componentpublic class MyConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatte
2021-07-21 22:52:43
72
原创 动态验证码
动态验证码前端代码<div id="validatePanel" class="item" style="width: 137px;"> <input type="text" name="captcha" placeholder="请输入验证码" maxlength="4"> <img id="refreshCaptcha" class="validateImg" onclick="changeCode()" th:src="@{/code}">
2021-07-21 22:49:19
122
原创 LayUi实现图片上传
LayUi实现图片上传前端代码Controller层前端代码<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head> <meta charset="utf-8"> <title>upload模块快速使用</title> <link rel="stylesheet" th:href="@{/layui/css/layui.css}"
2021-07-21 22:41:35
177
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人