自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis的分布式锁

摘要:分布式锁是解决超卖问题的有效方案,通过Redis设置key-value实现互斥访问。但需注意多个问题:1)校验机制防止锁误删;2)Lua脚本保证判断和删除操作的原子性;3)看门狗机制动态续约过期时间;4)RedLock(红锁)解决主从切换导致锁失效问题。这些机制共同确保分布式锁的可靠性和安全性。

2025-12-24 19:10:34 1063

原创 并发编程-CAS

CAS(比较再交换)是一种无锁并发机制,通过比较内存值确保线程安全。线程先读取共享变量旧值,计算新值后比较内存当前值,若未变则更新,否则自旋重试。该机制被广泛应用于AQS和原子类(如AtomicInteger)中。优点是无锁高效,缺点是自旋消耗CPU且存在ABA问题(值被多次修改后恢复原值)。ABA问题可通过版本号机制解决,如AtomicStampedReference类通过附加版本号确保数据完整性。

2025-12-23 15:14:58 788

原创 常见锁策略

摘要:悲观锁与乐观锁的主要区别在于冲突处理方式:悲观锁独占资源,性能开销大;乐观锁通过重试避免阻塞,性能更优。轻量级锁采用自旋方式应对低竞争,重量级锁涉及系统调度。读写锁区分读写操作提升并发性。可重入锁支持递归调用避免死锁,公平锁保证先来先服务但性能较低,非公平锁效率更高但牺牲公平性。不同锁机制适用于不同并发场景,需权衡性能与功能需求。

2025-12-23 15:13:00 396

原创 力扣hot图论部分

本文总结了LeetCode中四个典型算法问题的解法:1. 岛屿数量(FloodFill算法):使用BFS遍历相邻陆地,通过visit数组标记已访问节点;2. 腐烂的橘子(多源BFS):统计新鲜橘子数,多源点同时扩散,注意时间计数方式;3. 课程表(拓扑排序):建立邻接表统计入度,通过BFS检测环;4. 前缀树:实现Trie结构,支持插入和查询操作。每个问题都提供了核心思路和关键代码实现,重点讲解了算法细节和注意事项。

2025-12-18 13:46:51 681

原创 Redis中ZipList(压缩列表)的优劣以及连锁更新问题

2025-12-08 21:38:08 1139

原创 暴打力扣之优先级队列(堆)

本文探讨了解决TOP-K问题的三种方法:优先队列、手动实现堆和快速选择法。在LeetCode第215题和第347题中,作者分别使用这三种方法进行实现。优先队列方法简单直接,手动实现堆能更好理解堆结构,快速选择法通过三数取中优化达到平均O(N)时间复杂度。三种方法各有优劣:优先队列稳定但效率一般(O(NlogK)),快速选择法平均效率高但不稳定,手动实现堆则更具学习价值。文章详细展示了每种方法的代码实现,并比较了它们的适用场景,为处理TOP-K问题提供了全面的解决方案参考。

2025-12-01 22:11:06 906

原创 MySQL索引失效的情况

摘要:本文分析了导致MySQL索引失效的常见情况,包括:1)对索引列使用函数或表达式;2)隐式类型转换;3)LIKE以通配符开头的查询;4)违反联合索引最左前缀原则。重点阐述了联合索引的工作原理,说明查询必须包含最左列才能有效利用索引,否则会导致索引失效。同时解释了B+树索引结构决定了前缀匹配的高效性和后缀匹配的低效性。这些知识对优化SQL查询性能具有重要指导意义。

2025-12-01 21:46:55 2352

原创 暴打力扣hot的普通数组专题

本文总结了LeetCode三道题目的解题思路与代码实现:1. 除自身以外数组的乘积(238题)采用左右乘积数组法,时间复杂度O(n),空间复杂度O(n);2. 合并区间(56题)先排序后合并重叠区间,时间复杂度O(nlogn);3. 缺失的第一个正数(41题)提供了三种解法:排序二分查找(O(nlogn))、哈希集合(O(n))和原地哈希(最优解O(n))。其中原地哈希法通过元素归位策略实现最优时空复杂度,是推荐的解决方案。

