自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Redis调优-BigKey问题

Redis中的大key,实际上指的是key所关联的value值特别大,比如字符串过大或者是某种数据结构(如hash,list ,set,zset)中存储了过多的元素。详情可参照《阿里Redis开发规范》,一般来将,String类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

2024-05-18 19:07:39 2

原创 Redis总结

计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种数据,Redis提供的数据结构可以相对比较容易地实现这些功能。Redis采用了链式哈希来解决哈希冲突,链式哈希的局限性很明显,随着链表的长度的增加,查询这一位置上的数据的耗时就会增加。

2024-05-17 21:44:11 647 1

原创 Spring,SpringMVC,SpringBoot知识总结

Spring Core 模块提供了 Spring 框架的核心功能,包括依赖注入(Dependency Injection即DI)和控制反转(Inversion of Control即IOC)等。这些功能是 Spring 框架的基础,许多其他 Spring 模块都依赖于 Spring Core 模块。具体可参考https://zhuanlan.zhihu.com/p/448716053。

2024-05-13 12:55:54 988

原创 JVM面试题

1.Serial回收器:串行回收Serial收集器采用复制算法、串行回收和"stop-the-World"机制的方式执行内存回收。Serial收集器作为HotSpot中client模式下的默认新生代垃圾收集器。除了年轻代之外,Serial收集器还提供用于执行老年代垃圾收集的Serial Old收集器。Serial Old收集器同样也采用了串行回收和"Stop the World"机制,只不过内存回收算法使用的是标记-压缩算法。Serial old是运行在Client模式下默认的老年代的垃圾回收器。

2024-05-09 17:53:58 788

原创 缓存击穿、缓存穿透、缓存雪崩

缓存穿透是指访问的数据在缓存中并不存在,请求会不经过缓存直接访问后端存储系统。通常情况下,这些请求对应的数据在后端存储中也不存在,因此无论如何都无法从缓存中获取到数据,每次请求都会直接落到后端存储系统上,导致了不必要的资源浪费和系统压力增加。缓存穿透可能是由于恶意攻击、恶意请求或者缓存系统配置不当等原因导致的。

2024-05-04 21:06:25 1098

原创 类加载子系统

为什么要自定义类加载器?● 隔离加载类● 修改类加载的方式● 扩展加载源● 防止源码泄漏用户自定义类加载器可以从非标准位置(如数据库、网络、特定文件系统等)加载类文件,从而实现动态加载、远程加载等功能。并且还可以在加载类文件时执行一些额外的逻辑或增强功能,比如加密解密、访问控制等来防止源码泄漏。

2024-04-18 16:35:02 565

原创 排序算法总结

优化一:当算法执行过程中数组已经是有序数组了,这是就没有必要继续执行完n-1趟外循环,可以直接结束了。具体实现我们可以通过一个标志,来记录当前一趟外循环,在遍历过程中是否发生交换,如果没有交换说明,数组已经是有序数组,可以跳出循环了。优化二:在某种情况下,如果进行了若干次排序后,后面的若干个数已经是有序的,那么下一趟排序只需要比较前面无序的那部分即可。冒泡排序是经典的入门算法,可以说每个人都会写它,但它也可以优化。在面试中让写冒泡排序,不要简单以为就是让你写两重循环,可能是在考察你对它的优化。

2024-04-15 21:52:05 289

原创 计算机网络常问面试题

HTTP代表“超文本传输”协议,它是一种用于在网络上传输网页、图片和其他资源的协议。当你在浏览器中输入一个网址或者点击一个链接时,你的计算机会向服务器发送一个HTTP请求,然后服务器会回复一个HTTP响应,将网页内容发送给你的浏览器,然后浏览器会把这些内容呈现出来。综上所述,HTTPS是一种更加安全的协议,适用于涉及敏感信息和隐私保护的网站和在线交流。● HTTPS在HTTP的基础上加入了安全性,通过加密数据来保护你的隐私和安全。● HTTP是一种用于在网络上传输数据的协议,但不够安全。

2024-04-14 21:45:46 676

原创 Queue,Deque,Stack的常用方法

