自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringMVC 工作流程

1)用户发送请求至前端控制器 DispatcherServlet。2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。3)处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。5)HandlerAdapter 经过适配调用具体的处理器(Controller,也叫

2022-05-19 19:25:08 250

原创 mysql聚簇和非聚簇索引的区别

都是B+树的数据结构聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是 相邻地存放在磁盘上的非聚簇索引:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类似一本树的目录,比如我们要找第三章第一节,那我们先在这个 目录里面找,找到对应的页码后再去对应的页码看文章。优势:1、查询通过聚簇索引可以直接获取数据,相比

2022-05-19 19:24:51 1879

原创 索引设计的原则?

查询更快、占用空间更小适合索引的列是出现在where子句中的列,或者连接子句中指定的列基数较小的表,索引效果较差,没有必要在此列建立索引使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间,如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配。不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。定义有外键的数据列一定要

2022-05-19 19:24:35 284

原创 hashmap浅谈

1.hashmap为啥用尾插法?答:为了安全,防止环化。可能出现环形链表,去取值时就可能无限循环。

2022-05-19 19:23:45 142

原创 mysql索引的数据结构,各自优劣

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。B+树:B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基

2022-05-19 19:23:17 310

转载 Mysql索引失效的场景

链接: https://blog.youkuaiyun.com/qq_63815371/article/details/124337932

2022-05-19 19:22:35 104

转载 使用@Transactional出现了长事务

@Transactional导致的生产事故事故原因分析如何避免长事务?小结在Spring中进行事务管理非常简单,只需要在方法上加上注解@Transactional,Spring就可以自动帮我们进行事务的开启、提交、回滚操作。甚至很多人心里已经将Spring事务与@Transactional划上了等号,只要有数据库相关操作就直接给方法加上@Transactional注解。@Transactional导致的生产事故19年在公司做了一个内部报销的项目,有这样一个业务逻辑:1、员工加班打车可以通过.

2022-04-18 22:14:23 1575 1

原创 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 423

原创 设计模式之责任链模式

1.介绍责任链模式的核心是解决一组服务中的先后执行关系,就像出差借款需要审批的,需要分别找部门领导、分管领导、财务部门领导等一级一级往上审批。2.单代码示例背景:模拟“618大促销”期间,根据时间的不同,有时需要一级审批,有时需要一级和二级审批,有时需要一级审批、二级审批和三级审批。工程结构:AuthLink代码:public abstract class AuthLink { protected Logger logger = LoggerFactory.getLogger(Aut

2022-04-13 21:49:15 247

原创 设计模式之工厂模式

1.介绍工厂模式也叫简单工厂模式。它提供了按需创建模式的最佳方式。同时,这种创建方式不会对外暴露创建细节,并且会通过一个统一的接口创建对象。它的主要意图:定义一个创建对象的接口,让其子类自己决定将哪一个工厂类实例化,工厂模式使创建过程延迟到子类中进行。举例:某动力机械厂可以生产织布机和缝纫机。2.实操背景:某商店,用户可通过打卡、留言等兑换积分,再通过积分兑换商品,从而勾成一个生态闭环。现有如下接口:(1)优惠券:CouponResult sendCoupon(String uId, Stri

2022-04-13 00:22:00 233

原创 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 216

原创 mysql主从同步原理

mysql主从同步的过程:Mysql的主从复制中主要有三个线程: master(binlog dump thread)、slave(I/O thread 、SQLthread) ,Master一条线程和Slave中的两条线程。主节点 binlog,主从复制的基础是主库记录数据库的所有变更记录到 binlog。binlog 是数据库服务器启动的那一刻起,保存所有修改数据库结构或内容的一个文件。主节点 log dump 线程,当 binlog 有变动时,log dump 线程读取其内容并发送给从节点

2022-04-12 23:34:02 878

原创 Redis线程模型、单线程快的原因

Redis基于Reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器 file event handler。这个文件事件处理器,它是单线程的,所以 Redis 才叫做单线程的模型,它采用IO多路复用机制来同时监听多个Socket,根据Socket上的事件类型来选择对应的事件处理器来处理这个事件。可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了 Redis 内部的线程模型的简单性。文件事件处理器的结构包含4个部分:多个Socket、IO多路复用程序、文件事件分派

2022-04-12 23:33:45 266

原创 负载均衡算法、类型

1、轮询法将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。2、随机法通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。3、源地址哈希法源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是

2022-04-12 23:33:13 238

原创 (Redis)哨兵模式实现原理?(2.8 版本或更高才有)

1.三个定时监控任务:1.1 每隔 10s,每个 S 节点(哨兵节点)会向主节点和从节点发送 info 命令获取最新的拓扑结构1.2 每隔 2s,每个 S 节点会向某频道上发送该 S 节点对于主节点的判断以及当前 Sl 节点的信息,同时每个 Sentinel 节点也会订阅该频道,来了解其他 S 节点以及它们对主节点的判断(做客观下线依据)1.3 每隔 1s,每个 S 节点会向主节点、从节点、其余 S 节点发送一条 ping 命令做一次心跳检测(心跳检测机制),来确认这些节点当前是否可达2.主客观下线

2022-04-12 21:55:01 434

原创 (Redis)主从复制模式下,主挂了怎么办?

redis 提供了哨兵模式(高可用)何谓哨兵模式?就是通过哨兵节点进行自主监控主从节点以及其他哨兵节点,发现主节点故障时自主进行故障转移。

2022-04-12 21:53:05 1467

原创 redis 能否将数据持久化,如何实现?

答:能,将内存中的数据异步写入硬盘中,两种方式:RDB(默认)和 AOFRDB 持久化原理:通过 bgsave 命令触发,然后父进程执行 fork 操作创建子进程,子进程创建 RDB 文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换(定时一次性将所有数据进行快照生成一份副本存储在硬盘中)优点:是一个紧凑压缩的二进制文件,Redis 加载 RDB 恢复数据远远快于 AOF的方式。缺点:由于每次生成 RDB 开销较大,非实时持久化,AOF 持久化原理:开启后,Redis 每执行一个

2022-04-12 21:51:53 685

原创 为什么 redis 是单线程的都那么快?

1.数据存于内存2.用了多路复用 I/O3.单线程

2022-04-12 21:48:23 232

转载 redis各类型的使用场景

redis 的数据结构: String(字符串)、Hash(哈希)、List(列表)、Set(集合)、zset(有序集合)一、String(字符串)简介String 类型是 Redis 中最基本、最常用的数据类型,甚至被很多玩家当成 Redis 唯一的数据类型去使用。String 类型在 Redis 中是二进制安全(binary safe)的,这意味着 String 值关心二进制的字符串,不关心具体格式,你可以用它存储 json 格式或 JPEG 图片格式的字符串。2、内部编码如果存储数字的话

2022-04-12 21:47:43 416

转载 SpringBoot是如何实现自动配置的?

SpringBoot启动类:@SpringBootApplicationpublic class CommunityApplication { public static void main(String[] args) { SpringApplication.run(CommunityApplication.class, args); }}进入@SpringBootApplication源码中:再点进去,AutoConfigurationImportSelector 类的作用就

2022-04-12 21:26:21 1354

原创 双亲委托模型

(1)如果一个类加载器收到了类加载请求,它并不会自己先加载,而是把这个请求委托给父类的加载器去执行(2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的引导类加载器;(3)如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制(4)父类加载器一层一层往下分配任务,如果子类加载器能加载,则加载此类,如果将加载任务分配至系统类加载器也无法加载此类,则抛出异常。双亲委派模型的好处:Java核心AP

2022-04-09 20:54:52 339

原创 springcloud核心组件及其作用

Eureka:服务注册与发现注册:每个服务都向Eureka登记自己提供服务的元数据,包括服务的ip地址、端口号、版本号、通信协议等。eureka将各个服务维护在了一个服务清单中(双层Map,第一层key是服务名,第二层key是实例名,value是服务地址加端口)。同时对服务维持心跳,剔除不可用的服务,eureka集群各节点相互注册每个实例中都有一样的服务清单。发现:eureka注册的服务之间调用不需要指定服务地址,而是通过服务名向注册中心咨询,并获取所有服务实例清单(缓存到本地),然后实现服务.

2022-04-09 20:48:27 674

原创 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 2247

原创 简述RabbitMQ的架构设计

Broker:rabbitmq的服务节点Queue:队列,是RabbitMQ的内部对象,用于存储消息。RabbitMQ中消息只能存储在队列中。生产者投递消息到队列,消费者从队列中获取消息并消费。多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(轮询)给多个消费者进行消费,而不是每个消费者都收到所有的消息进行消费。(注意:RabbitMQ不支持队列层面的广播消费,如果需要广播消费,可以采用一个交换器通过路由Key绑定多个队列,由多个消费者来订阅这些队列的方式。Exchange:交换器。.

2022-04-09 20:21:43 2188

原创 Redis的过期键的删除策略

Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理.惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化 地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而 不会被清除,占用大量内存。定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是一个

2022-04-09 20:12:11 104

原创 【Redis】RDB 和 AOF 机制

RDB:Redis DataBase在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。优点:1、整个Redis数据库将只包含一个文件 dump.rdb,方便持久化。2、容灾性好,方便备份。3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能4.相对于数据集大时,比

2022-04-09 20:10:22 170

原创 简述mysql中索引类型及对数据库的性能的影响

普通索引:允许被索引的数据列包含重复的值。唯一索引:可以保证数据记录的唯一性。主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。联合索引:索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。全文索引:通过建立 倒排索引 ,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过ALTER TABLE table_name ADD FULLTEXT (col

2022-04-09 20:07:56 1097

原创 事务的基本特性和隔离级别

事务基本特性ACID分别是:原子性指的是一个事务中的操作要么全部成功,要么全部失败。一致性指的是数据库总是从一个一致性的状态转换到另外一个一致性的状态。比如A转账给B100块钱,假设A只有90块,支付之前我们数据库里的数据都是符合约束的,但是如果事务执行成功了,我们的数据库数据就破坏约束了,因此事务不能成功,这里我们说事务提供了一致性的保证隔离性指的是一个事务的修改在最终提交前,对其他事务是不可见的。持久性指的是一旦事务提交,所做的修改就会永久保存到数据库中。隔离性有4个隔离级别,分别是:r

2022-04-09 20:00:04 140

原创 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 4265 1

原创 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

在业务系统中,除了使用主键进行的查询,其他的都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们。慢查询的优化首先要搞明白慢的原因是什么?是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?所以优化也是针对这三个方向来的,首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽

2022-04-09 17:15:50 549

原创 Thread、Runable的区别

Thread和Runnable的实质是继承关系,没有可比性。无论使用Runnable还是Thread,都会newThread,然后执行run方法。用法上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现runnable。...

2022-04-08 23:55:16 250

原创 如何理解 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 2465

原创 hashCode与equals

hashCode介绍:hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数(实际上就是索引)。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,Java中的任何类都包含有hashCode() 函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)为什么要有hashCode:以“HashSet如何检查重复”为例

2022-04-08 23:54:47 62

原创 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 526

原创 线程池中阻塞队列的作用?为什么是先添加列队而不是先 创建最大线程?

1、一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度 ,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程(当没有任务时,阻塞核心线程)进入wait状态,释放cpu资源。阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活、不至于一直占用cpu资源。2、在创建新线程的时候,是要获取全局锁的,这个时候其它的就得阻塞,影响了整体效率。

2022-04-07 20:39:45 1145

原创 线程池中线程复用原理

线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式只使

2022-04-07 20:24:27 796

原创 对守护线程的理解

守护线程:为所有非守护线程提供服务的线程;任何一个守护线程都是整个JVM中所有非守护线程(用户线程 )的保姆;守护线程类似于整个进程的一个默默无闻的小喽喽;它的生死无关重要,它却依赖整个进程而运行;哪天其他线程结束了,没有要执行的了,程序就结束了,理都没理守护线程,就把它中断了;注意: 由于守护线程的终止是自身无法控制的,因此千万不要把IO、File等重要操作逻辑分配给它;因为它不靠谱;守护线程的作用是什么?举例, GC垃圾回收线程:就是一个经典的守护线程,当我们的程序中不再有任何运行的Threa

2022-04-07 20:18:40 294

原创 对线程安全的理解

不是线程安全、应该是内存安全,堆是共享内存,可以被所有线程访问当多个线程访问一个对象(对象在堆中)时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的堆是进程和线程共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了 要还给操作系统,要不然就是内存泄漏。在Java中,堆是Java虚拟机所管理的内存中最大的一块,是所有线程

2022-04-07 20:08:53 235

原创 ==和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 88

原创 索引的基本原理 & 索引设计的原则

索引的基本原理索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。索引的原理:就是把无序的数据变成有序的查询.把创建了索引的列的内容进行排序对排序结果生成倒排表在倒排表内容上拼上数据地址链在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据索引设计的原则查询更快、占用空间更小适合索引的列是出现在where子句中的列,或者连接子句中指定的列基数较小的表(就是表的数据比较少,因为会单独维护一个索引表),索引效果较差,没有必要在此列建立索引

2022-04-07 15:35:33 2827

空空如也

空空如也

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

TA关注的人

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