自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 微服务项目如何实现登录校验

在单体架构的项目中,我们做登录校验的方式是让前端的请求携带登录令牌Token,后端定义一个拦截器来拦截前端的请求,并且解析令牌,如果解析生成则把用户信息保存到ThreadLocal中,如果令牌解析失败则返回未登录异常信息这里以JWT校验为例:解析JWT成功解析JWT失败前端请求携带JWT后端拦截器拦截请求保存用户信息到ThreadLocal返回未登录异常信息继续处理请求前端提示未登录但是在微服务项目中,各个模块部署在不同的服务器上,而请求也不会直接到达后端接口,而是请求到达网关,网关再路由到不同的微服务模

2025-03-24 14:21:18 1256

原创 Java多线程:什么是ABA问题?

ABA问题是多线程编程中一个容易被忽视但潜在危害巨大的问题。通过使用或,我们可以有效地避免ABA问题,确保程序在多线程环境下的正确性和稳定性。在实际开发中,尤其是在涉及复杂数据结构和状态管理时,务必注意这一问题,并采取相应的防护措施。

2025-03-22 20:58:18 1043 1

原创 秒杀业务如何设计

当今电商业务越来也多,其中最数秒杀系统考验业务能力,因此我们一起来学习一些简单的秒杀系统如何设计

2025-03-22 20:47:36 1058

原创 SpringBoot项目Lombok注解失效问题

方法中输出日志信息的方法被认为该方法不存在,显然是Lombok的依赖有问题与日志失效同理,显然是因为Lombok中的注解等无法失效,不能为实体类生成对应的和方法。

2025-03-21 13:48:41 778 2

原创 带你了解Java无锁并发CAS

在多核处理器时代,并发编程已成为提升系统性能的核心手段。传统的同步机制(如和今天带你了解另一种保证线程安全的无锁方式:CAS。

2025-03-21 13:45:51 1013 1

原创 什么是死锁、简单定位死锁

死锁(Deadlock)是多线程编程中的经典问题,指在多进程或多线程环境下,两个或多个进程(线程)因争夺系统资源或彼此通信而处于一种相互等待的状态,若无外力作用,它们都将无法推进下去,就好像这些进程(线程)“卡死” 了一样。例如,进程 A 占用了资源 1 并等待资源 2,而进程 B 占用了资源 2 并等待资源 1,此时 A 和 B 都在等待对方释放自己所需的资源,从而陷入无限期的等待,这就是一种典型的死锁情况fill:#333;color:#333;color:#333;fill:none;

2025-03-20 09:59:26 1005

原创 JVM垃圾回收器详解

我们知道在算法中,将我们的堆内存分为了与。

2025-03-20 09:56:52 806

原创 Redis主从复制的实现原理

主从节点的第一次数据同步就是全量同步,在了解这两种数据同步方式之前,我们先要了解两个概念,主节点master如何判断从节点slave是不是第一次来同步数据?如果不是又该从什么地方开始同步?因此slave做数据同步,必须向master声明自己的和,master才可以判断到底需要同步哪些数据,如果同步数据时,从节点的replicationid和主节点的replicationid不一致,说明这是该从节点第一次向主节点同步数据,此时应该进行全量同步。

2025-03-19 07:25:05 728 1

原创 RabbitMQ消息可靠性问题

生产者在发送消息的时候,可能因为网络波动、业务异常导致消息发送未成功的现象,导致消息丢失。

2025-03-19 07:16:34 899

原创 Redis如何实现持久化

Redis默认将所有数据存储在内存中,虽然读写效率极高,但存在两大风险Redis作为高性能的键值数据库,其核心特性之一是——将内存中的数据持久保存到磁盘,防止服务宕机时数据丢失,持久化机制通过在磁盘中保存数据副本,为Redis提供了数据安全保障和灾难恢复能力目前Reids有两种持久化机制。

2025-03-18 00:06:02 1380 1

原创 MySQL InnoDB引擎的锁机制详解

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/0)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

2025-03-18 00:04:12 861

原创 MySQL事务原理以及MVCC详解

在MySQL中,最总要的几部分莫过于事务了,那么事务的执行也会伴随着并发事务的问题,MySQL是如何解决并发事务的问题呢。