2025-11-24 19:56:48 404

原创 日志(Redo Log、Undo Log、Binlog)

MySQL通过多日志机制实现事务特性与数据安全:RedoLog(物理日志)采用WAL技术,顺序IO记录数据页修改,确保事务持久性和崩溃恢复;UndoLog(逻辑日志)记录反向操作,支持事务回滚(原子性)和MVCC多版本控制,通过版本链和ReadView实现不同隔离级别;BinLog(逻辑日志)记录表结构变更和数据修改,用于主从同步和数据恢复。三大日志协同工作,RedoLog和UndoLog位于存储引擎层,BinLog在Server层,共同保障MySQL性能与数据一致性。

2025-11-24 19:33:07 2973 1

原创 暴打力扣hot中的链表专题

本文分享了力扣Hot链表专题中最具代表性的三道题目的解题思路和代码实现。23题合并K个升序链表提供了优先级队列和归并两种解法,其中归并分治的方法更为推荐;146题LRU缓存通过双向循环链表加哈希表实现,重点讲解了虚拟头节点的作用;148题排序链表采用归并排序,虽然迭代解法空间复杂度更优,但归并排序更具通用性。文章详细分析了每道题的解题思路和代码实现要点,难度依次递增,为链表问题提供了实用的解决方案。

2025-11-17 21:36:45 1610 2

原创 类的声明周期

Java类的生命周期包括加载、链接、初始化、使用和卸载五个阶段。加载阶段通过类加载器将字节码读入内存;链接阶段进行验证、准备和解析;初始化阶段执行静态代码块和变量赋值。被动引用(如访问父类静态字段)不会触发初始化。类的卸载需要满足实例被回收、Class对象无引用和ClassLoader被回收三个条件。常见异常包括NoClassDefFoundError和ClassNotFoundException。理解生命周期有助于优化内存管理和避免类加载问题。

2025-11-17 20:26:00 1665 1

原创 内存结构/运行时数据区

本文摘要: JVM内存结构分为运行时数据区和直接内存。运行时数据区包括线程私有的程序计数器、虚拟机栈、本地方法栈,以及线程共享的堆和方法区。其中,方法区在JDK1.7以永久代实现,位于堆内;JDK1.8改为元空间,使用本地内存。堆内存分为新生代和老年代,存储对象实例。直接内存属于操作系统内存,常用于NIO缓冲区。相比BIO的阻塞式I/O,NIO采用非阻塞模式,通过Channel和Selector实现高效I/O操作。这些改进提升了JVM性能,解决了永久代OOM等问题,使内存管理更灵活高效。

2025-11-14 21:56:30 1984 3

原创 重点理解线程池

摘要:线程池通过资源管理和线程复用避免了频繁创建销毁线程的性能损耗,其核心参数包括线程数量、存活时间、任务队列和拒绝策略等。任务提交遵循"核心线程→队列→临时线程→拒绝策略"流程。拒绝策略需根据不同业务场景选择,如AbortPolicy适合允许失败任务,而CallerRunsPolicy适合不能丢失任务的情况。线程数设置应考虑任务类型(CPU密集型或I/O密集型),并通过压测优化。不建议使用Executors创建线程池,因其可能导致OOM,推荐使用ThreadPoolExecutor方式

2025-11-10 21:44:33 1579

原创 线程需要重点掌握的部分

Java线程具有六种状态:新建(NEW)、就绪(Runnable)、阻塞(Blocked)、等待(Waiting)、计时等待(Timed_Waiting)和终止(Terminated)。线程通过调用特定方法在这些状态间流转,如start()进入就绪状态,遇到锁竞争进入阻塞状态等。创建线程的方式多样,包括继承Thread类、实现Runnable/Callable接口,以及使用线程池和lambda表达式。多线程技术广泛应用于耗时操作处理,如大文件传输、资源加载、聊天软件和服务器后台等场景,能显著提升程序执行效率