这里需注意,对于pop()和push(),大家第一反应肯定是Stack,而Stack里的pop()和push()是对末元素操作,Deque里的pop()和push()是对队首元素操作。Stack继承了Vector,出于各种原因,Vector现在不建议使用了,因此官方文档里推荐用Deque代替Stack,Deque里有push()和pop()方法正是为了取代Stack。add()、offer()、peek()、poll()、remove()与Queue相同。pop():返回并弹出队列首元素。

2024-04-13 21:11:12 158

原创 SpringBoot Cloud Gateway

大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。每个业务都会需要鉴权、限流、权限校验、跨域等逻辑,如果每个业务都各自为战,自己造轮子实现一遍,会很蛋疼,完全可以抽出来,放到一个统一的地方去做。如果业务量比较简单的话,这种方式前期不会有什么问题,但随着业务越来越复杂,比如淘宝、亚马逊打开一。

2024-04-13 21:04:02 1154

原创 MySQL优化

关于MySQL优化,我们可以根据一条SQL的执行流程需要经过哪些环节,通过这些环节思考对应的优化策略。SQL优化中最主要的就是查询优化。其中关联查询太多可能是由于数据库设计不合理,可以根据数据库设计的范式准则,适当增加冗余,减少需要关联的表。

2024-04-06 12:33:19 1014 1

原创 Nacos注册中心

官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。集 注册中心+配置中心+服务管理 平台服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理。

2024-04-03 16:38:55 580

原创 MySQL中的两阶段提交

redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,都指的是写入到cache中。无论是 Redo log 还是 Binlog,在事务执行过程中都会先写入到内存中。只有在特定的刷新条件下(例如事务提交时或者特定的刷新策略)才会将日志数据从内存刷新到磁盘中。

2024-04-01 21:47:09 499

原创 MVCC多版本并发控制

READ COMMITTD 在每一次进行普通SELECT操作前都会生成一个ReadViewREPEATABLE READ只在第一次进行普通SELECT操作之前省生成一个ReadView,之后的查询操作都重复使用这个ReadView就好了。

2024-03-30 10:49:53 836

原创 MySQL锁

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对== 并发操作进行控制== ,因此产生了 锁。同时也为实现MySQL的各个隔离级别提供了保证。也是影响数据库的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。

2024-03-25 18:08:12 574

原创 MySQL事务日志

事务有4中特性:原子性、一致性、隔离性、持久性。那么事务的四种特性到底是基于什么机制实现的呢?有的DBA或许会认为 UNDO 是 REDO 的逆过程,其实不然。

2024-03-24 18:03:56 824

原创 索引下推详解

索引下推(Index Condition Pushdown,简称ICP)是MySQL5.6中的新技术,是一种数据库查询优化技术,它利用了数据库引擎中的索引和过滤条件,将部分过滤工作下推到存储引擎层面进行处理,从而在传统的查询执行过程中,数据库引擎首先根据索引定位到符合过滤条件的数据行,并将这些数据行读取到内存中,然后再进一步进行过滤操作。而索引下推则再这一步骤中尽可能将过滤操作下推到存储引擎层面,避免将不符合条件的数据行读取到内存中,减少了IO次数。

2024-03-24 15:54:52 428

原创 覆盖索引及其优缺点

覆盖索引是指一个索引包含了查询所需的所有数据列(可以不包含主键),从而可以直接通过索引完成查询,而无需访问实际的数据行(即进行回表操作)。这样的索引能够减少查询时需要读取的数据量,减少IO次数,从而提高查询性能和减少系统资源消耗。具体来说,当一个查询语句涉及到的列都包含在某个索引中,并且查询条件、排序方式等操作可以直接利用这个索引完成时,就可以说这个索引是覆盖索引。简单说就是,== 索引列+主键== 包含 ==SELECT 到 FROM之间查询的列 ==。

2024-03-23 21:18:22 242

原创 索引的数据结构

由联合索引的数据结构,我们可以得出之所以使用联合索引时要遵循最左前缀原则,是因为它的物理结构就是按照最左原则进行排序,如果不遵循该原则,可能会发生索引失效或查询结果错误等问题。

2024-03-22 13:00:47 468

原创 什么是索引及其优缺点

索引是数据库中用于提高检索性能的排好序的数据结构。它类似于书籍的目录,通过建立特定的数据结构将某个列或多个列的值与它们在数据库中的行关联起来,以加快查询速度。1.2 索引的分类MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。从功能逻辑上说,索引主要有4种,分别是普通索引、唯一索引、主键索引、全文索引主键索引:用于标识每一条记录,主键索引的值不允许重复且不能为空,并且一个表只能有一个主键索引。