2025-03-17 16:54:27 845 1

原创 最详细的Redis底层数据结构全面详解

因此Redis构建了一种新的字符串结构,称为(Simple DynamicString),简称那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含jack”的SDS。

2025-03-17 16:42:29 1841

原创 Java synchronized底层原理深度解析

在Java中,synchronized是用于实现线程同步的重要关键字,它的主要作用是控制访问共享资源的线程的数量。在并发编程中,理解synchronized底层是非常重要的,它不仅能帮助我们避免死锁和竞态条件,还能帮助我们优化程序性能。在本篇博客中,我们将深入探讨synchronized底层的实现原理,涵盖以下几个主要概念:对象头、Monitor、偏向锁、轻量级锁、重量级锁、锁膨胀以及自旋优化等

2025-02-20 00:24:01 968 2

原创 多线程之两阶段终止模式

当某些线程正在运行时,如何去正确终止线程,如果直接强制终止线程(如调用不可控性两阶段终止模式(Two-Phase Termination Pattern)是一种。它的核心思想是:在终止线程前,先发出终止请求(第一阶段),然后线程在完成必要清理工作后再真正终止(第二阶段)。这种模式避免了直接强制终止线程导致的资源泄露、数据不一致等问题简单来说就是在一个线程T1中如何优雅的终止线程T2,给T2一个料理后事的机会sleep()wait()使用。

2025-02-18 23:16:10 1013

原创 保证让你搞懂:线程与进程、并行与并发

进程基本上相互独立的,而线程存在于进程内,是进程的一个子集

2025-02-18 14:48:52 611

原创 Spring Boot自动装配原理深度解析

约定优于配置:通过默认配置减少显式配置条件化装配:根据classpath内容、环境变量等条件决定是否启用配置模块化配置:每个starter模块提供自己的默认配置当开发者添加某个starter依赖(如)时,Spring Boot会自动配置所需的Bean,而无需手动编写配置类。新建Maven项目,添加依赖:</</</创建自动配置类:@Bean添加配置属性类:创建spring.factories:在应用项目中添加依赖:</</</</

2025-02-15 13:23:20 813

原创 Redisson分布式锁和同步器完整篇

多个线程可以同时持有读锁,前提是没有线程持有写锁。适用于读取共享资源的场景,因为读操作不会修改资源的状态。只有一个线程可以持有写锁,且持有写锁时不能有线程持有读锁。适用于需要修改共享资源的场景。特性读写锁排他锁访问粒度区分读锁(共享)和写锁(独占)只提供独占模式读操作并发支持多个线程同时读资源不允许任何线程访问资源写操作独占写锁是独占的(等同于排他锁)写操作独占资源适用场景读多写少场景需要严格控制访问的场景读写锁实现类为,其中读锁和写锁都继承了RLock接口。

2025-02-15 12:04:21 699 7

原创 Python数据可视化小项目

这是一个基于 PyEcharts 的数据可视化小项目,展示了英雄联盟 S14 世界赛选手的关键数据表现,适合作为数据可视化课程作业或兴趣项目。数据源权威,来源于 Kaggle。涉及多种可视化类型,包括柱状图、箱形图、雷达图等。共包含 14 个可视化图表,分布在 3 个 HTML 页面中,方便浏览与展示。英雄联盟S14世界赛选手数据可视化。

2024-12-28 00:09:21 2183 6

原创 MySQL什么情况下会导致索引失效

索引()是数据库中一种用于快速查找和访问表中数据的结构,它类似于书的目录,通过索引可以快速定位到目标数据,而无需遍历整个表,索引的存在可以显著提高查询速度,尤其是在处理大量数据时有时我们为了避免出现,我们就会以多个字段来创建索引,即使用覆盖索引最容易遇到的问题就是问题,那么哪些情况下会出现索引失效,又该如何避免索引失效呢?

2024-12-25 00:11:31 984

原创 我的创作纪念日

一切的开始是因为某一次的比赛项目,我负责后端搭建,项目是一个微信小程序,于是乎最重要的一步就是实现微信小程序的登录功能,这样后面的业务才能顺利拿到用户登录凭证中的用户信息,之前在。有限的精力下,创作博客也是我学习的一部分,在创作博客的过程中,我总是会把知识更见牢固的记在我的脑子里,创作以及成为了我生活的一部分。的小白(现在也是小白)

2024-12-24 10:40:07 604

原创 聚簇索引、非聚簇索引、覆盖索引

本篇将带你搞懂什么是聚簇索引、非聚簇索引、覆盖索引,并且通过画图的方式了解索引查找的过程,明白什么是回表查询索引()是数据库中一种用于快速查找和访问表中数据的结构,它类似于书的目录,通过索引可以快速定位到目标数据,而无需遍历整个表,索引的存在可以显著提高查询速度,尤其是在处理大量数据时MySQL中默认使用索引的数据结构是。

2024-12-24 00:10:56 1226

原创 Java线程池的工作机制

线程池是一种多线程管理机制,用于限制和控制并发线程的数量,以提升系统性能和资源利用率,降低频繁创建和销毁线程的开销,线程池是 Java 并发编程中的重要工具之一,广泛应用于高性能、多线程的场景线程池通过复用已创建的线程执行多个任务,避免线程的频繁创建和销毁,线程池可以限制线程数量,防止大量线程导致的系统资源耗尽,线程池使用队列管理任务,支持任务调度和优先级,线程池提供策略处理超出能力范围的任务我们可以使用Java提供的:核心线程数,线程池中始终保持的线程数量:最大线程数,线程池中允许的最大线程数量。

2024-12-24 00:07:26 835

原创 MySQL索引为什么是B+树

索引是帮助MySQL高效获取数据的数据结构,在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结果以某种特定的方式引用数据,这样就可以在这些数据结构上实现高级查找算法,提升数据的查找速度,这种数据结构就是索引如果此时有一个user那么此时在user表中会逐个查找每一行,直到查找到最后一行,然后返回age为35的行这样的查找无疑是非常耗时的,当数据量非常庞大时,全部检索整张表会消耗大量的时间和性能,因此需要为数据建立合适的索引来提高查询的效率那为什么MySQL采用的是呢?

2024-12-23 00:20:32 1004

原创 Java中的动态代理和AOP有什么关系?

本篇将带你了解Java中的动态代理使用方法,以及动态代理和AOP到底有什么关系。

2024-12-23 00:17:21 845

原创 什么是等待唤醒机制?

本篇将会带大家了解并发线程中的一个经典模式,并且详细讲解他的执行流程,尝试使用代码来实现唤醒等待机制(Wait And Notify)又叫生产者消费者模式,是一种多线程编程中常见的同步控制技术,主要用于线程之间的协调和通信。它通常由和两个操作构成。通过这种机制,一个线程可以挂起自身并等待条件满足,而另一个线程可以在满足条件时唤醒等待的线程当两个线程并发执行时,常规情况之下,他们抢夺CPU的情况是完全随机的:fill:#333;color:#333;color:#333;fill:none;

2024-12-16 23:33:38 1247

原创 ThreadLocal原理解析

本篇将带大家了解ThreadLocal的使用方法,并且深度剖析其原理和作用,通过阅读源码的方式,进一步了解其内部原理是 Java 提供的一个工具类,用于为每个线程维护一个独立的变量副本。每个线程可以访问自己专属的变量值,而其他线程无法访问或影响它,从而实现线程之间的隔离,当我们在同一线程中的不同层级之间,如果想要共享一些变量,而又不方便将变量作为参数传来传去时,就可以用来存放线程中的共享变量。

2024-12-12 23:53:47 971

原创 带你读懂Redisson分布式锁原理

本篇带大家详细了解Redisson分布式锁原理,通过仔细阅读源码,逐步分析获取锁和释放锁的具体流程,并且为大家讲解每一步的执行过程,结尾会附有整个过程的流程图。

2024-12-11 20:10:57 1636

原创 什么是JVM即时编译

即时编译是JVM的核心功能,他让java在性能上不输于C/C++JVM(Java Virtual Machine)即 Java 虚拟机,是一种用于执行 Java 字节码的虚拟计算机。它是 Java 程序的运行核心,提供了一个独立于底层操作系统和硬件的运行环境。这意味着 Java 程序可以在安装了 JVM 的任何设备上运行,而不需要重新编译,体现了 Java“一次编写,到处运行” 的特性。

2024-12-11 17:19:59 804

原创 Redis数据过期与淘汰策略

在高并发的场景下,如果 Redis 不处理过期数据或内存不足时不采取淘汰策略,可能导致数据积压、性能下降,甚至系统宕机。

2024-12-10 18:06:36 937

原创 图解LinkedList底层原理

本篇将讲解Java中的一个集合LinkedList的底层实现原理,会查看并分析底层源码,结合图解的方式,理解其添加数据的过程。

2024-12-10 17:23:27 1521

原创 Redisson分布式锁如何实现可重入

本篇将从源码的角度去讲解Redisson分布式锁如何实现可重入的我们都知道Redisson的比起我们自己用Redis。

2024-12-09 11:54:02 1230

原创 Redis的Lua脚本

本篇将以redis实现分布式锁的案例,来讲解为什么要使用Redis的Lua脚本,并且如何使用Redis从 2.6.0 版本开始支持Lua脚本。Redis使用Lua脚本主要是为了实现操作。在Redis中,一个Lua脚本的执行是原子的,这意味着当一个Lua脚本开始执行时,其他客户端的命令必须等待这个脚本执行完才能执行。

2024-12-09 10:38:46 748

原创 ArrayList的自动扩容机制源码

ArrayList是 Java 中极为常用的动态数组实现类,它依托数组存储数据,能依据实际需求灵活变动容量,高效管理元素集合。在深挖底层源码细节前,先来了解创建ArrayList。

2024-12-06 20:20:25 759

原创 如何解决Redis缓存穿透

本篇将带大家了解如何在不同的业务场景下防范Redis缓存穿透,以查询商品业务场景为例子,分别使用缓存null和布隆过滤器的方法来防范缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样请求到达缓存永远不会命中,并且查询数据库的结果也为null,不会写入缓存,从而使得这些请求都会打到数据库上,在并发量非常高的场景下,大量的请求打到数据库上很有可能会压垮数据库。

2024-12-06 19:45:54 1029

原创 Java 正则表达式详解及实用案例

正则表达式(Regular Expression)是一种用来描述字符模式的规则。它可以用来验证字符串是否符合规则,或者从一段文本中提取特定的子字符串预定义字符类是字符类的简化写法,用来匹配常见的字符类型表达式描述匹配任意字符\d匹配数字,等价于[0-9]\D匹配非数字,等价于[^0-9]\s匹配空白字符\S匹配非空白字符\w匹配字母、数字、下划线,等价于\W匹配非字母、数字、下划线java复制代码System.out.println("123".matches("\\d+"));// true。

2024-11-16 20:48:45 1267

原创 StringBuilder为何比String节省效率

通常说StringBuilder比String节省效率一般是指在对字符串进行一定的操作,比如拼接、反转等,那么究竟为什么节省效率呢,本篇将从字符串拼接的原理来讲述。

2024-10-31 23:17:52 1189

原创 Java中的五种引用类型

在Java中,引用类型的使用决定了对象的生命周期以及GC的回收策略。本文将介绍Java中的五种引用类型,并讨论它们在不同场景下的应用这些引用类型主要用于管理对象的生命周期,帮助垃圾回收器更高效地回收不再使用的对象。接下来我们逐一介绍每种引用类型。

2024-10-08 21:07:21 785

原创 Java的几种垃圾回收算法

上篇讲了在堆内存中,垃圾回收器是如何辨别哪些对象可以被回收,那么回收对象的时候又是怎么样的过程呢,本篇会介绍几个常见的垃圾回收算法。

2024-10-08 18:38:53 858

原创 Java如何判断堆区中的对象可以被回收了?

在Java中,垃圾回收机制会帮助我们自动回收不再被使用的对象,已到达即使释放内存的效果,但是Java又是怎么知道哪些对象不会再被我们继续使用了呢,希望你通过本篇文章,理解引用计数法与可达性分析法的运行方式。

2024-10-06 21:12:37 1274

空空如也

空空如也

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

TA关注的人

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