2025-11-10 21:36:44 400

原创 回溯专题之二叉树

本文分享了四道力扣热题二叉树问题的DFS递归解法。通过回溯训练后,作者发现递归在二叉树问题中非常巧妙。具体题目包括:199.二叉树的右视图(DFS遍历记录每层最右节点)、114.二叉树展开为链表(前序遍历重构)、437.路径总和III(双重递归统计路径)和124.二叉树最大路径和(后序遍历计算子树贡献值)。每道题都提供了思路分析和Java代码实现,展示了DFS+递归在不同场景下的灵活应用。通过这些问题,作者体会到递归思维对解决二叉树问题的重要性。

2025-11-10 21:29:16 399

原创 Redis中的分布式锁

摘要:Redis的SetNX命令通过设置唯一键实现分布式锁,需判断线程ID防止误删,建议使用Lua脚本保证原子性。Redisson提供更完善的分布式锁方案,支持可重入锁和看门狗机制自动续期。针对主从同步问题,可采用MultiLock或RedLock方案,通过多主节点投票确保加锁可靠性。RedLock要求半数以上节点加锁成功,并设置超时时间,适用于高可靠性要求的分布式场景。

2025-11-05 16:09:21 1346 6

原创 缓存击穿/穿透/雪崩

缓存击穿与穿透是两种不同问题:击穿指热点key失效导致大量请求直达数据库(解决方案:互斥锁或永不过期+逻辑过期);穿透指查询不存在的数据导致请求穿透缓存(解决方案:缓存空值或布隆过滤器)。缓存雪崩则是大量key同时过期或Redis宕机(解决方案:均匀设置过期时间、集群部署)。面试中需明确区分这几种情况及其对应解决方案。

2025-11-05 15:46:22 1313

原创 Redis集群中的故障判定和故障迁移流程

Redis集群故障检测与迁移机制:节点间通过定期随机发送ping/pong包交换状态信息。当节点B未响应ping时,A将其标记为PFAIL(主观下线);若超半数节点也认为B故障,则升级为FAIL(客观下线)。若B是主节点,其从节点将触发故障迁移:符合资格的从节点休眠不同时长后竞选(Raft算法),最早唤醒且获得多数主节点投票的从节点将晋升为主节点,接管原主节点的slots并通知集群更新拓扑。该机制通过随机心跳和分级休眠有效避免了N²级通信和选举冲突。

2025-11-05 10:26:43 1119 2

原创 回溯专题-N皇后/单词搜索

文章摘要:本文介绍了两种回溯算法的优化解法:N皇后问题和单词搜索。在N皇后问题中,通过使用三个布尔数组(列、左对角线、右对角线)替代传统四重循环检查,提升了效率。单词搜索则采用向量数组(dx/dy)简化四方向遍历,避免重复代码。两种解法均通过DFS+回溯实现,并强调恢复现场的重要性。相比力扣官方题解,这些技巧使代码更简洁高效,分别为N皇后问题和单词搜索问题提供了优化方案。

2025-11-03 22:37:22 488 2

原创 Redis的持久化

摘要:Redis提供RDB和AOF两种持久化机制。RDB默认开启,通过定时快照保存数据,恢复速度快但可能丢失部分数据;AOF记录每个写命令,数据更安全但文件较大。Redis 4.0引入混合持久化,结合两者优势:AOF文件开头采用RDB格式存储快照,后续追加AOF命令,既提升恢复速度又降低数据丢失风险。但混合格式不兼容旧版Redis。两种机制各有适用场景,RDB适合备份和全量复制,AOF则提供更高数据安全性。

2025-11-03 19:15:30 1299 2

原创 回溯专题:子集/全排列问题