2024-03-21 21:49:46 201

原创 数据库的设计规范

目前关系型数据库里由六种常见范式,按照范式级别,从低到高分别是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。:对于球员表来说,超键就是包括球员编号或者身份证号的任意组合,比如(球员编号)(球员编号,姓名)(身份证号,年龄)等。:在球员表中,主属性是(球员编号)(身份证号),其他的属性(姓名)(年龄)(球队编号)都是非主属性。:就是最小的超键,对于球员表来说,候选键就是(球员编号)或者(身份证号)。

2024-03-21 21:02:12 507

原创 @Qualifier和@Primary

Qualifier 和 @Primary 注解是 Spring Framework 中用于解决依赖注入歧义性的两种方式。

2024-03-20 14:26:28 237

原创 Spring AOP和AspectJ AOP区别

因为使用代理,Spring AOP 只能对 Spring 管理的 Bean 进行 AOP 操作,且只能针对 Spring AOP 支持的切点表达式进行织入。AspectJ AOP: AspectJ AOP 的性能一般比 Spring AOP 略低,因为它对字节码进行了修改和增强,对目标类的影响更大。但是 AspectJ 提供了更强大的功能和更高的灵活性。Spring AOP: Spring AOP 提供了一些常用的 AOP 功能,如前置通知、后置通知、环绕通知等,同时支持基于切点表达式的切入。

2024-03-19 21:48:34 423

原创 数据库事务特性及隔离级别

原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚一致性是指事务执行前后,数据库数据从一个一致的状态转换为另一个一致的状态,确保数据库中的数据完整性、正确性以及业务逻辑的有效性。事务隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰持久性是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障,不应对其有任何影响。

2024-03-19 21:23:38 322

原创 Java锁原理剖析

锁降级就是指持有了写锁的线程,由于它一定独占了读写锁,因此可以让它继续获取读锁,当它同时持有写锁和读锁后,还可以先释放写锁继续持有读锁,这样一个写锁就“降级”为了读锁。锁降级的用途是为了保证数据修改的可见性,在释放写锁的时候,如果另一个线程拿到了写锁,然后再覆盖了当前线程修改的值,这样当前线程修改的值就不可见了,加这个读锁进行锁降级是为了可以读到当前线程修改过的数据。

2024-02-03 17:05:50 745

原创 volatitle关键字

使用锁的方式可以解决共享变量的内存可见性问题,但是使用锁太笨重,因为它会带来线程上下文的切换开销。对于解决内存可见性问题,Java还提供了一种弱形式的同步,也就是使用synchronized关键字。该关键字可以确保对一个变量的更新对其他线程马上可见。当一个变量被声明为volatitle时,线程在写入变量时不会把值缓存在寄存器或其他地方,而是会把值刷新回主内存。当其他线程读取该共享变量时会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值。

2024-01-31 17:44:29 341

原创 并发线程基础

操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进行中的多个线程共享进程的资源。多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域。

2024-01-29 00:48:11 309

原创 synchoronized关键字

synchronized可以修饰静态方法、非静态方法、代码块。

2024-01-28 16:42:38 269

原创 ThreadPoolExecutor

所以有个容易混淆的地方就是,当线程池中的线程超过了和核心线程数时,会将多出来的线程销毁,很多人误以为只会把“非核心线程”销毁掉,现在我们知道了,这两者之间并没有本质上的区别,所以,销毁的时候是随机的,可能是“核心线程”也可能是“非核心线程”。(2)maxPoolSize:最大工作线程数,在corePoolSize已满、队列也满的情况下,扩充线程至此值。在分析线程池的关闭、线程执行任务的过程中可以了解到。注意:线程池构建时不会初始化核心线程,所以只有执行任务时才启动线程,因此是线程池中的线程是懒加载的。

2024-01-27 17:14:03 501

原创 Executors工具类

在《阿里巴巴Java开发手册中》,明确禁止使用Executors创建线程池,并要求开发者直接使用ThreadPoolExecutor或ScheduledThreadPoolExecutor进行创建。这样做是为了强制开发者明确线程池的运行策略,使其对线程池的每个配置参数皆做到心中有数,以规避因使用不当而造成资源耗尽的风险。

