自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【jvm|基本原理】第四天

本文简单分析了Java虚拟机的核心运行机制。首先介绍了基本数据类型在32位和64位虚拟机中的存储差异,说明slot槽设计以空间换时间的优化思路。其次详细解析了对象在堆内存中的存储结构,包括对象头、对象数据和对齐填充机制。然后探讨了方法调用的实现原理,包括静态绑定和动态绑定两种方式。接着阐述了异常捕获通过异常表实现的机制。最后简要介绍了JIT即时编译器的关键技术,包括方法内联和逃逸分析。全文从底层视角揭示了JVM高效运行的关键技术原理。

2025-07-15 17:42:21 325

原创 【JVM|类加载】第三天

摘要:本文系统介绍了Java类文件结构与类加载机制。类文件包含魔数、版本信息、常量池等基本结构,并通过字节码示例解析了"i=i++"结果为0的原因。类加载过程分为加载、连接(验证、准备、解析)、初始化等阶段,涉及方法区InstanceKlass和堆区Class对象的创建。重点分析了双亲委派机制的工作原理及其安全性保障,包括启动类、扩展类和应用程序类加载器的协作关系。最后探讨了JDK9模块化设计带来的变化。全文通过字节码指令和内存模型深入揭示了Java类加载的底层实现原理。

2025-07-12 21:22:39 976

原创 【JVM|垃圾回收】第二天

该算法需要额外一块空间(from/to),当标记完成后就将from中存活的对象复制到To空间中,这个过程中自然就能够做到整理,最后交换from和To的引用(from<-->To)但是引出循环引用问题-->两个对象互相引用,这两个对象又没有被其他对象引用,因为技术不为0无法被回收。针对被标记的对象,通过将对象内存空间的启始位置记录的方式将该垃圾对象清除,后续其他对象创建时会直接从记录中寻找合适的空间放置。通过指定不可回收的对象,包括-->roots根对象,直接或间接引用根对象的其他对象。

2025-07-10 16:19:43 811

原创 【JVM|内存结构】第一天

回收过程简单来说就是byteBuffer对象被垃圾回收后,根据虚引用的垃圾回收机制,会自动触发Cleaner虚引用对象的Cleaner方法,这个方法会执行对应的任务对象-->unsafe释放直接内存(由后台线程执行,而非主线程)可能导致元空间内存溢出,例如:spring和mybaties等,都会动态地加载繁多的动态代理类,就有可能导致内存溢出,但是自1.8更改到元空间后,其内存因为直接与系统内存大小相关,极少出现元空间内存溢出。,称为虚拟机栈,每个栈对应多个栈帧,每一个栈帧都是一次方法调用,

2025-06-21 16:40:52 848

原创 【MySQL|进阶篇】索引

MySQL索引优化指南:结构与使用策略 摘要: 本文系统介绍了MySQL索引的核心知识,包括两种主要索引结构:B+树索引(支持排序和范围查询)和哈希索引(高效查找)。重点分析了索引使用法则,特别是联合索引的最左前缀原则及其失效场景(如范围查询、列运算、模糊查询等)。同时提出了9大优化策略,包括避免索引列运算、使用覆盖索引减少回表查询等。通过explain语句进行SQL性能分析,并介绍了SQL提示等高级优化技巧,帮助开发者合理使用索引提升查询效率。

2025-06-12 21:20:41 210

原创 【MySQL|进阶篇】SQL优化

而在order by语句中,必须按照索引的顺序使用索引,如果不按照索引的顺序使用索引,那么会导致无法使用联合索引,从而降低查询效率。如果根据非索引字段进行更新操作,MySQL 只能全表扫描从而由行锁变成表锁,所以update更新的条件尽量采用索引字段。LOCAL表示只对当前添加该条件选择的视图的限定条件有效,而不会向上级联其依赖的视图的限定条件。依赖当前添加该条件选项视图的所有视图的限定条件,如果都满足才可以执行插入操作。2,分组操作时,索引的使用也满足最左前缀法则。一,数据插入(load进行批量插入)

2025-06-12 21:09:04 198

原创 【redis实战篇】第八天

