自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redis到底是单线程还是多线程?为什么是单线程还这么快?

先来处理题目第一个问题,这个问题问得非常不严谨,针对不同的问法有两种答法。先告诉你答案。1. redis的核心业务,也就是命令处理部分是多线程还是单线程?答案: 单线程。2. 整个redis的运行是多线程还是单线程?答案: 多线程。

2024-12-13 17:04:30 249 1

原创 redis持久化机制

我们知道redis的数据是在内存中的,这也是redis为什么速度这么快的原因之一,但是内存中的数据在电脑重启后就会消失,可是我们使用redis的时候并没有因为电脑重启而导致数据消失,这就证明了redis的底层肯定是把数据从内存同步到了磁盘,等开机的时候会从磁盘再同步到内存,今天我们就来聊聊redis持久化数据的方式。

2024-12-12 11:16:17 610

原创 如何从网关把token传到各个服务,服务又如何处理token?

两种方式,但是一般采用GlobalFilter来做校验,网关里面存在一系列的过滤器,先执行下图的pre,校验都通过后再发给微服务,最后由post执行,本质上是责任链模式。而我们的GlobalFilter需要放在下图最后一个过滤器Nettty...前面。学过责任链的朋友知道,我们可以让方法继承ordered接口来控制责任链上过滤器的执行顺序,接着往下看代码。GlobalFilter代码。

2024-12-10 11:13:42 614

原创 解决Gateway报错Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway

这是因为 Spring Cloud Gateway 的项目中不能使用 Spring MVC 的依赖,一般是你通过依赖其它模块而间接引用了该 Spring MVC 的依赖。 也就是说,在 Spring Cloud Gateway 的项目中不能使用如下依赖。  如果不小心引用了,则需要排除 Spring MVC 依赖。

2024-12-09 15:29:51 1103

原创 RocketMQ与springboot3的不兼容解决办法

原因:Springboot-3.0已经放弃了spring.plants。springboot3在使用rocketmq时会报下面错误。所取代,添加这个文件是为了兼容。再次启动项目,问题得以解决。在文件里面写上如下代码。

2024-12-04 10:54:11 475

原创 mybats-plus分页高效封装

一般来说,我们每次的查询结果都要进行这么一个转换,因为查询结果里面的属性太多了,不适合都给前端,下图是查询结果Page的源码,可以看见里面除了我们需要的records、total、pages(pages在IPage里面),还有很多其他属性,我们无需传给前端的,所以上述PageDto类封装了of方法进行转换,用过 BeanUtil.copyProperties()方法的就知道这是什么意思了,没用过也没关系,总而言之就是给数据瘦身,只返回部分查询结果给前端。// records是查询结果。

2024-12-04 10:37:11 636

原创 spring-bean的循环依赖

阅读本篇文章之前,你应该知道一个bean被创建到单例池的流程。例如下图,类A引用类B,类B又引用类A,这种就叫做循环依赖。带你走一遍这种依赖关系的注入流程,了解一下为什么会死循环。首先实例化A,初始化A的时候发现A里面有属性B,此时去容器看B是否存在,发现并不存在,就去实例化B,同样的流程,B里面要注入A,发现A不存在,就去实例化A,这样就造成了死循环。

2024-11-27 18:50:15 517

原创 Spring事务失效的几种原因

先来看看异常继承树这里把异常分为三类,Error,RuntimeException、CheckedException,其中CheckedException是受检异常,受检异常是由编译器强制执行的,必须捕获,也就是大概率会出异常,需要你在写代码的时候就处理一下,不然会爆红,例如IOException。Error,RuntimeException是非受检异常,代码运行的时候才可能出错,概率小一点。下面代码显示了@Transactional对哪些异常会进行补抓回滚。很明显,受检异常是无法被处理的。

2024-11-27 10:47:20 1297

原创 索引设计原则

就一张图,如果仔细看了我之前的文章,或者你自己对索引的底层、优化有了解,仔细看看下图基本能懂。我之前写过一系列索引的文章,读完后再来看看索引的使用吧。

2024-11-26 21:31:05 152

原创 mysql覆盖索引&回表查询

就是查询的字段是索引里的。打个比方,有个user表,字段为id、name、gender,id是主键,有聚簇索引,name是非聚簇索引。第一条语句符合覆盖索引,因为查询的字段id和name是是name索引表就能查到的,不用回表查询,这里不懂没关系,后面我详细带你走一遍查询流程就明白了。第二条不符合覆盖索引,因为查询的是*,所有字段,走name索引查不到gender,就得回表查询聚簇索引。

2024-11-26 20:58:33 796 1

原创 mysql索引失效的五种情况

这个是针对联合索引的。假设有个tb_seller表,现在给三个字段建立联合索引,建立的时候字段顺序不可随便设置,字段顺序: name, status, address。下图Seq_in_index对应的是联合索引顺序。判断索引失效用不懂这个可以先看我另外一篇文章最左前缀法则定义如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。匹配最左前缀法则,走索引:现在如下图,根据最左前缀法则执行三个语句,来看看字段是否走索引。