2024-01-27 11:29:13 1011

原创 线程的创建

所以当我们在Java程序中调用start()方法时,然后start()方法会去调用start0(),而start0()只有定义没有实现,那么实现是由谁来做的呢?虽然这种方式也获取到了线程执行完毕的结果, 但本质上并不是作为返回值的, 而是两个线程修改了同一个变量, 这个变量是 result 类的成员属性, 并且实现的过程比较复杂。run()源码并没有实现多线程,如果是直接调用run(),则是顺序执行的,不是多线程。启动线程是调用start方法,这样会创建一个新的线程,并执行线程的任务。

2024-01-27 00:10:55 1890

原创 Spring中声明式事务和编程式事务

在某些高并发场景下,可以使用编程式事务仅针对需要操作的数据进行锁定,而不是对整个业务逻辑加事务。在实际场景中,可以根据需求综合考虑使用声明式事务和编程式事务的优势来进行选择。

2024-01-26 19:24:22 347

原创 Spring源码分析:refresh()

refresh()中共有13个方法,分别为。

2024-01-25 00:52:20 839

原创 接口与继承

不能和final一块使用:final修饰成员方法:方法不能被重写,但是abstract修饰的方法,强制类完成的事情!不能和private一块使用: private只能在类中访问!被static修饰的方法直接使用类名调用,---->但是抽象方法又需要让子类重写(静态方法算不上方法重写)

2024-01-23 11:48:07 830

原创 SpringBoot源码分析:prepareEnviroment()

定义了子类需要实现的类, 并通过模板方法, 在构造函数中, 调用子类的customizePropertySources()方法, 将环境配置全部放入this.propertySources中, AbstractEnvironment实现了getActiveProfiles和setActiveProfiles方法, 分别用来获取和设备spring.profiles.active属性的配置。

2024-01-22 16:30:22 1059

原创 SpringBoot启动流程

Springboot启动时,第一件重要事件就是构造SpringApplication对象,并主要完成如下事情。设置源。实际就是设置Spring容器启动时依赖的初始配置类,也就是Springboot中的启动类;设置WEB应用程序类型。例如可以是SERVLET,REACTIVE等;加载并设置Bootstrapper,ApplicationContextInitializer和ApplicationListener;

2024-01-22 00:16:10 1087

原创 SpringBoot自动装配原理及分析

在使用SpringBoot的时候,会自动将Bean装配到IOC容器中。例如我们在使用Redis数据库的时候,会引入依赖spring-boot-starter-data-redis。在引入这个依赖后,服务初始化的时候,会将操作Redis需要的组件注入到Ioc容器中进行后续使用。获取到组件(spring-boot-starter-data-redis)META-INF文件夹下的spring.factories文件spring.factories文件中列出需要注入Ioc容器的类。

2024-01-20 00:15:41 1196

原创 Spring AOP

在Spring中,AOP的使用比较简单,通过@Aspect注解声明一个切面,通过@Pointcut定义需要拦截的方法,然后用@Before、@AfterReturning、@Around分别实现前置通知、后置通知和环绕通知要执行的方法。Cglib动态代理和JDK动态代理的区别:JDK只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则只能通过CGLib创建动态代理来实现。Spring AOP有5种通知类型,分别为前置通知、后置通知、成功通知、异常通知、环绕通知。

2024-01-17 19:29:13 417

原创 Spring MVC的原理

HandlerMapping在这个SpringMVC体系结构中有着举足轻重的地位,充当着url和Controller之间映射关系配置的角色。HandlerMapping是接口,Spring MVC提供了一系列HandlerMapping的实现,根据一定的规则选择controller。如果当前的HandlerMappign实现中没有能够满足你所需要的规则是,可以通过实现HandlerMapping接口进行扩展。它主要有三部分组成:HandlerMapping映射注册、根据url获取对应的处理器、拦截器注册。

2024-01-17 19:24:12 962

原创 Spring IOC原理

Spring通过配置文件或者注解来描述Bean和Bean之间的依赖关系,利用Java的反射功能实例化Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存管理、Bean生命周期管理、Bean实例代理、事件发布和资源装载等高级服务。

2024-01-15 19:35:23 423

空空如也

空空如也

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

TA关注的人

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