自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【无标题】

在我的项目中,Redis 主要用于三类场景:第一是作为缓存层,缓存用户信息、商品信息等热点数据,主要使用 String 和 Hash;第二是利用 Redis 的数据结构特性,比如 List 做简单队列,Set 做去重,ZSet 做排行榜;第三是在分布式场景下,将原来单机内存中的状态和锁抽到 Redis 中,实现服务无状态化,比如登录状态、验证码、分布式锁和计数器等。

2026-02-26 16:43:43 667

原创 【无标题】

MyBatis 是一个持久层框架(半 ORM 框架),本质上是对 JDBC 的封装。它的核心特点是:👉开发者自己编写 SQL👉参数封装结果集映射为对象连接获取与释放异常处理你只管写 SQL,不用再写 JDBC 的样板代码。MyBatis 中常见的执行器有三种:SimpleExecutor,每次执行都会创建新的 Statement,用完即关闭;ReuseExecutor,会对 Statement 进行复用,减少创建开销;

2026-02-25 16:11:43 627

原创 【无标题】

PC计数器用于记录当前线程正在执行的字节码指令位置,是 JVM 实现程序顺序执行和线程切换后恢复执行位置的关键。虚拟机栈虚拟机栈里有一个东西叫栈帧,栈帧里有三个东西。一个叫局部变量表,局部变量表是用于存储方法中的局部变量和方法参数等临时数据。一个是操作数栈,操作数栈跟局部变量表的存储方式本质无太大区别,但是访问方式却有着很大差异,操作数栈是通过标准的入栈出栈执行一次数据访问。最后一个是用来指向方法区或常量池的指针。这三个东西统一在栈帧里,而栈帧又包含在虚拟机栈里。

2026-02-24 15:45:22 564

原创 【无标题】

Java 中普通集合类大多是线程不安全的,比如 ArrayList、HashMap 等,在多线程场景下需要额外处理。早期线程安全集合如 Vector、Hashtable 通过 synchronized 保证线程安全,但并发性能较差。JUC 包中提供了高性能线程安全集合,如 ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue,它们通过更细粒度锁、CAS 或读写分离来提高并发性能。

2026-02-23 21:23:03 696

原创 随记-----

保证了线程安全,不可变不能修改,保证了线程安全。保证安全,通常用于保存一些敏感信息,如果可变,可能会被修改。优化性能:string因为是不可变的,所以存放在一个字符串常量池中,当你创建多个相同内容的String时,JVM会使用同一个对象而不是创建多个相同的String对象,从而节省内存。不变的对象可以实现共享HashMap没有实现方法同步,在多线程访问时存在线程安全问题。

2025-09-20 18:04:17 1042

原创 Linux常见命令

使用more查看/etc/sudo.conf文件,可以显示百分比,回车可以向下一行,空格可以向下一页,q或者ctrl+C可以退出查看。可以让普通用户具有临时使用root权限的权利。rwx:r代表可读,w代表可写,x代表该文件是一个可执行文件,如果rwx任意位置变为-则代表不可读或不可写或不可执行文件。在 ps -ef 的输出中,第二列是 PID(进程 ID),所以 {print $2} 就是打印 进程 ID。示例:给aaa.txt文件权限改为可执行文件权限,aaa.txt文件的权限是-rw-------

2025-09-08 22:11:34 1494 1

原创 Java-面试八股文-JVM篇

Java 堆是 JVM 管理的一块用于存放 Java 对象实例(以及数组)的运行时内存区域。它是所有线程共享的堆内存区(与线程私有的栈、程序计数器不同)。JVM 的垃圾回收器(GC)主要作用于堆:及时回收不再被引用的对象,防止内存泄漏/耗尽。虚拟机栈(JVM Stack)是 JVM 为每个 Java 线程创建的私有内存区域。栈由若干**栈帧(StackFrame)**组成:每个方法调用对应一个栈帧,栈帧里保存方法的局部变量表、操作数栈、常量池引用和返回地址等。线程结束时其虚拟机栈被回收。举例。

2025-09-07 17:46:22 1680 4

