![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
猿始大猩猩之日常记录
猿始大猩猩
这个作者很懒,什么都没留下…
展开
-
SpringMVC 工作流程
1)用户发送请求至前端控制器 DispatcherServlet。2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。3)处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。5)HandlerAdapter 经过适配调用具体的处理器(Controller,也叫原创 2022-05-19 19:25:08 · 189 阅读 · 0 评论 -
Dubbo 和 Dubbox 之间的区别及关系?
Dubbo 和 Dubbox 之间的区别答:Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。而 Spring Cloud 诞生于微服务架构时代,考虑的是微服务治理的方方面面,另外由于依托了 Spirng、Spirng Boot 的优势之上,两个框架在开始目标就不一致,Dubbo定位服务治理、Spirng Cloud 是一个生态。Dubbo 和 Spring Cloud 的关系最大的区别:Dubbo 底层是使用 Netty 这样的 NIO 框架,是基原创 2022-04-16 17:36:12 · 371 阅读 · 0 评论 -
mysql索引的数据结构,各自优劣
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。B+树:B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基原创 2022-05-19 19:23:17 · 275 阅读 · 0 评论 -
ACID靠什么保证的?
A原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sqlC一致性由其他三大特性保证、程序代码要保证业务上的一致性隔离性由MVCC来保证D持久性由内存+redo log来保证,mysql修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log恢复InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态。 如果前面 prepare 成功,binlog写盘,再继续将事务日志持久化到 binlog,如果持久化原创 2022-04-12 23:34:27 · 171 阅读 · 0 评论 -
负载均衡算法、类型
1、轮询法将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。2、随机法通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。3、源地址哈希法源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是原创 2022-04-12 23:33:13 · 178 阅读 · 0 评论 -
SpringBoot是如何实现自动配置的?
SpringBoot启动类:@SpringBootApplicationpublic class CommunityApplication { public static void main(String[] args) { SpringApplication.run(CommunityApplication.class, args); }}进入@SpringBootApplication源码中:再点进去,AutoConfigurationImportSelector 类的作用就转载 2022-04-12 21:26:21 · 1306 阅读 · 0 评论 -
hashmap浅谈
1.hashmap为啥用尾插法?答:为了安全,防止环化。可能出现环形链表,去取值时就可能无限循环。原创 2022-05-19 19:23:45 · 101 阅读 · 0 评论 -
双亲委托模型
(1)如果一个类加载器收到了类加载请求,它并不会自己先加载,而是把这个请求委托给父类的加载器去执行(2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的引导类加载器;(3)如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制(4)父类加载器一层一层往下分配任务,如果子类加载器能加载,则加载此类,如果将加载任务分配至系统类加载器也无法加载此类,则抛出异常。双亲委派模型的好处:Java核心AP原创 2022-04-09 20:54:52 · 305 阅读 · 0 评论 -
springcloud核心组件及其作用
Eureka:服务注册与发现注册:每个服务都向Eureka登记自己提供服务的元数据,包括服务的ip地址、端口号、版本号、通信协议等。eureka将各个服务维护在了一个服务清单中(双层Map,第一层key是服务名,第二层key是实例名,value是服务地址加端口)。同时对服务维持心跳,剔除不可用的服务,eureka集群各节点相互注册每个实例中都有一样的服务清单。发现:eureka注册的服务之间调用不需要指定服务地址,而是通过服务名向注册中心咨询,并获取所有服务实例清单(缓存到本地),然后实现服务.原创 2022-04-09 20:48:27 · 616 阅读 · 0 评论 -
Spring Cloud和Dubbo的区别
底层协议:springcloud基于http协议(一般是Rest风格的API),dubbo基于Tcp协议 ,决定了dubbo的性能相对会比较好注册中心:Spring Cloud 使用的 eureka ,dubbo推荐使用zookeeper模型定义:dubbo 将一个接口定义为一个服务,SpringCloud 则是将一个应用定义为一个服务SpringCloud是一个生态,而Dubbo是SpringCloud生态中关于服务调用一种解决方案(服务治理)...原创 2022-04-09 20:41:13 · 2209 阅读 · 0 评论 -
简述RabbitMQ的架构设计
Broker:rabbitmq的服务节点Queue:队列,是RabbitMQ的内部对象,用于存储消息。RabbitMQ中消息只能存储在队列中。生产者投递消息到队列,消费者从队列中获取消息并消费。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(轮询)给多个消费者进行消费,而不是每个消费者都收到所有的消息进行消费。(注意:RabbitMQ不支持队列层面的广播消费,如果需要广播消费,可以采用一个交换器通过路由Key绑定多个队列,由多个消费者来订阅这些队列的方式。Exchange:交换器。.原创 2022-04-09 20:21:43 · 2109 阅读 · 0 评论 -
Redis的过期键的删除策略
Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理.惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化 地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而 不会被清除,占用大量内存。定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是一个原创 2022-04-09 20:12:11 · 70 阅读 · 0 评论 -
【Redis】RDB 和 AOF 机制
RDB:Redis DataBase在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。优点:1、整个Redis数据库将只包含一个文件 dump.rdb,方便持久化。2、容灾性好,方便备份。3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能4.相对于数据集大时,比原创 2022-04-09 20:10:22 · 147 阅读 · 0 评论 -
简述mysql中索引类型及对数据库的性能的影响
普通索引:允许被索引的数据列包含重复的值。唯一索引:可以保证数据记录的唯一性。主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。全文索引:通过建立 倒排索引 ,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_name ADD FULLTEXT (col原创 2022-04-09 20:07:56 · 961 阅读 · 0 评论 -
事务的基本特性和隔离级别
事务基本特性ACID分别是:原子性指的是一个事务中的操作要么全部成功,要么全部失败。一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,假设A只有90块,支付之前我们数据库里的数据都是符合约束的,但是如果事务执行成功了,我们的数据库数据就破坏约束了,因此事务不能成功,这里我们说事务提供了一致性的保证隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。隔离性有4个隔离级别,分别是:r原创 2022-04-09 20:00:04 · 118 阅读 · 0 评论 -
mysql执行计划怎么看
执行计划就是sql的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数EXPLAIN SELECT * from A where X=? and Y=?1. id :是一个有顺序的编号,是查询的顺序号,有几个 select 就显示几行。id的顺序是按 select 出现的顺序增长的。id列的值越大执行优先级越高越先执行,id列的值相同则从上往下执行,id列的值为NULL最后执行。selectType 表示查询中每个select子句的类型SIMPLE: 表示此查询不包含 UNION原创 2022-04-09 19:05:27 · 4054 阅读 · 1 评论 -
关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
在业务系统中,除了使用主键进行的查询,其他的都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们。慢查询的优化首先要搞明白慢的原因是什么?是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?所以优化也是针对这三个方向来的,首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽原创 2022-04-09 17:15:50 · 442 阅读 · 0 评论 -
Thread、Runable的区别
Thread和Runnable的实质是继承关系,没有可比性。无论使用Runnable还是Thread,都会newThread,然后执行run方法。用法上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现runnable。...原创 2022-04-08 23:55:16 · 217 阅读 · 0 评论 -
hashCode与equals
hashCode介绍:hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数(实际上就是索引)。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,Java中的任何类都包含有hashCode() 函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)为什么要有hashCode:以“HashSet如何检查重复”为例原创 2022-04-08 23:54:47 · 40 阅读 · 0 评论 -
如何理解 Spring Boot 中的 Starter
使用spring + springmvc使用,如果需要引入mybatis等框架,需要到xml中定义mybatis需要的beanstarter就是定义一个starter的jar包,写一个@Configuration配置类、将这些bean定义在里面,然后在starter包的META-INF/spring.factories中写入该配置类,springboot会按照约定来加载该配置类开发人员只需要将相应的starter包依赖进应用,进行相应的属性配置(使用默认配置时,不需要配置),就可以直接进行代码开发,原创 2022-04-08 23:55:01 · 2428 阅读 · 0 评论 -
Spring Boot 自动配置原理?
@Import + @Configuration + Spring spi自动配置类由各个starter提供,使用@Configuration + @Bean定义配置类,放METAINF/spring.factories下使用Spring spi扫描META-INF/spring.factories下的配置类使用@Import导入自动配置类原创 2022-04-07 21:21:46 · 503 阅读 · 0 评论 -
线程池中阻塞队列的作用?为什么是先添加列队而不是先 创建最大线程?
1、一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度 ,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程(当没有任务时,阻塞核心线程)进入wait状态,释放cpu资源。阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活、不至于一直占用cpu资源。2、在创建新线程的时候,是要获取全局锁的,这个时候其它的就得阻塞,影响了整体效率。原创 2022-04-07 20:39:45 · 1035 阅读 · 0 评论 -
线程池中线程复用原理
线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式只使原创 2022-04-07 20:24:27 · 770 阅读 · 0 评论 -
对守护线程的理解
守护线程:为所有非守护线程提供服务的线程;任何一个守护线程都是整个JVM中所有非守护线程(用户线程 )的保姆;守护线程类似于整个进程的一个默默无闻的小喽喽;它的生死无关重要,它却依赖整个进程而运行;哪天其他线程结束了,没有要执行的了,程序就结束了,理都没理守护线程,就把它中断了;注意: 由于守护线程的终止是自身无法控制的,因此千万不要把IO、File等重要操作逻辑分配给它;因为它不靠谱;守护线程的作用是什么?举例, GC垃圾回收线程:就是一个经典的守护线程,当我们的程序中不再有任何运行的Threa原创 2022-04-07 20:18:40 · 272 阅读 · 0 评论 -
对线程安全的理解
不是线程安全、应该是内存安全,堆是共享内存,可以被所有线程访问当多个线程访问一个对象(对象在堆中)时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的堆是进程和线程共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了 要还给操作系统,要不然就是内存泄漏。在Java中,堆是Java虚拟机所管理的内存中最大的一块,是所有线程原创 2022-04-07 20:08:53 · 205 阅读 · 0 评论 -
==和equals比较
==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址equals:object中默认也是采用==比较,通常会重写。Object:public boolean equals(Object obj) {return (this == obj);}String类中被复写的equals()方法其实是比较两个字符串的内容:public class StringDemo { public static void main(String args[]) {String str1原创 2022-04-07 19:59:44 · 67 阅读 · 0 评论 -
索引的基本原理 & 索引设计的原则
索引的基本原理索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。索引的原理:就是把无序的数据变成有序的查询.把创建了索引的列的内容进行排序对排序结果生成倒排表在倒排表内容上拼上数据地址链在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据索引设计的原则查询更快、占用空间更小适合索引的列是出现在where子句中的列,或者连接子句中指定的列基数较小的表(就是表的数据比较少,因为会单独维护一个索引表),索引效果较差,没有必要在此列建立索引原创 2022-04-07 15:35:33 · 2718 阅读 · 0 评论 -
简述线程池处理流程
转载 2022-04-07 15:35:02 · 303 阅读 · 0 评论 -
为什么用线程池?解释下线程池参数?
1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行。3、提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。corePoolSize 代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会 消除,而是一种常驻线程maxinumPoolSize 代表的是最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创建原创 2022-04-07 15:34:25 · 275 阅读 · 0 评论 -
Dubbo 的整体架构设计及分层
五个角色:注册中心registry:服务注册与发现服务提供者provider:暴露服务服务消费者consumer:调用远程服务监控中心monitor:统计服务的调用次数和调用时间容器container:服务允许容器调用流程:1:container容器负责启动、加载、运行provider2:provider在启动时,向regisitry中心注册自己提供的服务3:consumer在启动时,向regisitry中心订阅自己所需的服务4:regisitry返回服务提供者列表给consumer,如原创 2022-04-07 15:35:16 · 405 阅读 · 0 评论 -
ThreadLocal内存泄露原因,如何避免
内存泄露为程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。强引用:使用最普遍的引用(new),一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。如果想取消强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。弱引原创 2022-04-06 22:55:35 · 8184 阅读 · 2 评论 -
ThreadLocal的原理和使用场景
每一个 Thread 对象均含有一个 ThreadLocalMap 类型的成员变量 threadLocals ,它存储本线程中所有ThreadLocal对象及其对应的值。ThreadLocalMap 由一个个 Entry 对象构成Entry 继承自 WeakReference<ThreadLocal<?>> ,一个 Entry 由 ThreadLocal 对象和 Object 构成(Object就是我们要存的值)。由此可见, Entry 的key是ThreadLocal对象,并原创 2022-04-06 21:56:01 · 6616 阅读 · 0 评论 -
sleep()、wait()、join()、yield()的区别
1.锁池所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待cpu资源分配。2.等待池当我们调用wait()方法后,线程会放到等待池当中,等待池的线程是不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池的线程才会开始去竞争锁,notify()是随机从等待池选出一个线程放到锁池,而notifyAll()是将等待池的所有线原创 2022-04-06 21:40:26 · 845 阅读 · 0 评论 -
线程的生命周期?线程有几种状态
1.线程通常有五种状态:创建,就绪,运行、阻塞和死亡状态。2.阻塞的情况又分为三种:(1)、等待阻塞:运行的线程执行wait方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify或notifyAll方法才能被唤醒,wait是object类的方法(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。(3)、其他阻塞:运行的线程执行sleep或join方法,或者发原创 2022-04-06 21:21:52 · 5010 阅读 · 0 评论 -
ConcurrentHashMap原理,jdk7和jdk8版本的区别
jdk7(分段锁):数据结构:ReentrantLock+Segment+HashEntry,一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构元素查询:二次hash,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部锁:Segment分段锁 Segment继承了ReentrantLock,锁定操作的Segment,其他的Segment不受影响,并发度为segment个数,可以通过构造函数指定,数组扩容不会影响其他的segment。原创 2022-04-06 21:20:09 · 980 阅读 · 0 评论 -
HashMap和HashTable有什么区别?其底层实现是什么?
区别 :(1)HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;(2)HashMap允许key和value为null,而HashTable不允许2.底层实现:数组+链表实现jdk8开始链表高度到8、数组长度超过64,链表转变为红黑树,元素以内部类Node节点存在。(Node节点其实是链表的节点)计算key的hash值,二次hash然后对数组长度取模,对应到数组下标,如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组,如果产生ha原创 2022-04-06 21:07:43 · 976 阅读 · 0 评论 -
ArrayList和LinkedList区别
ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能、甚至超过linkedList(需要创建大量的node对象)LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询:需要逐一遍历。遍历LinkedList必须使用iterator不能使用for循原创 2022-04-06 20:51:31 · 374 阅读 · 0 评论 -
List和Set的区别
List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素Set:无序,不可重复,最多允许有一个Null元素对象,取元素时只能用Iterator接口取得所有元 素,在逐一遍历各个元素待完善。。。...原创 2022-04-06 20:33:41 · 40 阅读 · 0 评论 -
GC如何判断对象可以被回收
引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计 数为0时可以回收,(其他编程语言采用)可达性分析法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。(java采用)引用计数法,可能会出现A 引用了 B,B 又引用了 A,这时候就算他们都不再使用了,但因为相互 引用 计数器=1 永远无法被回收。【java不采用的原因】GC Roots的.原创 2022-04-06 16:05:36 · 1285 阅读 · 0 评论 -
Java中的异常体系
Java中的所有异常都来自顶级父类Throwable。Throwable下有两个子类Exception和Error。Error是程序无法处理的错误,一旦出现这个错误,则程序将被迫停止运行。如:OOMException不会导致程序停止,又分为两个部分RunTimeException运行时异常和CheckedException检查异常。RunTimeException常常发生在程序运行过程中,会导致程序当前线程执行失败。CheckedException常常发生在程序编译过程中,会导致程序编译不通过。原创 2022-04-06 15:43:35 · 234 阅读 · 0 评论