摘要:本文分析了力扣78题(子集)和46题(全排列)的解题思路。两者都采用深度优先遍历(DFS)和回溯法,使用全局变量path和ret简化函数设计。子集问题通过递归遍历每个元素的选与不选两种情况,全排列问题则利用check数组剪枝。核心要点包括:决策树的构建、回溯时现场恢复、递归终止条件处理。两题解法高度相似,只要能列出所有情况(画出决策树),都可使用DFS+回溯法解决。(149字)

2025-10-30 22:18:51 485 1

原创 MySQL中的索引

MySQL索引选用B+树而非哈希或二叉树的深层原因:哈希虽快但无法范围查询;二叉树存在退化风险且IO效率低。B+树的核心优势在于非叶节点仅存索引实现高分支因子(降低树高)、叶子节点双向链表支持高效范围查询,同时避免B树数据分散存储的问题。索引分类中,主键索引即聚集索引存储完整记录,二级索引需回表查询;覆盖索引可避免回表,通过直接在二级索引中获取所需列提升性能。这种设计完美平衡了查询效率、范围操作与磁盘IO优化的需求。

2025-10-28 09:43:59 1357 2

原创 HashMap和ConcurrentHashMap的相关八股

摘要:HashMap在多线程环境下存在线程安全问题。JDK1.7中扩容时使用头插法可能导致环形链和数据丢失,而JDK1.8中插入空桶时可能发生数据覆盖。JDK1.8的优化包括:采用尾插法减少锁竞争、引入红黑树提升查询效率、改进扩容机制以及使用CAS操作确保数据一致性。这些改进显著提升了HashMap和ConcurrentHashMap在高并发场景下的性能和安全性。

2025-10-27 07:00:00 1340 4

原创 动态规划之两个字符组/两个数组的dp问题

本文分析了LeetCode上两道字符串动态规划问题:1143.最长公共子序列和72.编辑距离。最长公共子序列通过构建二维DP数组,当字符相同时取左上角值+1,否则取左或上较大值。编辑距离同样使用二维DP,初始化边界后,字符相同时取左上角值,不同则取左、上、左上最小值+1。两题都采用类似DP思路,但状态转移方程不同,体现了字符串匹配问题的不同解法。代码实现中均对字符串前补空格便于处理边界条件。

2025-10-20 22:49:49 1620 1

原创 动态规划之回文串相关问题

【摘要】本文介绍了回文子串问题的两种动态规划解法。对于647题(统计所有回文子串数量),通过构建n×n的布尔矩阵f[i][j]表示s[i..j]是否为回文,遍历时比较首尾字符并根据子问题结果填充矩阵,最后统计true的数量。5题(寻找最长回文子串)采用相同思路,在填充矩阵后记录最长回文子串的起始位置和长度。两题核心均为:f[i][j] = (s[i]==s[j]) && (j-i<2 || f[i+1][j-1]),时间复杂度O(n²),空间复杂度O(n²)。

2025-10-13 20:39:52 1535

原创 动态规划-子数组问题-单词拆分

该摘要介绍了力扣第139题"单词拆分"的动态规划解法。使用布尔数组f[i]表示前i个字符能否被拆分,初始化f[0]=true。通过双重循环遍历所有可能的子串,若f[j-1]为true且剩余子串在字典中,则f[i]置为true。最终返回f[n]即为答案,时间复杂度O(n²)。文中包含完整Java代码实现和测试用例。

2025-10-08 10:20:43 1319

原创 动态规划之买卖股票的最佳时机III和IV

这篇文章介绍了LeetCode上两道利用动态规划解决股票买卖问题的题目:123题(最多交易2次)和188题(最多交易k次)。两题的解题思路相似,通过状态转移方程计算持有(f)和未持有(g)股票时的最大利润。代码实现上,123题使用固定交易次数3种状态,188题则根据输入的k值动态调整状态数。关键点在于初始化边界条件,并通过双重循环递推计算每天每种交易次数下的最优解,最终返回最大利润。两题解法可相互推广,区别仅在于交易次数的参数化处理。

