自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux部署MySQL

获取tar包并解压对于数据库版本不同,主流分为MySQL5以及8两种版本,配置会有一些些出入,5的话基于my.cnf可以进行相应配置,8没有。如图:其中:basedir为存放解压mysql文件的位置datadir为我们进行初始化MySQL服务的时候数据存放的位置【如果在第一次初始化的时候出现问题,要进行第二次等多次初始化之前,我们需要把该文件夹下的文件清空】log-error记录日志信息,我们第一次初始化的默认随机密码在里面查看。

2024-06-04 17:05:11 857

原创 无法删除dll文件

通过Tasklist /m + dll文件名称 去查看它和哪个系统文件绑定运行,发现是explorer.exe。我们如果直接通过del命令【当然需要在该dll文件所在的路径中】。碰到xxxxxx.dll文件无法删除不要慌!我们需要在任务管理器中,将资源管理器结束掉。最后别忘了启动explorer.exe程序喔。这样,我们就可以成功删除了。

2024-05-31 17:03:36 349

原创 B树、B+树与磁盘读取的关系

由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。涉及局部性原理:当一个数据被用到时,其附近的数据也通常会被使用。【空间局部性】程序运行期间所需要的数据通常比较集中。当一个数据被用到时,程序执行后期该数据也通常会被使用。【时间局部性】由于磁盘。

2024-05-30 19:14:06 1230

原创 Servlet

主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。这里引申出HttpServlet【基于Http协议的servlet】

2024-05-23 20:40:28 515

原创 Spring框架

Spring Framework,它是很多模块的集合。比如IOC、AOP、一些第三方组件,同时支持JUnit单元测试框架。核心思想:不用我们开发者造轮子,开箱即用,提高开发效率。IOC依赖注入:Spring其他所有功能都需要依赖该模块IOC容器时Spring实现IOC的载体,IOC容器实际上就是个Map,存放的时各种对象。Bean指的是那些被IOC容器所管理的对象。

2024-05-23 13:12:39 1001

转载 redis单线程到多线程的发展

redis作为单线程为什么这么快,I/O多路复用模型,以及之后引入多线程

2024-05-23 10:30:00 28

原创 Mybatis

执行方案出现如下情况,即有的数据没有被成功赋值:解决方式:通过给字段起别名通过resultMap的方式手动定义字段和属性的映射resultMap是Mybatis用于解决数据库列名与POJO属性名不匹配问题的强大工具,它可以在查询,插入,更新操作中灵活地重命名参数。

2024-05-22 20:29:59 1098

原创 泛型与Object

而使用Object的话,在编译期是不会去检查类型转换是否存在问题,而是统一交给运行时去检查,因为编译期,编译器不知道object的引用指向的对象是什么类型。比如我们经常使用的ThreadLocal,它就是通过泛型,这样,我们直接将我们需要封装的类型以参数的形式放进去即可。代码简洁,并且避免了运行时的类型异常。自定义封装工具类,比如项目中用于处理redis高并发的情况,如缓存穿透,缓存击穿,我们通过将其封装成工具类,使用泛型,一定程度上使代码复用性。因为编译的时候,编译器不知道obj指向的是Car类型对象,

2024-05-22 16:35:59 278

原创 Redis实现MQ

上游发出请求后阻塞等待下游给到反馈,否则整个流程将一直阻塞。提出mq之后:即有producer mq consumer 三者。

2024-05-21 17:21:03 733

原创 Docker容器

之前用的都是别人准备的,如果自己要部署一个java项目,并将其打包成镜像。分层存储的架构。镜像实际是由多层文件系统联合组成。TODO。

2024-05-21 15:50:55 792

原创 对ThreadLocal的一些理解

通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。JDK 中自带的类正是为了解决这样的问题。ThreadLocalMap是ThreadLocal类的,即一个对象,且ThreadLocalMap中存放的是Entry<K ,V>数组,每一个entry中存放的key为当前ThreadLocal对象,value为我set的值。因为是静态内部类,所以多个ThreadLocal对象共用一个ThreadLocalMap。一个Thread线程对象中只有一个ThreadLocalMap。

2024-05-19 21:11:50 769

原创 计算机网络相关

HTTPS 的加密过程中其实既用到了非对称加密也用到了对称加密,其中握手过程使用的是非对称加密,主要目的是双方可以安全的协商一个统一的密钥,而真正的数据传输过程则使用的是对称加密,正是使用刚才商量的这个密钥。使用对称密钥是因为效率高,尤其是在大数据量传输的时候,使用对称密钥可以快很多!根据以下链接进行整理,如要观看完整版,可移步跳转,本人做笔记便于自己理解和查看。