2024-11-25 19:04:03 1153

原创 mysql定位慢查询以及分析原因

看本篇文章之前建议先了解的概念。

2024-11-25 15:35:30 1015

原创 HashMap的寻址算法(源码分析)

建议先看完我这篇文章。

2024-11-24 10:57:51 509

原创 HashMap源码详解

看该篇文章之前先看看这篇基础文章先来看HashMap里面的一些参数。1.DEFAULT_INITIAL_CAPACITY 默认的数组初始容量2. DEFAULT_LOAD_FACTOR 默认的加载因子。(hashmap数组扩容机制: 扩容阈值 = 数组容量 * 加载因子)3. 你知道的,hashmap底层是数组+链表+红黑树,不知道就先看上面说的基础文章,table就是这里面的数组。4. size 集合中元素个数。

2024-11-23 20:37:58 816

原创 HashMap底层原理

jdk1.8之后,是哈希表数据结构,也可以说是数组+链表或红黑树,下图是没有添加数据的一个hashmap。现在开始添加数据,看下面具体步骤。

2024-11-23 18:57:05 518

原创 什么是聚簇索引、非聚簇索引、回表查询

看不懂的话建议大家先看一下数据库的索引介绍。

2024-11-22 16:34:23 435

原创 java秒杀业务设计

一般tomcat并发量不高,例如一台tomcat有4000qps,那么1s来了1w请求,tomcat就无法处理,6000请求得丢失,此时就要考虑加集群实现负载均衡访问。当然可以,nginx大概1秒能接收5w左右请求,这里请求接收后平均分给三台tocat,tomcat的qps是4000左右,此时并发量就上到了1.2w,1w自然不在话下。nginx无法接收这么多请求了,此时还有个硬件叫做lvs,有30w的qps量,接收到这10w后均分给nginx,然后负载均衡分给tomcat。域名-DNS轮循策略。

2024-11-22 15:34:12 993

原创 redis哨兵模式与脑裂现象

同时,因为原Master宕机了12s,没有一个(min-slaves-to-write)从节点与主节点之间的数据复制在10s(min-slaves-max-lag)内,不满足配置要求,原Master就无法执行写操作了。脑裂的主要原因其实就是哨兵集群认为主节点已经出现故障了,重新选举其它从节点作为主节点,而原主节点其实是假故障,从而导致短暂的出现两个主节点,那么在主从切换期间客户端一旦给原主节点发送命令,就会造成数据丢失。如果Master节点因为某些原因挂了12s,导致哨兵判断主节点客观下线,开始主从切换。

2024-11-21 10:54:05 1088

原创 redis主从复制,主从同步流程

如下图,单个redis处理数据上限不够就要搭建集群,搭建多个redis,其中一个为主节点,其他的为从节点,主节点进行写操作,然后同步到从节点,从节点进行读操作,这样的读写分离大大提高了redis的整体性能。那主节点如何同步数据给从节点呢?接着往下看。

2024-11-20 10:53:53 366

原创 分布式锁介绍

例如一些抢票业务,要判断库存,那必定就要加锁,由于锁属于jvm,集群部署下面多个jvm的锁不一样,单体项目没关系,集群就锁不住,这里就需要公共所,也就是分布式锁。在业务粒子细度比较大的时候,不同函数可能相互调用,例如下图,一个线程内方法一里面逻辑加锁,执行业务,业务里面调用方法二,方法二加同一把锁,如果能加成功,代表可重入,否则不是。如何实现重入锁呢?

2024-11-19 18:27:46 1466

原创 spring的单例bean线程安全吗

单例bean里面的可修改变量是线程不安全的,不可修改的变量是线性安全的,我们在bean里面尽量不要定义上述count这种能被修改的,尽量写个final。实在要写,那就要解决线程安全问题。

2024-11-19 10:58:47 640

原创 设计模式之工厂

迪米特法则(Law of Demeter )又叫做最少知识原则,也就是说,一个对象应当对其他对象尽可能少的了解。不和陌生人说话。英文简写为: LoD。迪米特法则的目的在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。

2024-11-19 10:21:48 1116

原创 redis缓存淘汰策略

先给大家抛出一个问题: redis也是存储数据的,那肯定就存在容量问题,内存是有限的,数据存满了后该怎么办呢?淘汰部分数据?淘汰哪些数据?这个其实就是redis内存淘汰策略的知识。有八大淘汰策略,重点关注的我会提醒。

2024-11-18 17:07:14 562

原创 redis数据过期策略

例如set name liming 10. 10秒后name会被被如何删除呢?redis提供两种方案。

2024-11-18 15:36:30 309

原创 消息队列中如何解决消息堆积问题?

如字面意思,太多的请求消息堆积在队列里面迟迟得不到解决。话题里面一般有四个队列,一般某个队列堆积的消息超过10w就算消息堆积了。