2025-09-29 08:30:00 1782

原创 动态规划之不同路径+不同路径II

本文介绍了力扣上两道动态规划题目:62.不同路径和63.不同路径II。不同路径是基础题,要求计算从网格左上角到右下角的路径总数,使用二维数组存储中间状态,通过状态转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]求解。不同路径II是进阶题,增加了障碍物判断,遇到障碍物时路径数为0,否则沿用相同状态转移方程。代码实现展示了两种情况的处理方式,其中不同路径II需要额外判断obstacleGrid[i-1][j-1]是否为1。两道题都采用动态规划思想,时间复杂度O(mn),空间复杂度O(mn)。

2025-09-22 08:45:00 1739 2

原创 动态规划-解码方法

本文介绍了使用动态规划解决LeetCode第91题"解码方法"的步骤。关键点包括:1)状态表示dp[i]表示前i个字符的解码方法数;2)状态转移方程根据当前字符是否能单独解码(1-9)或与前一个字符组合解码(10-26)来划分;3)初始化时需处理边界条件;4)代码实现中需讨论多种情况,包括单独解码和组合解码的成功/失败情况。该方法通过动态规划逐步计算每个位置的可能解码方式,最终返回字符串整体的解码方法总数。

2025-09-17 18:39:18 1609

原创 栈专题之每日温度

本文介绍了解决"每日温度"问题的两种方法:1.暴力解法(O(N^2)),通过双重循环比较温度,但会超时;2.优化的单调栈解法(O(N)),利用栈存储下标,从右向左处理,遇到更高温度时计算天数差。代码展示了如何用栈高效实现,比暴力解法更优。

2025-09-08 18:49:57 1949 2

原创 哈希专题之字母异位词分组

本文提供了LeetCode第49题"字母异位词分组"的Java解法。核心思路是通过哈希表将排序后的字符串作为键,原始字符串列表作为值。代码实现中,首先将字符串排序生成统一键,然后分组存储异位词。

2025-09-01 08:30:00 1891 2

原创 二分查找之搜索旋转排序数组

【摘要】本文实现了一个在旋转排序数组中搜索目标值的算法。通过二分查找先确定旋转点m,再根据目标值与数组首尾元素的关系,在左侧或右侧子数组中进行二分查找。考虑了数组未旋转、长度为1等特殊情况,时间复杂度为O(log n)。测试用例验证了算法的正确性。

2025-08-26 11:13:00 1522

原创 在排序数组中查找元素的第一个和最后一个位置(使用二分查找解决)

摘要:本文介绍了在排序数组中查找目标元素起始和结束位置的两种方法。暴力解法通过遍历数组记录目标值首次和末次出现的位置,时间复杂度O(n)。更优的二分查找解法通过两次二分搜索分别定位左右边界:第一次二分找左端点时采用左中位数,第二次找右端点时采用右中位数,时间复杂度O(logn)。关键点在于正确处理二分边界条件和中点选取方式,避免死循环。两种方法都需处理数组为空或目标不存在的情况。

2025-08-20 12:17:29 1514 2

原创 滑动窗口问题之水果成篮

摘要:本文介绍了LeetCode第904题"水果成篮"的两种解法。暴力解法使用双重循环和HashSet判断水果种类,时间复杂度O(N^2)导致超时。优化解法采用滑动窗口配合HashMap记录水果种类及其数量,通过维护左右指针动态调整窗口大小,时间复杂度降为O(N)。当窗口内水果种类超过2时,移动左指针并更新HashMap,始终保持窗口内最多两种水果,从而高效求出最大连续子数组长度。滑动窗口法显著提升了算法效率。

2025-08-13 11:16:41 1516

原创 DI(依赖注入)详解