2024-05-16 15:05:28 1491

原创 SQL操作面试题

左表score表写在left join前面是主表,因此左表的数据记录全部会出现在结果集中,而右表student中的记录如果在主表中没找到匹配,就不会出现在结果集中,上面的s_id=8的记录就没有出现在最终结果中。这里的重点是是用什么连接,需要考虑好哪个是主表,哪个是从表。假如还是使用左连接,但是表的顺序互相换一下,结果就会完全不同。NULL的话只能通过ISNULL和ISNotNULL去进行判断,而' ' 可以用<,>,=等等,更加灵活。只能通过COUNT(*)3、左连接、右连接、内连接、全连接、交叉连接。

2024-05-15 23:26:04 136

原创 MySQL数据库核心面试题

存储引擎、索引、事务、锁以及索引和锁之间的关系

2024-05-14 22:28:06 944

原创 高并发场景

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。针对大量缓存同时失效的情况解决办法①设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。②提前预热(推荐):针对热点数据(比如我们秒杀业务中的数据)提前预热,将其存入缓存中并设置合理的过期时间,保证在秒杀活动结束前不过期。测试环境下:我是通过测试类,先进行数据预热,加载进Redis缓存中。③持久缓存策略。

2024-05-12 20:23:12 444 1

原创 Java基础杂集

1、包装缓存机制:Byte、Short、Integer、Long默认缓存了-128—127相应类型的缓存数据,而Double和Float没有缓存,Character缓存了0 - 127之间的数据,Boolean直接返回false和true。加上自动装箱拆箱(valueOf,XXXValue)的机制,在以上范围中,如果进行对象引用的比较,通过==得到true。3、基本数据类型char、short、byte占2个字节,int占4个字节、long、float、double占8个字节。

2024-05-12 19:12:51 302

原创 异常常常常

异常分为检查异常和非检查异常:检查异常:编译的时候必须被捕获或声明的异常,即如果一段程序中可能抛出异常,则必须处理【通过try catch、throws】如IOException、SQLException编译之前IDEA会提示你的异常,不处理的话编译都通过不了!!!非检查异常:在编译的时候不需要被捕获或声明的异常。这些异常通常是由程序的逻辑逻辑错误或运行时引起的,如算术异常、空指针、数组越界、by zero以上IDEA不会提示你,属于运行的时候产生的异常。

2024-05-12 17:42:01 166

原创 写SQL的心得

接着,系统按照 GROUP BY 子句中的指定字段分组,并对每个分组进行计算,生成虚拟的分组结果表。执行顺序 :from > on > where > group by > having > select > distinct > order by > top。4、聚合函数本质:对指定的列进行聚合,如果我们用了group by,我们可以对每个分组应用内聚合函数。在分组内部,聚合函数会自动处理所有重复的行。具体来说,在执行 SELECT 子句时,系统先计算 SELECT 中的列表达式和函数等,然后。

2024-05-11 18:24:52 783 5

原创 SQL常用函数

