- 博客(50)
- 收藏
- 关注
原创 InnoDB索引的原理
在鹅厂后端开发一面,我遇到了如题这样一个比较宽泛的问题,当时可能只是背了相关概念,对于索引的了解不是很深刻。最近,我花了很大的功夫去深入了解MySQL的索引。
2025-05-02 21:25:44
280
原创 seata分布式事务模式选择
尤其是跨多个服务的业务场景,通常通过一系列本地事务来实现最终一致性。AT 模式适用于简单的 CRUD 操作,通过自动管理事务来简化开发。,通过预留资源的方式来保证事务的一致性。,通常通过两阶段提交(2PC)来实现。SAGA 模式适用于。
2025-03-19 19:55:49
878
2
原创 优化 vvhub 微站首页加载速度:从图片缓存到格式压缩的实战记录
缓存优化:Nginx 的 Gzip 和 expires 设置能提升重复访问效率,但对首次加载帮助有限。硬件升级:带宽从 5M 到 30M 解决了视频播放问题,也为图片加载提供了基础保障。格式选择:从 PNG 到 WebP 的转变是关键,现代图片格式(如 WebP、AVIF)是性能优化的利器。如果条件允许,未来我还想尝试引入 CDN 和 AVIF 格式,进一步提升加载速度。不过,目前的方案已经让 vvhub 微站的首页焕然一新,用户反馈也非常积极。
2025-03-16 09:52:26
971
原创 CompletableFuture
是 Java 8 引入的一个用于异步编程的类,它是 Future 接口的增强版本。runAsync()allOf()anyOf()handle()这些是 CompletableFuture 的基础用法,它能大大简化异步编程的复杂度。需要注意的是,CompletableFuture 默认使用 ForkJoinPool.commonPool(),在生产环境中可能需要考虑使用自定义的线程池。
2025-03-01 19:52:44
563
原创 Redis持久化方案RDB和AOF
RDB通过周期性快照实现快速恢复,但可能丢失数据;AOF通过记录命令保证数据安全,但需重写优化文件大小。两者各有适用场景,实际中可根据需求灵活组合。
2025-02-28 10:18:46
1267
原创 基于Redis 的分布式 session 图解
给 SessionRepository 创建新的会话。sessionRepository 在 Redis 中创建新会话,保存会话的变更,更新Redis 中的会话数量, HMSET 更新 会话数量,重置过期时间。业务处理中可能发生修改 会话数量,如果有 SpringSessionFiliter 调用。获取会话, SessionRespository 查询 Redis 中的 会话数量,如果 该sessionID 存在,通过 该sessionID 从。创建完成后,返回 新的session 对象给。
2025-02-25 21:32:24
605
原创 MySQL复合索引的最左匹配原则
折腾了这一圈,我算是把最左匹配原则摸透了点。从左开始:复合索引得从最左列用起,跳过了开头就废了。中间断裂没事:只要开头对了,后面跳过几列还能用点索引。OR是大杀器:一旦条件里混了OR,索引基本就歇菜了,除非你能优化成别的形式。这让我想起之前写代码踩的坑。有次我给个查询加了个复合索引,结果性能还是烂,后来发现条件顺序没对上,白忙活一场。从那以后,我每次建索引前都会先想想查询习惯,省得费力不讨好。
2025-02-24 10:18:03
1300
原创 Docker入门及基本概念
- 同一个镜像可以创建多个容器 - 每个容器都是镜像的运行实例有点类似与JavaSE 中的 类和对象,让我用面向对象的概念来进一步解释:镜像(Image) => 类(Class)- 是一个模板- 包含了所有必要的代码和依赖- 是只读的- 可以被多次使用来创建不同的容器- 不能直接运行,需要实例化成容器容器(Container) => 对象(Object)- 是镜像的运行实例- 有自己的状态和数据- 可以启动、停止、删除- 多个容器可以基于同一个镜像创建- 每个容器都是
2025-02-23 14:41:30
1051
原创 如何将公钥正确添加到服务器的 authorized_keys 文件中以实现免密码 SSH 登录
这样,你就完成了将公钥添加到文件的操作,现在你应该能够使用对应的私钥进行免密码登录。
2025-02-22 21:30:23
2103
原创 Redis常见数据结构及其在项目中用法
Redis 可以使用 String 数据类型和 INCR 命令来统计访问量。这将创建一个名为page_views的键,并将其初始值设置为 0。如果该键已经存在,则会覆盖其值。每次有页面访问时,都执行INCR命令。这将原子性地将page_views键的值增加 1。这将返回page_views键的当前值,即当前的访问量。在这个例子中,page_views键的值从 0 开始,每次访问后递增,最后通过GET命令获取到当前的访问量为 3。
2025-02-20 22:37:43
872
原创 Sa-Token 的多账号认证特性(Kit 模式)
的用法本质上是利用 Sa-Token 的多账号特性,将“团队空间”权限管理独立出来,避免与原有体系混淆。它通过独立的StpLogic实例实现会话和权限的隔离,既保持了代码的模块化,又提高了项目的扩展性。实际应用中,这种设计特别适合有多种权限场景的复杂系统。
2025-02-20 09:14:03
1171
1
原创 反射机制的简单示例
这个示例展示了反射机制在实际业务中的应用,通过反射我们可以在运行时动态获取类的信息,实现更加灵活和通用的功能。一个使用反射机制的简单示例,这个示例将展示如何使用反射来实现一个通用的数据导出功能。
2025-02-18 21:08:15
409
原创 枚举类在实际开发中的基础用法
让我们创建一个PENDING,SHIPPED,DELIVERED,CANCELLED: 这声明了一个名为的枚举。enum是 Java 中专门用于创建枚举类型的关键字。: 这些是枚举常量,代表我们订单状态的可能值。按照惯例,枚举常量通常用大写字母书写。// ... 其他订单详情 ...// 创建一个状态为 PENDING 的订单System.out.println("订单状态: " + order1.getStatus());// 输出: 订单状态: PENDING。
2025-02-17 10:35:53
1090
原创 演示synchronized锁机制用法的简单Demo
关键点说明synchronized范围基于用户ID的细粒度锁,不影响其他用户操作保证相同userid得到的String是同一个对象(来自字符串常量池)事务边界在锁范围内包含整个事务操作(确保查询和插入操作的原子性)性能影响只对相同用户的并发请求串行化处理,不影响不同用户的并发处理适用场景需要基于特定维度(如用户ID)进行并发控制的场景先观察不加锁时的并发问题再体验加锁后的线程安全效果最后尝试调整userId观察不同用户的并发情况。
2025-02-16 00:00:15
1255
原创 【图片展示优化】OutPutSize极大压缩图片体积
下面详细说明:在 VueCropper 组件中新增了 outputSize 属性,并设置为 0.8,意思是输出图片的质量为 80%。默认情况下,outputSize 的值为 1(即100%的质量),通过降低这个值,可以在输出图片时对图片质量进行压缩,从而有效地减小生成图片的文件大小,而不会改变图片的像素尺寸或后端逻辑。依然采用 webp 格式输出图片。webp 格式本身就比 JPEG 或 PNG 在相同画质下拥有更小的文件体积。配合降低的 outputSize,就能使硬盘占用进一步减少。2. 图片二
2025-02-13 18:35:02
1140
原创 Python虚拟环境管理工具 pyenv
但是我本地已经有了一个3.12解释器,有没有一种方法,可以管理python 环境,还可以随意切换。下一步是查看可供安装的 Python 版本列表,这里我以 Python 3.10 安装为例子,特别是找到 Python 3.10 的具体版本号。请执行这两个命令,并告诉我显示的 Python 版本是否正确(应该显示 Python 3.10.11)。这个命令会显示所有已安装的 Python 版本,并且会在当前使用的版本前面标记一个星号(*)。下一步是将 3.10.11 设置为当前项目使用的 Python 版本。
2025-02-12 19:05:07
583
原创 Redis+Caffeine多级缓存架构代码实战
使用 MD5 对查询参数进行 hash 化,确保缓存 key 唯一性;实现了两级缓存(本地缓存 + Redis 分布式缓存),提高数据查询速度并降低数据库压力;设置适当的缓存过期时间和随机化TTL,防止缓存雪崩;对查询参数进行严格校验,既保护系统资源,又确保用户只能获取符合审核要求的数据。这种双缓存策略属于常见的“先查询本地缓存,再查询分布式缓存,最后查询数据库,更新缓存”的应用场景,适用于高并发系统中对响应时间和数据一致性要求较高的场景。
2025-02-11 11:50:55
1551
1
原创 虚拟机+Docker配置主机代理和常见配置
注意事项:确保宿主机的代理软件已开启确保代理软件允许局域网访问确保使用正确的宿主机IP地址所有修改配置后都需要重启相关服务。
2025-02-10 17:40:14
921
1
原创 设计模式实战运用之模板方法模式
使用 Object 类型:适用于输入源类型不确定或多样化的场景,代码简单直接,但缺乏类型安全性,容易在运行时出现类型转换错误。使用泛型:适用于输入源类型明确的场景,提供了编译时的类型检查,增强了代码的类型安全性和可读性,但增加了代码的复杂性。
2025-02-07 12:14:47
1340
原创 【代码可复用!】腾讯云 COS 对象存储管理与文件上传封装
使用CosManager和类的前提是开通腾讯云对象存储(COS)和数据万象(CI)服务,并完成相关配置。通过合理的设计和封装,您可以轻松实现文件的上传、下载、处理等功能,提升开发效率并降低维护成本。希望本文的详细说明能帮助您顺利使用腾讯云 COS 和 CI 服务,并为您的项目提供高效稳定的文件管理能力。通过CosManager和两个类的封装,我们实现了对腾讯云 COS 服务的统一管理,简化了文件上传和处理的流程。这种设计不仅提高了代码的复用性,还增强了系统的可维护性和安全性。
2025-02-06 10:20:02
1123
原创 如何安全地管理Spring Boot项目中的敏感配置信息
在开发Spring Boot应用时,我们经常需要处理一些敏感的配置信息,比如数据库密码、API密钥等。
2025-02-04 22:20:41
809
原创 Springboot项目开发的通用集成
在 IDEA 中新建项目,选择 Spring Initializr 模板,考虑到稳定性,此处选择创建 Java 8 版本的项目。注意需要替换 Server URL 为,因为官方的 Server URL 不支持选择 Java 8。配置如图:选择版本,可以根据自己的需要添加一些依赖,比如修改资源目录下的配置文件为 application.yml,指定项目启动的端口号和访问地址前缀、项目名称、数据库配置等。
2025-01-31 22:27:51
840
原创 Springboot简化了Spring的哪些配置
- 快速启动:Spring Boot 提供了简洁的配置和开箱即用的功能,减少了项目启动时所需的配置工作,开发者可以专注于业务逻辑。- 简化的配置管理:Spring Boot 的自动配置机制大大减少了开发者手动配置的繁琐工作,尤其是在集成数据库、消息队列、安全性等复杂组件时,开发者可以通过少量配置完成集成。- 内置 Web 服务器:Spring Boot 内置了常用的 Web 服务器,使得开发者可以直接运行 Web 应用,而无需部署到外部服务器。- 强大的生态系统:Spring Boot 集成了 Spr
2025-01-25 17:43:15
1273
原创 Springboot 的启动流程【超级详细 | 附带思维导图】
中,请求的处理是通过一系列的过滤器(Filter)来实现的。发布应用已启动事件(ApplicationStartedEvent)的主要作用是提供一个时机点,让我们能在应用完全启动后,但在开始接收请求之前执行一些初始化操作。这个事件的触发标志着应用已经完全启动,所有的核心组件都已经初始化完成,可以开始处理业务请求了。这个阶段完成后,所有的Bean都已经创建完成并完成了依赖注入,应用程序已经准备好处理请求了。这个阶段是应用启动的最后一步,适合执行一些初始化操作,但要注意不要影响应用的正常启动。
2025-01-25 16:20:14
1617
原创 MySQL 的索引类型【图文并茂】
【代码】MySQL 的索引类型【图文并茂】. 聚集索引和非聚集索引,也被称为聚簇索引和非聚簇索引,它们不是像唯一索引或主键索引那样的索引类型,而是根据物理存储方式区分的。简单来说,InnoDB 存储引擎使用的是聚集索引,而 MyISAM 存储引擎使用的是非聚集索引。2. 聚集索引的特点是索引和数据存储在同一个文件中。- 在InnoDB中,数据和索引存储在 .ibd 文件中,索引的叶子节点直接包含数据。- 而非聚集索引,如 MyISAM,则将索引和数据分开存储在不同的文件中。其中,.MYI 文件存储索引
2025-01-25 12:04:40
554
原创 Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析
头:将用户的认证令牌添加到请求头中。处理响应:如果请求成功,解析并返回响应数据;如果失败,抛出错误。因为目标服务器不支持 CORS,前端需要通过代理服务器(或 Worker)绕过同源策略限制。发起跨域请求:使用 fetch 直接向目标服务器 (Worker 脚本根据路由规则(case ‘/proxy/upload’)调用。为什么加了proxy/upload就变成了后端服务器呢?的服务器环境中),因此这个路径对应的逻辑属于后端。时,请求会被 Worker 脚本捕获。4.前端直接发起跨域请求的代码。
2025-01-24 23:22:47
1715
原创 Git上传了秘钥如何彻底修改包括历史记录【从安装到实战详细版】
然而,随着项目的迭代和开发,一些敏感信息(如 API 密钥、数据库密码等)可能会被意外提交到代码库中。这些敏感信息一旦暴露在公共或私有仓库中,可能会引发严重的安全问题,例如数据泄露、未授权访问或恶意攻击。修改前的历史依然保留。如果这些敏感信息被提交到 Git 历史中,即使后续从代码中移除,它们仍然会存在于 Git 的历史记录中。因此,我们需要一种更强大的工具来重写 Git 历史,确保敏感信息被完全移除或替换。,开发者可以安全地重写 Git 历史,确保代码库中不再包含任何敏感信息,从而提升项目的安全性。
2025-01-24 14:26:55
1137
原创 MySQL 中如何进行 SQL 调优?
平时进行 SQL 调优,主要是通过观察慢 SQL,然后利用 explain 分析查询语句的执行计划,识别性能瓶颈,优化查询语句。
2025-01-22 19:59:23
2945
原创 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
id : 查询的执行顺序的标识符,值越大优先级越高。简单查询的 id 通常为 1,复杂查询(如包含子查询或 UNION)的 id 会有多个。重要):查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、SUBQUERY(子查询)等。table : 查询的数据表。type (重要):访问类型,如 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。。possible_keys : 可能用到的索引。key (重要):实际用到的索引。
2025-01-22 15:21:48
1579
原创 Mysql 默认隔离级别&分布式锁&乐观锁
jvm本地锁:三种情况导致锁失效 吞吐量: 600多例模式事务:Read Uncommitted集群部署一个sql语句:更新数量时判断 吞吐量:2000解决:三个锁失效1. 锁范围问题 表级锁 行级锁2. 同一个商品有多条库存记录3. 无法记录库存变化前后的状态悲观锁:select … for update解决了 2 中 的 2,3 两个情况 吞吐量: 600> JVM 本地锁1. 性能问题。
2025-01-21 22:30:40
1028
2
原创 基于Springboot+Redis秒杀系统 demo
基于SpringBoot+Redis的商品秒杀系统的Demo。这个例子将展示如何防止商品超卖。
2025-01-18 11:04:45
735
原创 布隆过滤器解决缓存穿透-Springboot代码示例
缓存穿透:指查询一个不存在的数据,缓存中没有相应的记录,每次请求都会去数据库查询,造成数据库负担加重。实现了完整的缓存策略:布隆过滤器->Redis缓存->MySQL数据库
2025-01-17 19:17:49
535
原创 springboot全局异常处理示例
定义一个异常类抛出@AutowiredthrownewInvalidParameterException("用户ID:"+id);全局异常异常处理器importorgresponse.put("message","参数错误:"+ex.getMessage());}}response.put("message","参数错误:"+ex.getMessage());}}
2025-01-17 17:25:07
1065
原创 【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结
虽然给API gateway分配了https,但是它转发的另外两个模块的端口没有分配HTTPS导致请求转发错误。原因:前端使用 HTTPS,但后端服务未正确配置 SSL 证书。由于前端首先请求是到达。原因:网关路由配置使用服务名而非具体地址,导致服务发现失败。
2025-01-16 09:52:31
1119
原创 【前后端联调】字段名对应错误
具体来说是在尝试读取一个对象的 length 属性时,该对象是 undefined。访问一个未定义(undefined)对象。点击报错位置,显示这里有问题,说明。这种错误通常表示代码尝试。
2025-01-15 20:00:18
373
原创 springboot 项目配置https
现在我们可以看到Java应用是以www用户运行的。下一步需要修改keystore.p12文件的权限,让www用户可以读取。第一步,让我们在 Spring Boot 配置文件中添加 SSL 配置。首先,我们需要将现有的 SSL 证书转换为 Java 可用的 PKCS12 格式。执行时会要求输入密码,请记住这个密码, 这个密码就是配置到上述。2. 修改前端的 nginx 配置中的代理设置。下一步:运行以下命令查看文件。
2025-01-15 19:57:07
1419
原创 ip_port申请SSL+部署
这次给大家介绍的 ZeroSSL,也是一家类似 Let’s Encrypt 的证书签发商,注册成为他们的免费用户就可以签发出 90 天有效期的证书,但是不同的是,他们家能签发 IP 的 SSL 证书哦,这个就比较少见了~这一步就是选择申请证书的有效时间的,他默认选择的是 1-Year 一年的,记得要换成 90-Day Certificate(90 天有效期),一年的证书是要花钱才能用的。说起 IP SSL 证书,可能有些人不解,我们平时都是用域名访问网站的,为什么要专门给 IP 签发证书呢?
2025-01-15 16:14:30
967
1
原创 ReadStackLog源码阅读
该线程不断地进入睡眠状态(: 该线程进入等待状态(WAITING),等待一个对象的通知。和: 这两个线程尝试获取同一个锁(由于先获得锁,将一直被阻塞(BLOCKED:进入睡眠状态,展示了。:进入等待状态,展示了WAITING。和获得锁后进入睡眠状态,展示了。因为锁被占用而进入阻塞状态,展示了BLOCKED。通过使用jps和jstack工具,你可以观察到这些线程的具体状态及其调用堆栈。这对于理解 Java 线程状态和调试多线程应用非常有帮助。释放锁:在。
2025-01-13 10:35:12
806
原创 Docker安装nacos(图文并茂,避免踩坑,一步到位)
安装之前你需要准备一个mysql,当前安装方式是将数据持久化到数据库中的,这里的部署是单机模式PS:这是拉取最新的nacos版本,如果需要拉取别的版本可以加:版本号(如:docker pull nacos/nacos-server:v2.2.0)
2025-01-13 10:13:11
8727
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人