(1)redis中插入数据,将商铺类型作为key,商铺id作为member,使用stearm流将将商店根据类型进行分组得到map<类型id,list<商铺实体>>,最后构造locations数组批量写入。(3)根据默认的页数5计算分页参数(起始),通过前端携带的经纬坐标xy为圆心,距离默认5km,添加返回条件--商铺到xy距离以及limit范围。(1)原理:将每个用户这个月的签到情况使用bitMap表示,签到置1,未签到默认0,用户id拼接该月日期作为key,根据签到情况添加value。

2025-06-06 14:55:36 664

原创 【redis实战篇】第七天

(1)如果关注,将关注信息(当前用户和关注用户)存入数据库,并且存入redis的set集合中。(1)通过当前用户关注表的key和该用户关注用户列表的key求共同关注用户id。

2025-06-02 21:15:41 932

原创 【redis实战篇】第六天

如果再次出现异常,记录日志,休眠线程一段时间 ,重新开始循环。3,调用阻塞队列BlockingQueue<VoucherOrder>的数组实现并指定大小,将创建好的订单加入到阻塞队列,方法即可结束,大大提升性能。6,编写订单写入数据库的方法createVoucherOrder()并开启事务,这样保证锁的范围比事务范围大,避免出现事务未提交锁提前释放的问题。5,order传入上锁的方法handleVoucherOrder(),防止同一个用户的多个请求并发产生的问题,保证每个请求(线程)单独执行。

2025-05-29 22:08:59 1107

原创 【redis实战篇】第五天

(1)如果自己指定锁释放时间,没有指定最大重试时间--新的释放时间就等于指定的释放时间:如果指定了最大重试时间,那么新的释放时间等于最大重试时间X2,因为集群部署,要重试获取多把锁花费时间较长,所以要求设置的释放时间不能太短,避免锁重试未到时间锁已经释放。(4)未获取到锁,只有当总的锁个数-获取到锁的个数=失败的上限0,才跳出循环;如果不需要重试且没有指定锁释放时间--执行普通的无参的获取锁的方法,如果需要重试或者指定了锁释放时间,有等待时间就选等待时间,没有取默认-1不重试,执行有参获取锁的方法。

2025-05-27 23:17:00 602

原创 【redis实战篇】第四天

(2)由于高并发场景,这里会有相当一部分线程更新失败,库存”卖不出去“,也是不正确的;限定一个用户只能购买一单,当用户购买时,通过用户id和代金卷id查询是否有订单数量,一旦数量大于0说明该用户已购买,返回错误信息。(1)将库存作为版本号,每次更新时都要将数据库当前库存和之前查询到的库存进行比对,如果不一致说明有线程已经修改过,所以更新失败。(3)成功创建订单对象,使用ID生成器生成唯一id作为订单id,填入用户id和代金卷id。,因为一人一卖,只需要锁对应的那个对象就行,不同的用户会加新的锁,但是因为。

2025-05-26 16:51:06 826

原创 【尚庭公寓|项目日记】第五天

该项目登录拦截使用的是Jwt令牌+token的方式来验证用户,token中存放了usrId和username信息,逻辑是每当有请求访问,取出请求头的token进行解析,如果解析中抛出异常就无法执行到最后的return而被拦截,解析成功就将token中的用户信息存入本地线程中,方便后续使用。开启定时任务,cron表达式中分别代表:秒,分 ,时 ,日 ,月 ,周(0-7),*表示每个对应时间段,如:每周每天.....其实也是对用户隐私的一种保障,通过mybatisplus自带的注解@TableField中的。

2025-05-24 11:31:52 432

原创 【redis实战篇】第三天

此外,缓存策略的优化,如热点操作逻辑的修改和缓存与数据库数据的同步,也是确保数据一致性和系统稳定性的重要手段。针对缓存穿透、缓存雪崩和缓存击穿等问题,文章提出了多种解决方案,包括缓存空值、布隆过滤器、互斥锁和逻辑过期等,以应对不同的缓存挑战,确保系统的高效运行。为了解决缓存与数据库数据不一致的问题,我们需要对数据库和缓存中的数据进行同步,在执行更新或者修改操作时要修改数据库和缓存。缓存穿透是指大量请求访问缓存中不存在的数据,导致这些请求直接访问数据库,从而给数据库带来巨大压力甚至崩溃。