1、CURDATE() / CURRENT_DATE 返回当前日期2、CURRENT_TIME()/CURTIME() 返回当前时间3、CURRENT_TIMESTAMP 返回当前日期+时间4、DATE()从日期或日期时间表达式中提取日期值5、DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数6、DATE_FORMAT按表达式 f的要求显示日期 d7、UNIX_TIMESTAMP()得到时间戳8、FROM_UNIXTIME()时间戳转日期二、字符串相关函数1、CONCAT(

2024-05-11 12:22:18 429

原创 Spring框架中常见注解

RequestParam 做映射,前端请求的参数映射到控制器Controller的处理方法上的参数上。【当参数需要设置默认值(前端没有发送这个参数)、参数名称不相等(前端与后端的名称不一样)】SpringBootApplication,其实就是同时包含了下面三个注解。@RequestMapping用在类上表示所有该类下方法的父路径。@PathVariable Restful风格, 路径参数。

2024-05-10 18:19:00 306 1

原创 SpringBoot工作原理

EnableAutoConfiguration注解基于@Import注解导入对应的配置选择器,内部就是读取了该项目和该项目引用的Jar包的classpath路径下META—INFO/ spring.factories文件中所配置的类的全类名。当Spring容器启动后,一些配置类、bean对象就自动存入到IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。通过@ComponentScan添加扫描的范围【比较繁琐,需要知道第三方库所在的包名,如果库多了,我还需要一个一个手动去添加】

2024-05-10 18:13:51 1470 2

原创 SpringMVC模式

处理器适配器的作用是将处理器对象(Controller)转换为处理器(Handler)的形式,然后执行其中的方法以处理请求。处理器拦截器与处理器执行链密切相关,处理器执行链中的处理器拦截器可以在请求进入处理器方法之前和处理器方法执行之后实施拦截逻辑。因此,虽然处理器执行链中包含了处理器方法,但最终还需要通过调用处理器对象和处理器适配器来执行具体的处理器方法,从而完成请求的处理过程。,包括了以上所述的元素。处理器执行链将负责依次执行处理器拦截器的前置处理、处理器方法的执行以及处理器拦截器的后置处理。

2024-05-10 11:21:04 1012 1

原创 Java中的线程池

【通过new ThreadPoolExecutor,自己往里面填写七个参数】

2024-05-09 22:55:01 1036

原创 线程合集之线程

run方法:封装了要被线程执行代码,可以被调用多次,如果直接调用run方法,则就是一个普通的方法【通过主线程调用的】,而想通过新线程去调用run方法则需要通过start去调用。start方法:用来启动线程,通过该线程调用run方法执行run方法中定义的逻辑。当线程对象调用了wait方法,则进入等待状态,通过notify方法唤醒,则切换为可运行状态。调用join方法所在的线程将进入计时等待状态,直到调用join方法的线程执行完,wait方法为Object对象的,每个对象都有,而sleep为Thread类的。

2024-05-09 22:43:22 941

原创 Map的实现

二叉树的定义:每个节点最多有两个“叉”,分别是左子节点和右子节点。不要求每个节点都有两个子节点,有的节点只有左子节点,有的节点只有右子节点,并且二叉树的每个节点的左子树和右子树也分别满足二叉树的定义。二叉搜索树(BST,Binary Search Tree)又名二叉查找树,有序二叉树。树中的任意一个节点,它的左子树中每个节点的值都要小于这个节点的值,而右子树节点的值都大于这个节点的值。在极端情况下会退化为链表,左右子树极度不平衡,查找元素的时间复杂度为O(n),正常情况下O(logN)

2024-05-08 09:09:41 245

原创 String、StringBuider、StringBuffer

String 是final修饰的,每次修改值都会产生新的对象,而StringBuffer和StringBuilder是可变类,每次修改值不会产生新的对象。

2024-05-08 08:00:00 153

原创 Innodb实现的索引

②不用B树,因为:对于同一个页单位【页单位大小固定】,如果又存放Key又存放指针,那么存放的指针会很少,导致数值数量一样的情况下,B树会比B+树更深,查询的更慢,而B+树因为在非叶子结点中的页单位里,只存放指针,那么一个页单位可以存放很多个指针(相对B树),那么B+树的层级就会低,查询效率提高。如select id,name from a where name = jack ,因为name是二级索引,通过该索引查到了id,也就是主键值,不需要回表查询,所以叫做覆盖索引,因此尽量不要使用select *。

2024-05-07 17:57:09 786

原创 Redis分布式锁

满足分布式系统下多进程可见并且互斥的锁。多个服务器(tomcat)之间可见的锁。使用场景:同一个数据只能被修改一次,或者秒杀【数据的变化是需要被感知】分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程一起进行,让程序串行执行。分布式锁底层主要用了redis的setnx命令:由于Redis是单线程的,用了setnx命令之后,只有一个客户端对某一个key设置值,在没有过期或删除key的时候其他客户端是不能设置这个key的。

2024-05-07 11:44:28 470

原创 Redis持久化

Redis 可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。当数据库出现故障重启的时候,从磁盘中读取快照文件,恢复数据。开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到 AOF 缓冲区,然后再写入AOF文件中,最终再同步到磁盘中去。当Redis实例出现故障恢复的时候,会从这个文件中再执行一遍命令来恢复数据。如果对数据丢失可以容忍,可以直接使用RDB。

2024-05-07 10:47:41 689

原创 工厂模式+策略模式完成多种登录模式的实现

(简单工厂不属于设计模式,而是一种编程思想【抽象一层出来】)工厂方法模式、抽象工厂模式以上都是为了解耦,如果考虑多个纬度(如需要同时考虑多种电器,多种品牌)则优先考虑抽象工厂。工厂方法模式是给每一个产品增加一个对应的工厂,然后该工厂依赖于抽象工厂,相当于每加一个产品,就多了两个依赖关系。策略模式与工厂方法的区别:工厂方法是基于多态,通过不同的对象参数,去找对应的工厂,进而拿到不同的对象;策略方法也是基于多态,但是是通对行为(方法)的拓展。

2024-05-06 21:48:39 545

原创 SpringBoot自动连接数据库的解决方案

当然,如果本身是想配置数据库,读取不成功的话,可以去检查一下你的target文件中,配置文件和你源代码是否一致【是否读取到了源代码中的配置信息,暴力的做法就是直接拖过去】,问题应该能解决~~~在一次学习设计模式的时候,沿用一个旧的boot项目,想着简单,就把数据库给关掉了,结果报错。我把我的代码的target、缓存全部清空,以及所有的数据库连接都关闭了,依然未能解决问题。在加了这一段注解之后【显示关闭数据库的自动配置】,报错得以解决。

2024-05-06 17:35:26 486 2

原创 Linux常用名命令

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改源代码,这是其他操作系统做不到的,Ubuntu,Centos。

2024-05-06 09:52:14 536 1

原创 == 和 equals()区别,equals()重写问题

Java中任意一个对象都有native的hashCode方法,这个方法在散列集合中会用到,比如HashMap,在添加元素的时候会根据hashCode方法判断元素加入的位置,如果没有相符的hashCode,则HashMap会认为当前元素没有重复出现,直接放过去。如果存在的话,则再通过equals方法去比较是否是相同的对象,如果相同则直接替换,如果不同(说明发生了哈希冲突),则以链表的形式插入。HashCode的值默认是JVM随机数生成的,即两个不同的对象,它们的hashcode值可能相同->

2024-05-05 22:23:34 351

原创 Tomcat的实现

在一台电脑上启动tomcat,tomcat是server,即服务器。服务器只会被实例化一次,tomcat这只猫就是服务器。服务器下包含多个子节点服务,即service,顾名思义就是对外提供服务。服务器通常只有一个服务,默认是卡特琳娜Catalina。核心配置文件是server.xml。

2024-05-05 21:15:19 1772

原创 拦截器的使用

如图,该配置类定义了两个拦截器,并且规定了顺序,数字越小越优先。进入preHandle方法中,如果返回true,则接着进入下一个拦截器中的preHandle方法中去,如果也返回true,则进入Controller的方法中,执行完相应的需求后,先执行后进入的拦截器的afterCompletion方法中(如果有的话),再进入第一个拦截器的afterCompletion方法。其中定义的preHandle和afterCompletion是Spring框架定义的两个拦截器方法。

2024-05-04 00:24:18 194

原创 List的两种实现

数据的时候,即假设我们是通过无参构造生成的ArrayList【数组容量为0,因为空数组,size为0】,然后往里面第一次加数据的时候,会先去调用ensureCapacityInternal方法,将成员变量elementData和minCapacity传进去,因为elementData是通过无参构造器(赋的值),所以此时elementData == defaultCapacity_EMPTY_elmentdata,所以判断,如果size+1比10(默认的)小,则计划容量为10,否则计划至size+1。

2024-05-02 09:43:22 1164 1

原创 MessageQueue

在传统的解决方案中,消费者的确认机制(ack机制)在某种程度上可以确保消息能被消费,但有的时候如:消费端接收到消息之后,宕机了,这个时候MQ没有拿到ack,则会认为消费端没有拿到消息,则会继续重发,这样消费端会重复消费。消息不能重复消费:最保险的机制就是消费者实现幂等性,这样即使重复消费也不会有问题,同时也能解决生产者重复发消息的问题,即使生产者重复发消息,也不会有问题。消息不能多发:这个比较难控制,因为如果是出现了多发,很大原因是生产者自己的原因,如果要避免出现问题,就需要在消费端做控制。

2024-05-02 09:20:13 6

原创 什么是注解

Value() 为特殊属性,如果只有一个value,可以不用写value = XXX,可以直接写XXX,同理如果有多个属性的话,则要写value = XXX,除非其他属性都有默认值default。如解析成员方法上的注解,则先获取成员方法的Method对象,通过Method对象解析上面的注解。和反射命名类似,带s的返回数组,不带s的根据指定的名称来获取指定的目标,这里要抛出检查异常。如解析类上面的注解,则先获取类的Class对象,再通过Class对象解析上面的注解。默认public(可以不写)

2024-05-01 21:23:43 6 1

原创 debug基础操作

蓝色,不会进入jdk源码,直接跳过。红色,进入jdk源码。

2024-05-01 20:55:29 8 2

原创 cookie、session、token

不管是谁,不管是从哪个地方发起的请求。只要你的请求(URL:包括了域名甚至包括了具体的文件【当然也有缺省的情况 ,即默认访问】)是一样的,你拿到的结果【响应】永远是一样的。这样就导致了一些需求无法完成,比如:我想让第一次访问该页面的用户,给他重定向到welcome页面接着是它想访问的页面,而之后继续访问该页面【第二次及以后】,则不会去访问welcome页面。这种根据用户访问次数来做的需求就无法实现。因此我们提出了cookie的概念。

2024-04-30 23:31:30 1100

空空如也

空空如也

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

TA关注的人

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