- 博客(36)
- 收藏
- 关注
原创 LeetCode-33.搜索旋转排序数组-二分查找
题干描述的是一个经过向左旋转的升序整数数组(原数组元素互不相同,旋转后分为两段各自升序的子数组,如 [4,5,6,7,0,1,2]),需要在数组中查找目标值 target,找到则返回其下标,未找到返回 - 1,且要求算法时间复杂度为 O (log n),这意味着必须采用二分查找的思路,因为只有二分能达到该时间复杂度。但当前模版的分支判断是。可能存在的区间,进而收缩左右指针 —— 这本质是把 “部分有序” 的旋转数组,转化为每次二分后的 “单一有序区间”,再套用类似基础二分的边界处理逻辑。
2025-10-10 14:45:39
671
原创 面试题-网络协议
DDoS 攻击(分布式拒绝服务攻击)是攻击者通过控制大量 “傀儡机”(如被感染的电脑、物联网设备),向目标服务器或网络发起海量无效请求(如 SYN 洪水、UDP 洪水、HTTP 洪水),耗尽目标的带宽、CPU、内存等资源,导致正常用户无法访问服务的攻击方式。而DDos的第一个D是它区别于单点的 DoS 攻击的根本,依赖分布式节点形成的 “流量洪流”,破坏力更强,而且能隐藏攻击者。
2025-09-28 10:00:00
495
原创 面试题-Redis
String 是 Redis 最基础的数据结构,本质是字节序列,可存储文本、数字甚至二进制数据(如图片),最大容量为 512MB。它不仅支持简单的键值存储,还提供了丰富的操作:比如对数字进行自增(INCR)、自减(DECR),实现计数器功能;通过APPEND追加内容;用SUBSTR截取子串等。典型场景包括存储用户 Token、商品库存(用INCRBYDECRBY原子操作更新)、简单的缓存数据等。
2025-09-24 11:05:05
1721
原创 面试题-MySQL
最左前缀法则是联合索引的使用规则,核心逻辑是:要想使用联合索引优化条件查询,必须从联合索引的最左侧字段开始匹配,一次向右连续匹配部分或全部字段,否则联合索引失效,比如多条件查询跳过联合索引中间字段或最左字段,联合索引失效。覆盖索引是指联合索引中包含了查询语句所需的全部字段,包括条件字段查询结果字段等,使用覆盖索引时,无需再回表查询完整行数据,仅通过索引就能满足查询需求,比如查询条件为WHERE a=1且需返回b字段,而联合索引(a,b)恰好包含a和b,此时该索引就是覆盖索引,查询可直接从索引中读取a。
2025-09-19 01:39:15
768
原创 面试题-Java集合
如果键为null,哈希值直接设为0,否则调用获取原始哈希值,在进行二次哈希将高位也参与地址计算,减少哈希冲突。根据哈希值计算数组索引位置,若哈希素组未初始化,将哈希数组初始化容量为16,找到数组索引位置,如果位置为空创建新节点插入,不为空则遍历链表,若有键相同的节点覆盖旧值,没有则在链表尾部插入新节点,若链表长度超过8则将链表转为红黑树,size++并判断负载因子是否超过0.75,超过则扩容数组为当前2倍。
2025-09-12 01:05:25
836
原创 面试题-Java基础
抽象方法,实现类必须实现默认方法(default修饰),实现类可以选择性重写 jdk8+静态方法 只能通过接口名调用 jdk8+私有方法 不能被实现类访问 jdk9+正常情况下,我们获取类的信息(属性,方法,构造器等),操作类(实例化对象,调用方法等)都是基于具体存在的类(导包),这是编译时就确定的而反射允许程序在运行时而非编译时,获取类的信息并操作,通过类的字节码文件(1)创建对象(通过构造器)Class<?// 1. 通过无参构造器创建对象(最常用)
2025-09-12 01:02:04
683
原创 面试题-Spring
创建模块结构:分两个模块 ——「自动配置模块」(含核心配置逻辑)和「启动器模块」(空壳,仅依赖自动配置模块,供外部引入),避免启动器与配置强耦合。编写自动配置类:在自动配置模块中,用定义配置类,通过系列注解(如判断依赖是否存在、允许用户自定义 Bean 覆盖默认)实现条件化配置;用绑定配置文件属性(如),支持用户自定义参数。注册自动配置:在自动配置模块的中,添加org.springframework.boot.autoconfigure.EnableAutoConfiguration=全类名。
2025-09-11 01:01:02
307
原创 MySQL事务及原理详解
回滚按 “逆序” 处理每个 undo log 记录(即先撤销最后执行的操作,再撤销倒数第二个,以此类推),确保数据恢复的正确性。场景 1:撤销 INSERT 操作(基于 Insert undo log)undo log 内容:记录了插入行的完整数据(含主键)。反向操作:根据 undo log 中的主键定位到插入的行,直接删除该行(因为插入的行在事务提交前仅对当前事务可见,删除后其他事务无法感知)。示例:事务内执行INSERT INTO user VALUES (1, '张三')
2025-08-20 22:08:48
894
原创 MySQL InnoDB事务acid特性的原理和隔离级别的实现原理
回滚按 “逆序” 处理每个 undo log 记录(即先撤销最后执行的操作,再撤销倒数第二个,以此类推),确保数据恢复的正确性。场景 1:撤销 INSERT 操作(基于 Insert undo log)undo log 内容:记录了插入行的完整数据(含主键)。反向操作:根据 undo log 中的主键定位到插入的行,直接删除该行(因为插入的行在事务提交前仅对当前事务可见,删除后其他事务无法感知)。示例:事务内执行INSERT INTO user VALUES (1, '张三')
2025-08-20 22:00:05
1149
原创 MySQL原理 索引和锁机制
行锁主要用于控制对单个数据行的并发访问,从而支持更高级别的事务隔离,并减少数据操作冲突,提高系统的并发能力,保证数据的一致性和完整性。例如在高并发的电商订单系统中,对订单表的某一行记录加行锁,可防止多个事务同时修改同一订单数据,避免数据混乱。行锁、间隙锁、临键锁是InnoDB实现事务隔离性的关键机制,其锁定粒度最小,发生锁冲突的概率最低,并发度最高。锁定的是索引记录b本身(行锁),以及该记录之前的间隙(a,b)(间隙锁)。通过单索引包含多列的方式提高多条件查询的效率,是数据库性能优化的重要手段。
2025-08-20 01:26:58
956
原创 【JVM】万字总结GC垃圾回收
在程序运行过程中,会不断创建对象来使用内存,当这些对象不再被引用时,其所占用的内存若不及时释放,会导致内存占用不断增加,最终可能引发内存溢出。GC 机制能自动检测并回收这些不再使用的对象所占用的内存。
2025-06-04 02:02:12
1328
原创 【JVM】Java程序运行时数据区
运行时数据区是Java程序执行过程中管理的内存区域Java 运行时数据区组成(JVM 内存结构)Java 虚拟机(JVM)的运行时数据区由以下核心部分组成:线程私有:程序计数器、Java虚拟机栈、本地方法栈。线程共享:方法区、堆。程序计数器存储当前执行的字节码指令地址。线程私有:每个线程都有独立的程序计数器。多线程场景下程序计数器的工作流程:Thread1CPUThread2执行指令 [PC=15]时间片用完保存PC值(15)恢复执行 [PC=22]执行指令...时间片用完保存PC值(25)恢复执行 [PC
2025-05-30 00:52:28
1489
原创 【JVM】初识JVM 从字节码文件到类的生命周期
JVM(Java Virtual Machine)即 Java 虚拟机,是 Java 技术的核心组件之一。JVM的本质就是运行在计算机上的一个程序,通过软件模拟实现了一台抽象的计算机的功能。JVM是Java程序的运行环境,负责加载字节码文件,解释并执行字节码文件,同时有着内存管理、垃圾回收等功能。不同系统上的JVM将同一份字节码文件解释为该系统能执行的机器码是Java能一次运行到处编译的关键。
2025-05-29 01:49:12
1277
原创 【Redis原理】四万字总结Redis网络模型的全部概念
当用户进程发起IO请求后,若内核数据未就绪,立即返回错误,用户程序可继续执行其他任务,并通过轮询机制主动检查多个文件描述符的就绪转态。fill:#333;
2025-05-27 08:00:00
1326
原创 深入解析IO模型:从阻塞到多路复用
当用户进程发起IO请求后,若内核数据未就绪,立即返回错误,用户程序可继续执行其他任务,并通过轮询机制主动检查多个文件描述符的就绪转态。fill:#333;
2025-05-27 01:03:43
795
原创 深入解析操作系统内核与用户空间以及内核态与用户态转换
用户空间和内核空间的划分是现代操作系统的基础,对应用程序网络模型的设计和优化有着深远的影响。
2025-05-26 22:25:28
1146
原创 【Redis】数据结构汇总
我们知道Redis是一个键值型(Key-Value Pair)的数据库,我们可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。哈希表(DictHashTable)哈希节点(DictEntry)和字典(Dict)// 哈希表结构// 哈希桶数组(链式存储)// 哈希表大小(桶数量,2^n)// 哈希掩码(size-1,用于计算索引)// 已使用的桶数量(含链表节点)} dictht;// 字典结构// 类型特定函数(如哈希函数、键比较函数)
2025-05-26 02:17:37
2726
原创 【Redis原理篇】五大基本数据类型的底层编码方式
Hash底层采用的编码与Zset基本一致,只需要把排序有关的SkipList去掉即可。元素(member)和分数(score)成对存储,按分数升序排列。修改embstr字符串(因embstr内存不可变)。(按2的次方分配内存)的64B内存块,减少碎片)。:需重分配内存并移动数据,时间复杂度 O(n),**适用范围:**64位整数(**实现:**直接将数据存储在。**适用条件:**字符串大小<:连续内存块存储,无指针开销。
2025-05-26 02:11:03
753
原创 【redis原理篇】底层数据结构
数据类型(typeRedis 支持 5 种基础数据类型,由typeOBJ_STRING:字符串(简单值、计数器、二进制数据)。OBJ_LIST:列表(队列、栈、阻塞队列)。OBJ_HASH:哈希(对象属性存储)。OBJ_SET:集合(唯一性集合、交并差运算)。OBJ_ZSET:有序集合(排行榜、范围查询)。
2025-05-26 00:47:29
1492
原创 【Redis】分布式缓存的一系列问题(持久化,主从集群,哨兵,分片集群)
Redis 持久化是将内存中的数据保存到磁盘,防止服务重启或故障时数据丢失的核心机制。:解决 AOF 文件膨胀问题,生成更紧凑的新 AOF 文件(等效当前数据库状态的最小命令集合)。,通过数据分片、节点自治和高可用机制,实现水平扩展和高并发场景下的高性能服务。Redis 分片集群(Cluster)是 Redis 官方提供的。:客户端首次连接集群时,随机选择一个节点获取完整的槽分布信息((文本格式)实现持久化,重启时重放命令恢复数据。发送缓冲区中的新写命令(同步期间的增量数据)
2025-05-24 16:26:48
1148
原创 【Redis实战篇】基于Redis的功能实现附近商铺查询(Geo),用户签到与统计(Bitmap),网站UV统计(HyperLogLog)
【Redis实战篇】基于Redis的功能实现附近商铺查询(Geo),用户签到与统计(Bitmap),网站UV统计(HyperLogLog)
2025-05-22 00:58:54
835
原创 Java 8 Stream 流操作全解析
通过掌握 Stream 流的常见用法,可以显著提升代码的可读性和开发效率,尤其在处理集合数据时,能够以更简洁的方式实现复杂的数据操作。
2025-05-21 19:16:53
2996
原创 【Redis实战篇】Redis三种方法实现消息队列优化秒杀优惠券
Redis Stream 是 Redis 5.0 版本引入的新数据结构,主要用于实现消息队列(MQ,Message Queue)。Redis 原本的发布订阅(pub/sub)虽能实现消息队列功能,但存在消息无法持久化的问题,一旦出现网络断开、Redis 宕机等情况,消息就会被丢弃。而 Redis Stream 提供了消息的持久化和主备复制功能,可让任何客户端访问任何时刻的数据,能记住每个客户端的访问位置,还能保证消息不丢失。
2025-05-19 20:37:12
1339
原创 【Redis实战篇】集群架构下的超卖问题
数据同步问题是一个复杂而重要的课题。在单 JVM 环境下表现出色,但在集群架构下中会出现线程安全问题。通过引入分布式锁机制,如 Redis 实现的分布式锁,可以有效解决跨节点同步问题,确保系统的一致性和可靠性。在实际应用中,需要根据具体场景选择合适的分布式锁实现方式,并注意锁的过期时间、原子性操作等关键问题。
2025-05-18 01:43:22
1018
原创 集群与分布式架构解析:从概念、差异到应用场景的全维度对比
将多个同构化服务器节点组成统一服务池,所有节点运行完全相同的应用程序副本,通过负载均衡机制对外呈现单一服务入口。
2025-05-16 17:42:49
958
原创 实战篇万字总结 | 秒杀优惠卷(全局ID生成器,秒杀超卖问题,乐观锁与悲观锁)
在这个测试方法中,充当了协调主线程和子线程的角色,保证主线程在所有子线程任务执行完成后才继续执行,从而能够精确统计多线程并发执行方法的总耗时。
2025-05-16 03:17:39
1236
原创 Redis实战篇|将解决缓存问题方案封装成工具类
步骤 1:定义缓存策略枚举枚举中每个常量对应一种策略,并通过抽象方法统一执行逻辑。@Override// 参数校验throw new IllegalArgumentException("PASS_THROUGH 策略需设置 time 和 unit");},@Overridethrow new IllegalArgumentException("LOGICAL_EXPIRE 策略需设置 expireTime");
2025-05-15 02:28:27
910
原创 Redis缓存的应用与相关问题(缓存更新策略,缓存穿透,缓存雪崩,缓存穿透)
return Result.fail("店铺不存在");if (json!= null) {return Result.fail("店铺不存在");问题核心区别典型场景核心解决方案缓存穿透数据不存在,恶意攻击查询id=-1的数据布隆过滤器、缓存空值、接口校验缓存击穿单热点数据过期,高并发请求秒杀商品缓存失效互斥锁、逻辑过期、双缓存缓存雪崩大量数据同时失效或服务宕机促销活动后缓存集体过期分散过期时间、多级缓存、集群容灾。
2025-05-14 02:00:01
1458
原创 用HttpSession完成登陆与校验与其产生的问题和解决方案
以上几种方案各有优缺点,实际开发中可根据项目需求、性能要求、安全要求等因素选择合适的解决方案。
2025-05-13 00:46:33
991
原创 Redis 序列化问题分析与解决方案
为避免上述问题,我们需要配置序列化器,而配置序列化器主要有两种方法1. 默认 JDK 序列化的问题问题表现使用未配置的会默认采用,导致存储数据为二进制流(如可读性差:二进制数据无法直观阅读。体积膨胀:包含类元数据,内存占用高。兼容性差:类结构变更或跨 Java 版本易失败。跨语言限制:仅适用于 Java 生态。2. 解决方案:自定义序列化配置通过配置的序列化器,优化存储格式。方案一:GenericJackson2JsonRedisSerializer机制序列化时添加@class字段记录类型信息(如。
2025-05-11 19:33:50
2620
原创 客户端操作redis为什么要使用连接池
在使用Jedis操作Redis数据库时,频繁创建和销毁连接会导致系统性能下降,尤其是在高并发场景下,可能耗尽系统资源。为了解决这一问题,可以通过配置连接池来管理Redis连接。连接池在初始化时创建一定数量的连接,并在需要时分配和回收连接,从而减少连接创建和销毁的开销,提高系统性能和吞吐量。此外,连接池还可以控制连接数量,防止资源耗尽,并提供统一的连接管理和监控接口,便于维护和优化。通过使用连接池,可以显著提升系统的响应速度和稳定性。
2025-05-11 03:40:18
328
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