2025-05-23 19:21:15 628

原创 【尚庭公寓|项目日记】第四天

文件上传接口通过Spring MVC的MultipartFile类简化操作,使用MinIO客户端进行文件存储,确保文件名唯一性,并返回文件的访问URL。此外,文章还简要提及了房间信息管理、预约看房管理以及后台管理系统的登录功能,包括验证码生成与验证、用户名和密码的校验等。转换为字符串类型传输到前端,验证码统一转换为小写,方便用户忽略大小写,这里的key表示存储到redis中的验证码的key,而不是真正的验证码。该模块的所有接口与公寓信息管理中的接口非常相似,完成的思路几乎没有区别,自行完成即可,唯一需要。

2025-05-20 16:08:05 778

原创 【redis实战篇】第二天

我们通过拦截器刷新redis用户信息来保证用户登录状态,但是拦截器是没有拦截所有路径的,这就会导致用户在访问未被拦截的功能,如:浏览点评等,达到过期时间也会自动登出。(1)检查手机号格式,其实就是使用正则表达式来进行匹配,如果这里一直出现手机号格式错误的问题,可以考虑更换正则表达式,网上随意搜索即可。,所以我们在原拦截器前再加一个拦截器,作用仅用于刷新用户token不执行拦截,原来的拦截器只需要检查本地线程是否有用户信息即可。(登录和访问都是大数量级的操作),另一方面解决了多台服务器部署时无法互通的问题,

2025-05-19 23:52:36 563

原创 【redis实战篇】第一天

点评项目默认的jdk(1.8)和springboot(2.x.x)版本较老,我这里就jdk21进行了更新,主要是springboot依赖,mybatisplus依赖。主要是完成点评项目的搭建,以及aplication.yaml文件的填写修改,主要包括数据库连接,redis连接配置。输入网址,然后点击开发者工具,将浏览器转换为手机模式。如果还是不清楚自己的版本问题可以参考。

2025-05-19 19:09:07 261

原创 【尚庭公寓|项目日记】第三天

(1)通常在实际开发场景中,都会通过全局异常处理器来处理各类异常,同时可以自定义你自己需要的异常,且在自定义异常中我们一般会接收一个状态枚举(包含code状态码和message错误信息)如果查询涉及到多表,一般采用手写sql来完成查询,观察查询返回类的字段:公寓基本信息(条件查询) + 房间总数 + 空闲房间数(房间总数-已签约房间数)主要记录了web-admin模块下与公寓有关的几个较难,且知识点较多的几个接口的实现,对这些接口的知识点进行了简单的介绍,巩固有关的知识体系。答案是匹配度高的优先执行。

2025-05-18 16:02:31 935

原创 【尚庭公寓|项目开发】第二天

模块中编写了配置类,包括Redis配置、MyBatis分页插件和字段自动填充、以及Minio配置类的实现。idle-timeout: 500000 #空闲连接存活最大时间,默认600000(10分钟)端口8081/8082,数据库(hikari),redis以及对象存储minio等配置。maximum-pool-size: 12 #连接池最大连接数,默认是10。date-format: yyyy-MM-dd HH:mm:ss #日期格式。模块的枚举类和实体类,并配置了Lombok。

2025-05-18 14:14:05 784

原创 【尚庭公寓|项目日记】第一天

lease使用<dependencyManagement>和<properties>标签统一管理依赖版本,web模块依赖于common和model模块,非通用依赖在web模块单独引入。2,在项目lease目录下打开git bash,使用git clone命令拉取你自己项目的初始化文件到项目中,idea会自动识别,然后就可以直接在idea中进行版本管理了。1,选择一个自己喜欢的平台,如:码云(gitee),创建仓库lease,初始化仓库:语言和.gitignore模板选择Java,开源许可AGPL-3.0。

2025-05-18 12:04:35 316

原创 【redis基础入门篇】

2.1,当我们向redis中存入数据会发现,key和value都出现了乱码,原因是RedisTemplate底层的序列化机制,因为RedisTemplate可以接受object类型的key和value,但是序列化会走默认的序列化机制,这个机制底层是ObjectOutputStream流完成序列化,所以会乱码。2.2,通过自定义RedisTemplate解决这个问题,自定义key,hashkey和value,hashvalue的序列化规则同时定义自己需要的key和value泛型。(2)怎么实现队列?