本文介绍了Spring框架中的依赖注入(DI)概念及其实现方式。依赖注入是指IoC容器在创建Bean时提供运行时所需的依赖对象。Spring提供了三种主要注入方式:属性注入(使用@Autowired)、构造方法注入和Setter注入,并分析了每种方式的优缺点。当同一类型存在多个Bean时,可通过@Primary、@Qualifier或@Resource注解解决冲突。文章最后对比了@Autowired和@Resource的区别,前者按类型注入是Spring特有,后者按名称注入来自JDK。各种注入方式的选择需根

2025-07-28 07:45:00 2507 2

原创 理解Spring中的IoC

本文介绍了Spring框架中的控制反转(IoC)概念及其实现方式。IoC是将对象创建和管理权交给Spring容器,通过依赖注入实现。重点讲解了bean的存储方式,包括类注解(@Controller、@Service等)和方法注解(@Bean)的使用方法及区别。详细说明了@Controller和@Bean的具体用法、命名规则、多对象定义及重命名技巧,并分析了@ComponentScan扫描路径的重要性。文章通过代码示例演示了如何从Spring容器获取对象,并解释了类注解间的层次关系。最后指出注解生效的前提是确

2025-07-25 21:19:46 1465

原创 哈希表的相关知识以及使用java实现哈希桶

哈希表是一种高效的数据结构,通过哈希函数建立键值与存储位置的映射关系,实现快速查找。主要介绍了两种哈希表形式:开放地址法和链地址法(哈希桶)。哈希冲突是不可避免的,可通过优化哈希函数设计(如除留余数法)和调整负载因子(建议0.7-0.8)来降低冲突率。重点分析了闭散列(线性探测/二次探测)和开散列两种冲突解决方法,并提供了Java实现哈希桶的完整代码示例,包含插入、扩容和查找操作。代码实现时需注意负载因子计算、头插法处理冲突以及扩容时的重新哈希等关键点。

2025-07-20 10:50:59 1503

原创 事务和事务的隔离级别

摘要:ACID特性是事务的四个核心属性:原子性(事务操作要么全成功要么全失败)、一致性(事务前后数据完整性不被破坏)、隔离性(事务间互不干扰)和持久性(提交后数据永久保存)。事务并发可能引发脏读、不可重复读和幻读问题。SQL标准定义了四种隔离级别(读未提交、读已提交、可重复读、可串行化),隔离级别越高安全性越强但性能越低。MySQL默认采用可重复读隔离级别,需在安全性和性能间取得平衡。 (149字)

2025-07-15 10:52:24 941

原创 TCP的十大特性

摘要:TCP协议作为可靠传输的核心协议,通过十大机制实现高效稳定的数据传输。主要机制包括:1)确认应答和超时重传保障传输可靠性;2)三次握手/四次挥手的连接管理;3)滑动窗口提升传输效率;4)流量控制匹配接收方处理能力;5)拥塞控制适应网络状况;6)延时应答优化响应机制;7)捎带应答提高效率;8)面向字节流带来的粘包问题及解决方案;9)异常情况处理如进程崩溃、主机掉电等场景应对措施。这些机制相互协同,确保TCP在复杂网络环境中实现高效、稳定的数据传输。

2025-06-24 11:33:02 2043

原创 HTTPS的加密方式介绍

加密就是把明文(要传输的信息)进行一系列变换,生成密文。解密就是把密文在进行一系列变换,还原成明文。在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据成为密钥。五.加密的方式加密的方式有很多种,但是整体上可以分成两大类:对称加密和非对称加密。1.对称加密对称加密其实就是通过同一个密钥,把明文加密成密文,并且也能把密文解密成明文。客户端和服务器最开始通信的时候,就需要一方生成唯一的密钥,再通过网络传输给另一方。1.把关键信息(如公钥)作为输入生成校验和。

2025-06-21 19:08:46 1667 1

展示需要的sql文件,有需要的可以导入

展示需要的sql文件,有需要的可以导入

2025-05-18

图书系统项目需要导入的jar包

这是jar包,直接导入就行

2025-03-28

空空如也

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

TA关注的人

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