- 博客(116)
- 收藏
- 关注
原创 八股秘籍之MYSQL (一)
MySQL索引主要分为B+树、HASH、FULL-text等类型,其中B+树索引支持范围查询且I/O效率更高。聚簇索引优先使用主键,无主键时选择首个非空字段或隐式ID。二级索引查询需回表操作,建议通过覆盖索引(包含所有查询字段)和索引下推(存储引擎层过滤)减少回表。设计联合索引时应将等值查询和高频过滤列前置,范围查询列后置,并尽量包含所有查询字段。优化策略包括使用主键查询、避免SELECT *、利用覆盖索引和索引下推技术来提升查询性能。
2025-07-05 18:36:24
1014
1
原创 RuoYi 若依实战讲解
文章摘要:系统通过菜单管理模块创建统计菜单及二级页面菜单,并调整课程管理功能。随后建立用户角色"小智"并关联"科研人员"角色,为其配置课程管理与统计分析菜单的访问权限,实现了基于角色的权限控制机制。这一流程涵盖了菜单创建、角色定义和权限分配三个关键步骤。
2025-07-05 12:16:53
840
原创 RuoYi 环境搭建
RuoYi-Vue前后端分离权限管理系统部署指南:后端需配置MySQL(修改druid.yml数据库连接)和Redis(application.yml),启动前需导入数据库表文件;前端Vue3版本通过Git克隆后,使用npm安装依赖并运行dev命令启动(默认81端口)。系统基于SpringBoot+Vue3技术栈,包含用户权限管理等企业级功能模块。
2025-07-04 09:48:30
394
原创 MYSQL数据库(九)MVCC-多版本并发控制
MVCC(多版本并发控制)通过维护数据的历史版本实现并发访问,核心由隐藏字段(DB_TRX_ID、DB_ROLL_PTR)、UndoLog版本链和ReadView组成。ReadView包含活跃事务ID列表等字段,用于判断数据可见性:若事务ID小于最小活跃ID或等于创建者ID则可见,否则需检查版本链。隔离级别影响ReadView生成时机:RC每次查询新建(导致不可重复读),RR仅首次生成(保证可重复读)。该机制通过非阻塞读取历史版本,有效提升数据库并发性能。
2025-07-04 09:48:15
1069
原创 JVM 类加载过程/对象创建过程/双亲委派机制/垃圾回收机制
类加载的过程是指将类的.class文件加载到JVM内存当中,并对数据进行处理,最终形成可以被JVM使用的Java的类型的过程。文件 -> 读到内存(方法区) -> 在堆里创建。常量(编译期可知)则在此阶段直接赋指定值。文件是否合法、安全。(内存地址/偏移量)。
2025-06-15 14:33:39
887
原创 JUC并发编程(八)JUC工具包
概念:全称是AbstractQueueSynchroizer,是阻塞式锁和相关的同步器工具的框架。1 原子状态管理:存在一个被volatile修饰的状态变量2 CLH变体队列:核心数据结构双向链表可以实现公平锁的线程排队。3 线程阻塞/唤醒机制:条件变量Conditional,基于LockSupport.park()/unpark()实现高效线程挂起与唤醒。实现:自定义不可重入锁二 ReentrantLock原理JUC并发编程(三)死锁/活锁/饥饿/ReenTrantLock基础使用-CSD
2025-06-12 08:55:18
919
原创 JUC并发编程(七)这就是线程池
线程池默认初始状态是空池,是懒加载,此时不会占用系统资源,最大线程数是包括核心线程和救急线程,当任务提交时,判断当前线程是否达到核心线程数,没有达到就创建一个核心线程去执行任务(优先创建而不是使用线程池当中的now<core),当当前线程数达到核心线程数,会尝试进入队列,没满就在队列当中等待空闲线程,如果满了就会用到这里的救急线程,先判断当前线程数是否达到最大线程数,没达到最大线程就创建救急线程去执行任务,达到最大线程数就触发拒绝策略。后面创建的救急线程存在最大空闲时间当任务执行结束后,空闲时
2025-06-10 08:24:37
984
1
原创 JUC并发编程(六)CAS无锁实现/原子整数/原子引用/原子数组/字段更新
在调用compareandSet时,会将这个读取值与现在实际的值进行对比如果出现不同说明在这期间有其他线程对值进行修改,这样的话将会重试,再次读取,再次比较,再次判断以达到最终的效果。的类,它提供了直接操作内存、绕过 JVM 安全机制的能力,被称为 "Java 的后门"。无锁情况下,及时重试失败线程始终在高速运行,而synchroized会让线程在没有获得锁的时候,发生上下文切换,进入阻塞。利用字段更新器,可以针对对象的某个域进行原子操作,只能配合volatile修饰的字段使用,否则会出现异常。
2025-06-08 14:41:15
981
原创 JUC并发编程(五)volatile/可见性/原子性/有序性->JMM(Java内存模型)
volatile 解决的是 "一个线程写,其他线程读" 时的有序性和可见性问题,而解决 "多个线程同时写" 需要更强的同步机制。
2025-06-07 16:49:40
1141
原创 JUC并发编程(四)常见模式
两阶段终止模式(Two-Phase Termination Pattern)是一种多线程编程中安全终止线程的设计模式。它的核心思想是:在终止线程前,先发出终止请求(第一阶段),然后线程在完成必要清理工作后再真正终止(第二阶段)。这种模式避免了直接强制终止线程导致的资源泄露、数据不一致等问题
2025-06-07 16:49:35
1249
原创 JUC并发编程(三)死锁/活锁/饥饿/ReenTrantLock基础使用
死锁是并发编程中一种常见的系统状态,指,若无外力干预,这些线程将无限期阻塞下去。网上看见一个例子(A等B,B等A)面试官问:跟我说说什么是死锁?回答:你给我offer我就跟你说。面试官:你说我才能给你offer。......二者一直僵持下去.....
2025-06-06 09:53:08
1041
1
原创 JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
一段代码块内如果存在对共享资源的多线程读写操作,撑这段代码区为临界区。多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件为了避免临界区的竞态条件发生,有多种手段可以达到目的。
2025-06-04 20:50:46
1174
原创 JUC并发编程(一)进程/并发/同步/栈帧/上下文切换/创建线程的方式/join/yield/interrupt/sleep
1 进程(Process):一个正在运行的程序,操作系统分配资源的基本单位。拥有独立的内存空间。2 线程(Thread):一个进程内部的一条独立执行的路径,CPU调度的基本单位,共享所处进程的内存空间和资源。
2025-06-02 16:28:46
932
原创 #RabbitMQ# 消息队列进阶
在消息队列中,是指确保消息在三者之间传输时,不会因系统故障、网络问题或程序错误而丢失或重复处理。其核心目标是保证消息从发送到最终消费的。
2025-05-27 19:38:42
1433
1
原创 #RabbitMQ# 消息队列入门
核心概念总结角色作用类比Publisher发送消息的程序寄信人Exchange按规则将消息分发到队列邮局分拣员Queue存储消息的容器邮箱Consumer从队列取消息并处理的程序收信人隔离不同业务的消息环境(如测试、生产)邮局内的独立部门。
2025-05-25 15:26:44
940
原创 Docker 一文带你玩明白Docker
命令 → Daemon 检查本地是否存在 Redis 镜像(若不存在则自动拉取)→ 基于镜像创建并启动容器 → Redis 应用运行在隔离的容器环境中(轻量级虚拟化,共享主机内核)。命令 → 命令发送至 Docker Daemon → Daemon 连接 Docker 镜像仓库(如 Docker Hub),下载 Redis 镜像到本地主机。将镜像上传至镜像仓库 → 其他用户可通过相同流程拉取并运行该镜像。命令将应用打包为镜像(依赖 Dockerfile 定义环境)。:在 Docker CLI 中执行。
2025-05-24 16:42:18
996
原创 #Redis缓存篇#(七)分布式缓存
RDB持久化(Redis Database Backup file)Redis数据备份文件,也被叫做Redis数据快照。简单来说就是把内存中所有数据都记录到磁盘当中。当Redis实例故障重启后,从磁盘当中读取快照文件,恢复数据。其他的一些配置参数(是否压缩/修改保存文件名称/文件保存的目录)bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。通过配置文件自动触发(如)或手动执行BGSAVE命令。
2025-05-21 18:24:53
866
原创 #Redis黑马点评#(七)实战篇完结
缓存穿透则是因频繁查询不存在的数据(如恶意攻击发起大量非法ID请求),导致缓存无法拦截,请求直达数据库。此类问题的解决需要结合业务规则与缓存技术:一种方案是缓存空值(Null Cache),对查询结果为空的Key也进行短时间缓存,避免重复穿透,但需注意内存占用和脏数据问题;更彻底的方案是引入布隆过滤器(Bloom Filter)
2025-05-18 20:30:24
1122
原创 #Redis黑马点评#(六)Redis当中的消息队列
ID代表从队列的什么地方开始,如果队列当中原始的消息你不想获取你就可使用$符实现对最新的消息进行读取,如果你还需要获取就是用0从队列的第一个消息获取。:结合 Redis 的持久化机制(RDB/AOF),消息可持久化。,生产者发布消息,所有订阅该频道的消费者都会收到消息。一个组内一个进度,1被a读到,那b再接着读就会读到2。功能,支持消费者组、消息确认、消息回溯等高级特性。后即从队列删除,若消费者处理失败,消息会丢失。将消息转移到“处理中队列”,处理完成后再删除。:无持久化机制,若消费者不在线,消息会丢失。
2025-05-18 20:29:48
894
原创 #Redis黑马点评#(五)Redisson原理详解
使用的是Redis当中的Hash数据结构,存储一个计数器,当一个锁进入开始执行的时候,就将计数器加1,如果该锁执行结束就将计数器减1(为0时删除),这样避免了可重入锁之间锁的误删问题。Redisson是一个在Redis的基础上实现的Java驻Java内存数据网格。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。可重入锁作用对象指的是。
2025-05-11 16:56:14
1254
原创 #Redis黑马点评#(四)优惠券秒杀
防止误删,如果在判断结束后出现了阻塞情况,导致时间达到了TTL时间,其他的线程进入锁依然会被误删,那被误删的线程就会没有锁,导致其他的线程进入抢券,引发线程并发问题)
2025-05-10 16:49:26
995
原创 #Redis黑马点评#(三)缓存穿透/雪崩/击穿
先判断是否有实际数据,接着再判断是否为""这样的情况属于之前查询后存储到缓存当中的,最后再判断为null就是在缓存当中没查询到,那就要在数据库当中查询。
2025-05-07 18:38:38
1066
原创 #Redis黑马点评#(一)登录功能
核心逻辑:客户端向服务端发送请求后,后端服务器直接将用户敏感信息明文或者见到那加密后存储在cookie中,客户端后续每次请求都要携带这些信息,服务器解析Cookie以完成验证。Service接口实现类补全业务逻辑(这里我们为了便捷不完善发送短信验证码的功能只在客户端以日志形式显示出来)首先找到对应的控制层类文件userController(调用Service业务层接口方法)改进的cookie方式:(Cookie+服务端存储)返回登录对象方法的完善(Controller层)在Service业务层接口中补全。
2025-05-07 18:38:17
1044
原创 苍穹外卖心得体会
再说一下Token的实际运作过程,我们在实际的业务当中会出现登录的操作,在后端服务器我们接收客户端请求,将传递的登录信息反序列化,服务器会验证登录信息是否正确,如果正确就会生成Token令牌,返回给前端,后端无需存储Token,只需存储密钥即可,在后续操作当中服务器会编写拦截器在请求之前拦截,同时对Token令牌进行解析验证,如果验证成功便可执行业务代码。ThreadLocal是Java中的一个线程变量,它可以为每个线程提供一个独立的变量副本。实例是共享的,但每个线程通过它访问的是自己的。
2025-04-29 19:14:58
2281
原创 #苍穹外卖# (day 10-11)订单提醒图形报表
SpringTask概念:是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。作用:定时自动执行某段代码
2025-04-25 10:25:27
375
原创 #苍穹外卖# (day 8)下单
controller业务层代码开发。Service层业务层接口实现。controller控制层实现。支付功能(剩下的跟着文档实现)Service业务层实现类。Mapper层XML文件。Mapper持久层接口。Service实现类。
2025-04-24 16:06:41
295
原创 #苍穹外卖#(day 6-7)微信小程序
它是 Java 生态中最流行的 HTTP 客户端工具之一,特别适合需要精细化控制 HTTP 通信的场景。后面加上(jscode就是上一张图片的code)(greant_type为固定值:authorization_code)编译登录之后会出现这样的界面,前往postman测试接口,测试条件需要在。使用过程中需要修改appid配置信息(导入之后需要改成自己的)2 Controller控制层实现用户的方法。基于微信登录实现小程序的登录功能。1 配置微信登录所需的配置项。MapperXML文件。
2025-04-21 20:55:17
606
原创 苍穹外卖阶段性总结 (超详细版)
生成jwt令牌的作用主要是便于后续进行操作的便携性,解决了登陆状态的持续验证问题。这里的实现是后端借助前端登录的信息,生成token,后续用户再访问客户端的其他功能,服务端只需要验证其token即可。验证过程:使用相同的密钥对Token进行签名验证,同时还会验证其是否过期
2025-04-20 13:37:40
1329
1
原创 #苍穹外卖#(day05)营业状态
需要在controller层下设置添加一个新的包,用户的相关信息。便于区分需要在RestController的注解下标识区分。实现对swagger接口的分类管理。管理端的商店状态控制。
2025-04-20 13:37:25
258
原创 Redis入门(Java中操作Redis)
数据主要存储在内存中,读写速度极快(微秒级),适合高性能场景。:无需预定义表结构,以键值对(Key-Value)为基础,支持多种数据结构。:采用单线程处理命令(6.0+支持多线程I/O),避免竞态条件,简化设计,依赖内存和高效I/O复用实现高吞吐。:支持将内存数据保存到磁盘(RDB快照、AOF日志),保障数据安全。:支持主从复制、哨兵模式(Sentinel)和集群分片(Cluster)。
2025-04-15 17:32:39
562
原创 #苍穹外卖#(day3-4)菜品套餐相关
对公共字段进行处理,下面这些是公共字段常量方法,代码规范将不需要对公共的属性进行赋值,这些方法底层都是调用update与insert的方法,我们从切面当中已经处理了这些公共字段那在调用这些方法时就不需要再在业务代码当中手动重复设置时间(将下面这些类的对这些公共字段设置时间的语句进行删除)加上注解(加上的就会自动填充公共字段)切面类/*** 自定义切面,用于自动填充公共字段处理逻辑*/@Aspect@Component@Slf4j/**
2025-04-15 16:33:52
861
原创 SSM阶段性总结
自动配置类通常用@Configuration和@ConditionalOnXXX注解,当条件满足时,会创建相应的Bean。这些自动配置类可能依赖属性类,这些属性类通过@ConfigurationProperties绑定配置文件中的属性。
2025-04-10 20:38:12
970
原创 #苍穹外卖#(day1-2)员工相关
定位到service 并找到其实现类补全相关代码(先在接口当中补全相关方法再在实现类当中补全业务代码)在xml文件当中书写相关的SQL查询(一个小插曲,将order by 语句写在了where标签里面)根据id查询员工信息(小插曲,这里的long 前面需要加@PathVariable)对日期的格式化,推荐使用第二种方式(修改结束需要重新启动swagger以及项目)最后在xml当中补全对应的SQL更新语句(这里的where条件没有加)xml中前面的禁用启用以及设计到了信息的更新修改。swagger常用注解。
2025-04-10 17:49:36
703
原创 JWT(JSON Web Token)
JWT(JSON Web Token)在当今企业中被广泛采用,尤其是在无状态认证和分布式系统场景中。其流行主要得益于其轻量级、跨平台兼容性和自包含特性。
2025-04-02 17:27:26
720
原创 GIt 分布式版本控制系统
Git 是一款,由 Linus Torvalds(Linux 内核创始人)于 2005 年开发,旨在高效管理代码和文件的变更历史。它不仅是软件开发的核心工具,也逐渐应用于其他需要版本控制的领域(如文档协作、设计稿管理等)。
2025-04-02 08:18:10
428
原创 SpringBoot(三)环境隔离/外部化配置/单元测试/可观测性/生命周期
外部化配置(Externalized Configuration)是一种将应用程序的配置信息从代码中分离出来,存储在代码之外的位置的设计模式。其核心目的是提高应用的灵活性、安全性和可维护性,使配置能够在不同环境(如开发、测试、生产)中无缝切换,而无需修改或重新编译代码
2025-03-30 17:15:31
1234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人