2025-05-17 17:31:14 678

原创 【尚庭公寓|项目日记】第十天

今天的学习内容主要围绕Nginx的安装、配置及项目部署展开。首先,通过创建和编辑nginx.repo文件,使用yum命令成功安装了Nginx,并设置了开机自启动。接着,深入了解了Nginx的主要配置文件结构,包括mainblock、httpblock、serverblock和locationblock,这些模块分别负责全局参数、HTTP服务器功能、虚拟主机配置和请求处理逻辑。在实践案例中,通过配置简单的静态资源服务和反向代理,进一步掌握了Nginx的应用。

2025-05-15 23:37:02 445

原创 【尚庭公寓|项目日记】第九天

(1)先删除缓存,后更新数据库,第二步操作失败,数据库没有更新成功,那下次读缓存发现不存在,则从数据库中读取,并重建缓存,此时数据库和缓存依旧保持一致,都是并发【读写】还是会不一致。而且很多情况下,写到缓存中的值,并不是与数据库中的值一一对应的,很有可能是先查询数据库,再经过一系列「计算」得出一个值,才把这个值才写到缓存中。(2)如果是先更新数据库,后删除缓存,第二步操作失败,数据库是最新值,缓存中是旧值,发生不一致,都是并发【读写】情况下发生不一致问题的概率非常低。2,哪种更优更安全?

2025-05-14 21:21:56 387

原创 【尚庭公寓|项目日记】第八天

对于图片集合可以采用两种查询方式:嵌套查询(手写集合查询的<select>标签)/嵌套结果查询,因为没有分页要求这里采用结果查询,但是太多的join可能损失性能。因为查询需要的表太多,所以不采用手写sql的方式来查询结果,而是在实现类中使用通用mapper来处理所有逻辑(注意处理空leaseAgreement的情况)1,因为lease_agreement表中没有userId,所以无法直接使用本地线程里的userId,但是可以使用username(就是用户手机号)一,获取个人租约基本信息列表接口(多表查询)

2025-05-14 14:33:14 291

原创 【尚庭公寓|开发日记】第七天

该接口与上述的分页查询房间列表的接口类似,只是没有查询过滤条件,较前者的复杂SQL去掉了<where>标签,增加了判断ri.apartment_id=#{id},直接使用到了前者的resultMap="RoomItemVoMap"来调用两个SQL查询graphList和labelList。(2)嵌套查询: 先单独查询主表,然后根据分页参数在主表中查询结果,然后再对主表中查询出的结果与其他表匹配,这样就避免了分页结果出错。@Schema(description = "房间标签列表")

2025-05-14 10:34:42 669

原创 【尚庭公寓|项目日记】第六天

实现preHandle和after...方法,pre...表示在执行所有请求处理之前的逻辑,通过key得到token,解析token,获取userId和username放入到本地线程中l。1,项目采用阿里云的短信通信服务,目前只使用到了该服务的测试功能,只能在测试内的手机号上使用。1,redis里对验证码的过期时间设置过长(10分钟),是否考虑缩短。3,redis查询的验证码不为空,与用户输入的验证码进行比较。5,如果用户信息为空说明是新用户,然后注册用户。5,添加用户密码登录功能,与手机号登录一起。

2025-05-12 16:52:16 291

原创 docker部署RabbitMQ无法访问后台管理问题

docker部署rabbitMQ无法访问web后台管理页面的问题及解决方法

2025-04-26 12:33:22 471

原创 springboot和mybatisplus的版本匹配与整合问题:Invalid bean definition with name ‘xxxMapper‘ defined in flle解决方法

关于springboot和mybatisplus的版本匹配与整合问题与Invalid bean definition with name ‘xxxMapper‘ defined in flle问题解决方法

2025-04-25 13:44:58 1546

原创 minio服务启动失败 “Variable MINIO_VOLUMES not set in /etc/default/minio“; exit 1; 解决方法

Linux上启动minio服务失败遇到ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=217/USER)问题可能的解决方法

2025-04-22 23:49:14 668

空空如也

空空如也

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

TA关注的人

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