2024-11-18 11:19:03 830

原创 消息队列的作用?

先告诉你答案: 异步、削峰、解耦。

2024-11-17 22:19:22 678

原创 缓存击穿之双重判定锁

这里针对的是互斥锁解决缓存击穿的一个细节。如下图,当线程1在第4步构建缓存之时,线程2查询缓存未命中,之后线程1完成缓存写入操作,释放锁,线程2获取互斥锁成功,线程2就会进行重复的查询数据库、重建缓存。这里我只展示了一个线程2,当大量类似线程2的请求来临时,数据库依然会有压力,这里的解决办法是双重判定锁。对比下面两个逻辑,不一样的地方加粗了。

2024-11-16 15:48:54 513

原创 redis缓存击穿

给某一个key设置过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。我知道你可能会想,第一个请求打到数据库拿到数据后,会进行redis数据同步吧,这样的话后续的请求就直接从redis请求数据了,那你就太理想化了。打个比方,某个key在业务逻辑非常麻烦,在redis重建需要很久,那么这个时间段redis是没有数据的,恰好又有大量请求,这些请求就会全部打入数据库,给数据库带来巨大压力。

2024-11-16 15:25:44 525

原创 缓存穿透详解以及解决办法

查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库简单来说就是大量请求打到数据库去了。我们知道数据库是与磁盘打交道的,速度很慢,远不及类似于redis这种缓存数据库。为什么会发生上述的情况呢?原因在于有人知道你的请求路径,并发起恶意攻击。例如下图,恶意用户用造假的id发起大量请求,此时redis大概率是没有该数据,请求就会直接打入数据库,由于数据库也没有数据,所以不会写入redis,那么每次请求都会打入数据库,大量的这种请求可能会瞬间压垮数据库。

2024-11-15 21:59:18 860

原创 布隆过滤器详解

例如下图,插入id1和id2后1、3、7、9、12、14位置的值被设置为1,首次插入id3时经三个哈希函数映射位置为3、9、12,这时你会发现之前没插入3,但是3已经存在了。来看个场景,一个注册接口,每次注册都需要查询数据库用户是否存在,但是数据库是与磁盘打交道的,比较慢,我们需要更快的方法,这时候可以用到布隆过滤器,每次注册用户的信息都可以写入,下次查询之时直接在布隆过滤器查询用户是否注册,把数据库操作转化为业务层,速度大幅提升。当下次再插入3时,我们会发现数组对应的位置都为1,代表数据已存在。

2024-11-15 21:42:30 198

原创 拦截器不生效

有多个类继承或实现了WebMvcConfigurationSupport、WebMvcConfiguration,springboot只会执行其中一个配置类。这样的话只有一个生效,谁先声明,spring就采用谁。如果想让拦截器生效,要么去掉swagger配置,要么把两个合并起来。下图配置swagger继承了WebMvcConfigurationSupport。下图又实现了WebMvcConfigurer。

2024-09-22 11:20:46 190

原创 用命令npm create vue@latest创建vue3项目时没反应

完成上面步骤再取创建vue3项目。

2024-04-24 16:22:52 2042 3

原创 SQL语句中select、where、group by、聚合函数等内容的执行顺序

在图中明显的可以看到聚合计算在WHERE之后,所以我们在写sql的时候是无法在WHERE后面写聚合语句的,例如SELECT * FROM user WHERE count(*)>2;这个语句是错误的并且毫无意义。为什么这个语句order by 后面是我们取的别名avg_question_cnt呢,看顺序图我们知道SELECT语句是先于order by的,所以取别名操作先于排序,自然可以根据别名排序。具体细节也没什么,把上面记熟就可以了。

2024-04-23 19:35:53 569

原创 mysql中char和varchar的区别

而varchar(10),则是写多少存多少,不会加入空格,varchar(10)里面的10只不过是用来限制字符串最大长度。在空间利用上,varchar是比char更好的。在上面已经介绍varchar会判断将存入的字符串长度从而依次分配空间,char则没有这一步,这就导致了char的性能其实是好于varchar的。看到这,估计你会联想到数组和链表,char像是数组,固定大小,而varchar像是链表,长度可变。(1)当设置用户名时,用户名一般来说是不定长的,更适合于用varchar,可以节省大量空间。

2024-04-22 22:12:13 280

原创 SpringBoot整合mybatis连接数据库流程

这里要注意,数据库驱动必须是com.mysql.cj.jdbc.Driver,不能是com.mysql.jdbc.Driver,前者是8.0版本后的mysql,兼容性和性能都比较好,后者是之前的老版本,用起来会发生不兼容等等一系列问题。2.进行数据库yml配置时,记住driver-class-name可以快速引出。这里的第一个***是自己的数据库名字,下面的两个****是自己的数据库用户名和密码。该网站可获取maven依赖。

2024-04-10 20:30:19 559 1

空空如也

空空如也

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

TA关注的人

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