原创 Java-面试八股文-并发编程篇

对比点run()start()是否启动新线程❌ 不会✅ 会执行者仍是当前线程(一般是 main)新建一个子线程调用次数可以反复调用只能调用一次(否则抛本质普通方法JVM 调度,触发线程生命周期CAS 即compare And Swap (比较并交换),是一种原子操作。比较内存中某个变量的值是否等于预期值;如果相等,就更新为新值;如果不相等,说明被其他线程改过了,更新失败。我先假设别人不会改,如果发现别人改了,就重试。CAS = 乐观锁思想 + CPU 原子指令支持。

2025-09-05 16:36:23 769

原创 面试八股文-java常见集合篇

操作红黑树复杂度说明查找O(log n)树高 ≤ 2log(n+1)插入O(log n)最多 2 次旋转,若干次染色删除O(log n)最多 3 次旋转,若干次染色定义:散列表是一种根据关键码(Key)直接访问数据的存储结构。核心思想:通过哈希函数(Hash Function)把Key映射到数组下标,然后在该位置存储对应的Value。优势:查找、插入、删除的平均时间复杂度都可以做到O(1)。Key: "Tom" → Hash 函数 → 位置 5。

2025-09-02 00:26:29 956

原创 八股文面试-消息中间件篇

死信交换机(Dead Letter Exchange, DLX)是 RabbitMQ 中非常重要的一个机制,用来处理无法被正常消费的消息。可以把它理解成消息的“回收站”机制:👉 当一条消息在队列中变成“死信”时,RabbitMQ 会自动把它转发到死信交换机(DLX),再由 DLX 路由到另一个指定的死信队列(DLQ)。消息在以下情况会变成死信(Dead Letter)消息被拒绝(Reject/Nack),并且(不重新入队)。消息过期(TTL 到期未被消费)。队列满了。

2025-09-01 01:06:29 1097

原创 Java-面试八股文-Mysql篇

隔离级别脏读不可重复读幻读性能读未提交(RU)✅✅✅高读已提交(RC)❌✅✅较高可重复读(RR)❌❌✅(InnoDB 可避免)中串行化❌❌❌低特性悲观锁乐观锁思想假设一定会冲突假设大部分不会冲突实现for update、数据库排他锁、Java同步锁版本号 / 时间戳机制并发性能低高适用场景写多、冲突频繁读多写少、冲突少函数运算要避免,隐式转换要小心不等、OR、前模糊,索引基本挂掉联合索引最左前缀,范围之后不再用区分度低索引没用,优化器说了算对比项。

2025-08-29 22:46:05 2834

原创 Java-八股文面试-java框架篇

方法上加,或者类上加一级缓存:成品对象(singletonObjects)。二级缓存:半成品对象(earlySingletonObjects)。三级缓存:对象工厂(singletonFactories),用于创建早期代理对象。它的核心目的就是解决单例 Bean 的循环依赖问题。一级缓存:装成品。二级缓存:装半成品。三级缓存:装工厂(用来生成半成品,支持代理)。逐级过渡,解决单例 Bean 的循环依赖,并兼容 AOP 代理。

2025-08-27 00:58:32 445

原创 Java-面试八股文-Java高级篇

区域线程共享作用程序计数器❌ 私有记录字节码执行行号JVM 栈❌ 私有方法调用、局部变量、操作数栈本地方法栈❌ 私有本地方法调用支持堆 (Heap)✅ 共享存放对象和数组,GC 管理的主要区域方法区 (Metaspace)✅ 共享存放类元数据、常量池、静态变量方法/算法特点优缺点应用场景引用计数法计数为 0 即回收无法解决循环引用Java 不用标记-清除标记存活再清除内存碎片老年代(早期)复制算法存活对象复制到另一块空间浪费新生代标记-整理。

2025-08-25 18:53:27 1005

原创 Java-面试八股文-Java基础篇

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。装箱:将基本类型转换成包装类对象拆箱:将包装类对象转换成基本类型的值java为什么要引入自动装箱和拆箱的功能?主要是用于java集合中,List list=new ArrayList();list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。实现原理。

2025-08-24 01:52:28 898

原创 Java八股文-java基础面试题

面向对象是一种编程思想,它把现实世界的事物抽象成程序中的对象,通过对象之间的交互来完成需求。在 Java 中,对象是类的实例,类定义了对象的属性(字段)和行为(方法)。核心思想可以总结为:👉“一切皆对象,通过对象交互解决问题。封装、继承、多态。封装:隐藏细节,只暴露接口(对内保护)。继承:代码复用,类之间有层次(对上复用)。多态:同一接口,多种实现(对外灵活)。面向对象:通过这三大特性,把现实世界的对象抽象成代码里的类和对象,用对象的交互来解决问题。定义:使用abstract。

2025-08-23 16:34:36 906

原创 Redis-主从集群+主从同步+哨兵机制

优化点原因与目的推荐配置/做法启用无磁盘复制避免RDB写磁盘I/O,提升同步效率控制Redis单节点内存占用降低RDB触发的IO/系统负载每节点内存建议 ≤ 20GB增大复制积压缓冲区提高增量同步成功率,避免全量同步限制slave数量,链式复制减轻master压力,提高同步稳定性1主-1从-多从层次结构简述全量同步和增量同步区别?全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。

2025-08-04 01:25:28 1069

原创 分布式事务-Seata

XA 模式 = 用标准协议 + 两阶段提交,保障多个数据库或资源操作的强一致性,但代价是性能差、扩展性有限。

2025-07-30 01:28:20 1252

原创 微服务保护策略-请求限流+线程隔离+服务熔断

Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站:核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。

2025-07-29 01:23:05 908

原创 黑马商城微服务-下

无论是GatewayFilter还是GlobalFilter都支持自定义,只不过编码方式、使用方式略有差别。自定义GatewayFilter不是直接实现GatewayFilter,而是继承AbstractGatewayFilterFactory。@Component@Override@Override// 获取请求// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行注意该类的名称一定要以GatewayFilterFactory为后缀!

2025-07-28 16:47:05 1066

原创 黑马商城微服务-上

什么时候需要拆分微服务?如果是创业型公司,最好先用单体架构快速迭代开发,验证市场运作模型,快速试错。当业务跑通以后,随着业务规模扩大、人员规模增加,再考虑拆分微服务。如果是大型企业,有充足的资源,可以在项目开始之初就搭建微服务架构。如何拆分?首先要做到高内聚、低耦合从拆分方式来说,有横向拆分和纵向拆分两种。纵向就是按照业务功能模块,横向则是拆分通用性业务,提高复用性服务拆分之后,不可避免的会出现跨微服务的业务,此时微服务之间就需要进行远程调用。微服务之间的远程调用被称为RPC,即远程过程调用。

2025-07-27 01:02:35 1203

原创 docker-基础入门

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。html:放置一些静态资源conf:放置配置文件如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。我们创建了两个数据卷:conf、html。

2025-07-25 22:24:22 758

原创 Mybatis-Plus-进阶

逻辑删除 = 数据保留 + 状态标记 + 查询自动过滤你还可以告诉我你的实际业务场景,我可以帮你配置或优化逻辑删除。MALE(1, "男"),FEMALE(0, "女");// 根据数据库存储值返回枚举实例通用枚举提供了枚举类型与数据库字段值自动转换的能力,简化了数据存取的复杂度。通过@EnumValue和@EnumField注解,你可以轻松地将 Java 枚举与数据库中的整数值或字符串值进行映射。适合用于存储有限状态、类型的字段(如性别、状态等)。@Data。

2025-07-25 17:25:07 886

原创 Mybatis-Plus基础入门

为了简化单表CRUD,MybatisPlus提供了一个基础的BaseMapper接口,其中已经实现了单表的CRUD,只需要子类继承父类接口就可以了:因此我们自定义的Mapper只要实现了这个BaseMapper,就无需自己实现单表CRUD了。

2025-07-24 23:01:40 1228

原创 ThreadLocal-底层原理+内存泄漏

特性说明本质每个线程持有自己的变量副本,保存在 ThreadLocalMap 中存储位置泄漏原因ThreadLocal 被回收,但 value 强引用未清理,线程又长期存活(如线程池)解决方案显式调用;不要在线程池中滥用场景是否泄漏是否严重普通线程不容易泄漏(线程结束,ThreadLocalMap 一起销毁)不严重线程池线程易泄漏(线程长期存活)严重,尤其是 value 是大对象。

2025-07-21 11:24:21 1001 1

原创 黑马点评-探店+好友关注+附近商户+用户签到+UV统计

探店笔记类似点评网站的评价,往往是图文结合。对应的表有两个:tb_blog:探店笔记表,包含笔记中的标题、文字、图片等tb_blog_comments:其他用户对探店笔记的评价发布谈点博文包括两个接口:图片上传接口和博文上传接口。注意SystemConstants.IMAGE_UPLOAD_DIR需要修改自己图片所在的地址,在实际开发中图片一般会放在nginx上或者是云存储上。

2025-07-20 22:32:33 1007

原创 黑马点评-秒杀优化和消息队列

秒杀业务的优化思路是什么?先利用Redis完成库存余量、一人一单判断,完成抢单业务再将下单业务放入阻塞队列,利用独立线程异步下单基于阻塞队列的异步秒杀存在哪些问题?内存限制问题数据安全问题。

2025-07-20 01:37:34 771 1

原创 黑马点评-分布式锁

Redisson 实现分布式锁相比使用 SETNX(setIfAbsent)手动实现锁,更加健壮、安全、易用。下面我来从多个角度详细讲清楚:🚫 使用 SETNX 手动实现分布式锁的缺点虽然表面上锁是加上了,但会遇到多个严重问题:❌ 缺点一:锁过期未续期,业务超时导致锁提前释放比如你设置过期时间是 10 秒,但业务处理了 15 秒,那锁早就被 Redis 自动删了。此时:其他线程以为锁释放了,就进来了实际上第一个线程的逻辑还在执行,并发问题就发生了。

2025-07-19 21:53:58 1125

原创 黑马点评-分布式锁

在 集群环境 中(多台服务器部署、负载均衡):Java 的 synchronized、Lock 只能锁住当前 JVM;不同机器之间是独立的内存,无法共享锁;所以需要一个**“全局可见、跨 JVM 实例”的锁机制**;✅ 分布式锁的目标是:同一资源,在同一时间只允许一个线程访问(即使在多个服务器中)。分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路。分布式锁他应该满足一些什么样的条件呢?Mysql:

2025-07-19 18:25:50 1062

原创 黑马点评-优惠券秒杀

一、避免主键冲突在分布式系统中(比如微服务、分库分表),如果各个节点或服务自己生成 ID,就有可能出现重复。使用全局唯一ID,能确保:各节点生成的 ID 在全系统中不重复;数据插入数据库时不会因为主键冲突而失败。二、支持分布式部署传统数据库的自增ID无法满足多机部署,比如:多个 MySQL 实例无法共享自增ID;即使通过步长控制(如一台步长为2,起始为1,另一台起始为2),仍存在管理复杂、易出错的问题。

2025-07-19 14:55:54 698

原创 黑马点评-缓存

缓存穿透产生的原因是什么?

2025-07-18 18:42:18 991

原创 黑马点评实战——短信登陆

双拦截器的设计,让登录状态校验和 token 自动续期解耦:RefreshTokenInterceptor 专注于:token 解密 + 用户还原 + Redis 续期LoginInterceptor 专注于:判断用户是否存在(是否登录)

2025-07-18 00:05:38 1042

原创 Redis基础入门

关系型数据库基于磁盘存储,需要耗费大量磁盘IO,非关系型则基于内存操作,读写性能较好。不建议,多存储的字段带来内存开销使用为了节省内存空间,我们可以不使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。注意:因为是字符串的,所以存储和获取要手动序列化和反序列化。

2025-07-17 15:42:57 858 1

空空如也

空空如也

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

TA关注的人

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