- 博客(52)
- 收藏
- 关注
原创 Python 从基础到 AI 应用学习笔记
元组是不可变的序列,类似于列表,但创建后不能修改。特点:可以存储不同类型的元素;元素可以重复、有序不可以修改(支持索引访问、切片)。# 定义元组元组名称 = (元素1, 元素2, ...)# 定义空元组元组名称 = ()t2 = ()注意:定义单元素元组时,必须在结尾加上逗号,例如('A',),否则括号会被当作普通运算符。集合(set)是一种无序、不重复、可修改的数据容器。# 定义集合# 定义空集合(注意:不能用 {},{} 表示空字典)s2 = set()注意:空集合的定义不可以使用。
2026-10-08 09:17:12
95
原创 力扣hot100爬楼梯https://leetcode.cn/problems/climbing-stairs/
你有多少种不同的方法可以爬到楼顶呢?1. 1 阶 + 1 阶 + 1 阶。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。
2026-09-30 17:32:33
230
原创 力扣hot100前k个高频元素https://leetcode.cn/problems/top-k-frequent-elements/
请你返回其中出现频率前。你所设计算法的时间复杂度。
2026-09-30 14:52:19
198
原创 力扣hot100买股票的最佳时期https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。在这种情况下, 没有交易完成, 所以最大利润为 0。买入这只股票,并选择在。
2026-09-29 09:21:20
141
原创 力扣hot100寻找重复数https://leetcode.cn/problems/find-the-duplicate-number/
,可知至少存在一个重复的整数。你设计的解决方案必须。
2026-09-28 17:29:48
211
原创 力扣hot100下一个排序https://leetcode.cn/problems/next-permutation/
就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的。就是将其所有成员以序列或线性顺序排列。修改,只允许使用额外常数空间。
2026-09-28 15:18:26
192
原创 力扣hot100修小栈 https://leetcode.cn/problems/min-stack/
-> 返回 -3.minStack.getMin();--> 返回 -2.minStack.top();操作,并能在常数时间内检索到最小元素的栈。
2026-09-24 17:32:20
175
原创 力扣hot100搜索旋转排序数组https://leetcode.cn/problems/search-in-rotated-sorted-array/
则返回它的下标,否则返回。你必须设计一个时间复杂度为。按升序排列,数组中的值。在预先未知的某个下标。上向左旋转后可能变为。
2026-09-23 14:04:12
207
原创 力扣hot100二分查找首位元https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。
2026-09-23 10:12:14
120
原创 力扣hot100分割回文串https://leetcode.cn/problems/palindrome-partitioning/
分割成一些子串,使每个子串都是。所有可能的分割方案。
2026-09-22 14:39:32
49
原创 力扣hot100随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。那么在复制链表中对应的两个节点。例如,如果原链表中有。返回复制链表的头节点。
2026-09-22 14:32:26
207
原创 力扣hot100 二叉树的右视图https://leetcode.cn/problems/binary-tree-right-side-view/
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入:root = [1,2,3,4,null,null,null,5]输入:root = [1,2,3,null,5,null,4]输入:root = [1,null,3]二叉树的节点个数的范围是 [0,100]输出:[1,3,4,5]输入:root = []输出:[1,3,4]
2026-06-17 22:05:03
224
原创 力扣hot100 二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4。因为根据定义最近公共祖先节点可以为节点本身。输入:root = [1,2], p = 1, q = 2。
2026-06-16 22:42:37
220
原创 力扣hot100路径总和Ⅲhttps://leetcode.cn/problems/path-sum-iii/
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22。输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
2026-06-15 19:36:13
252
原创 力扣hot100从前序与中序遍历序列构造二叉树https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输入: preorder = [-1], inorder = [-1]输出: [3,9,20,null,null,15,7]preorder 和 inorder 均 无重复 元素。inorder 均出现在 preorder。
2026-06-15 17:33:00
185
原创 力扣hot100 二叉树展开为链表https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null。输出:[1,null,2,null,3,null,4,null,5,null,6]进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?输入:root = [1,2,5,3,4,null,6]展开后的单链表应该与二叉树 先序遍历 顺序相同。树中结点数在范围 [0, 2000] 内。输入:root = [0]输入:root = []
2026-05-14 19:55:02
31
原创 只出现一次的数字https://leetcode.cn/problems/single-number/description/?envType=study-plan-v2&envId=top-100-
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。除了某个元素只出现一次以外,其余每个元素均出现两次。输入:nums = [4,1,2,1,2]输入:nums = [2,2,1]输入:nums = [1]
2026-05-13 19:47:47
30
原创 MySql锁机制
能用 InnoDB 别用 MyISAM,高并发必须行锁行锁一定要走索引,否则降级表锁普通查询用快照读,别乱用for update批量更新尽量缩小范围,减少锁范围事务别写太长,防止锁持有时间过久理解 MVCC + 临键锁,就能吃透 MySQL 并发。
2026-05-13 19:10:13
360
原创 RocketMQ分布式消息队列
在分布式系统中,消息队列是解耦、削峰、异步通信的核心组件,而 RocketMQ 凭借其云原生架构、金融级稳定性、万亿级吞吐的优势,成为微服务、大数据场景的首选方案。一个topic的Queue中的消息只能被一个消费者组的一个消费者消费。如果你正在做订单、支付、物流等核心业务,或面临高并发、数据一致性挑战,RocketMQ 值得深度掌握。新手入门最易混淆的就是 RocketMQ 的核心角色,用 “快递系统” 类比秒懂:。—— 不止于 “消息队列”。消息标签(细分场景,如 “订单创建”“订单支付”)。
2026-05-10 17:13:08
348
原创 Mysql索引
2. 对于B-树,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。select id, name, dender from user_table where name="aer"怎么简历索引sql优化最佳?只有or前后都有索引索引才会生效,age没有索引,索引要给age创建一个索引,才会生效。在业务允许的情况下,尽量使用>=这样的字段,这样索引就不会失效。3.相对于Hash索引,B+树支持范围匹配以及排序操作。
2026-05-02 16:59:23
63
原创 深入Spring AI RAG:揭秘RetrievalAugmentationAdvisor的过滤器机制
实现接口:Spring AI 可能定义了一个类似的接口(或通过间接实现),你需要实现其过滤方法。编写过滤逻辑:在方法内部,遍历,根据你的业务规则(例如,)筛选出符合条件的文档。注册到顾问:将你实现的过滤器实例添加到的配置中,形成过滤器链。代码概念示例java// 这是一个示意性的自定义过滤器@Override的过滤器机制是Spring AI实现高质量RAG应用的关键一环。它不仅在ETL阶段(文档读取、切割)发挥作用,更在检索后处理阶段提供了精细化的控制能力。
2026-04-22 22:50:41
386
原创 Spring AI自定义Advisor
CallAroundAdvisor:用于处理同步请求和响应(非流式)StreamAroundAdvisor:用于处理流式请求和响应2)实现核心方法对于非流式处理 (CallAroundAdvisor),实现 aroundCall 方法:@Override//在方法之前要执行的准备,处理请求(前置处理)//相当于切面方法,要增强的原始方法,在这里是下一个链的Adviosr或者AI//执行之后的响应(后置处理)
2026-04-14 22:00:50
371
原创 Spring AI
Spring AI是Spring官方AI框架,让Java开发者用熟悉的方式调用AI模型ChatClient是日常开发的首选,90%的场景用它就够了Prompt工程是提升AI输出质量的关键,系统消息+用户消息的组合很重要流式响应能大幅提升用户体验,实现打字机效果多模型支持让你可以根据场景灵活选择最合适的模型。
2026-04-01 21:34:05
531
原创 35. 搜索插入位置https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&env
/ 计算中间索引 mid:(left+right)/2 用右移>>1实现,等价于整数除法,避免溢出。// 方法功能:在升序数组中查找目标值的插入位置(若存在返回索引,不存在返回应插入的位置)// 初始化答案:默认插入位置为数组末尾(target比所有元素大时,直接插最后)// 初始化二分查找的右指针:从数组最后一个元素(索引n-1)开始。// 初始化二分查找的左指针:从数组第一个元素(索引0)开始。// 二分查找核心循环:左指针 <= 右指针时,持续查找。// 情况1:目标值 <= 中间元素。
2026-03-24 20:21:20
65
原创 Redis多级缓存
核心逻辑:从上到下查数据,从下到上写缓存,优先利用高速缓存降低后端压力;核心难点:数据一致性(先更库后删缓存 + 过期时间兜底)、缓存异常(穿透 / 击穿 / 雪崩);核心原则:小型系统简化层级,中大型系统分层兜底,避免过度设计。落地多级缓存后,可实现 99% 以上的请求停留在缓存层,数据库仅承担少量写操作和缓存未命中请求,最终达成 “高并发、低延迟、高可用” 的系统目标。
2026-03-22 22:10:23
380
原创 Redis分布式缓存-分片集群
Redis 分片集群通过哈希槽实现数据分片,突破单机容量和写性能瓶颈;集群内置高可用能力,无需哨兵,主节点故障时从节点自动升级;生产环境需部署 3 主 3 从以上集群,客户端需适配集群模式,避免跨槽位操作。
2026-03-22 13:09:48
399
原创 Redis分布式缓存-哨兵
Redis 哨兵是主从架构的高可用补充,核心实现自动故障转移,解决人工切换的延迟问题;哨兵工作分为监控、主观下线、客观下线、故障转移四步,依赖 Raft 算法选举领头哨兵;生产环境建议部署 3 个哨兵节点 + 1 主 2 从,客户端通过哨兵自动发现主节点,而非硬编码地址。
2026-03-21 17:51:24
400
原创 Redis分布式缓存-主从
简单来说,主从架构就像是一个“领导”带着一群“助手”。负责处理所有的写操作(增加、修改、删除)。负责同步主节点的数据,并处理读操作(查询)。这种设计遵循了“读写分离”的原则,能显著提高系统的并发处理能力。特点说明优点读写分离,扩展性强;数据冗余,安全性提升。缺点主节点依然只有一个,如果主节点挂了,写服务会中断。缺点数据从主同步到从存在极短的毫秒级延迟。主从架构通过RDB 全量备份 + 缓冲区增量补齐的方式,实现了高性能的数据同步。
2026-03-21 15:36:30
357
原创 Redis分布式缓存 -持久化
Redis 分布式缓存的持久化是保障数据可靠性的核心,RDB 适合快速恢复和灾备,AOF 适合高数据一致性场景,4.0+ 推荐开启混合持久化;分布式集群中需注意「主从分离持久化」,避免主节点 IO 压力影响性能;生产环境需结合业务场景配置持久化策略,同时做好文件备份和灾备,平衡数据一致性与性能。通过合理的持久化配置和优化,Redis 分布式缓存既能发挥内存存储的高性能优势,又能保障数据不丢失,满足分布式系统的高可用要求。
2026-03-20 22:41:35
583
原创 黑马点评秒杀系统优化实战:高并发下的性能与安全双保障
实现原子限流、原子扣库存,保证高并发下数据安全。缓存预热提前加载热点数据,避免秒杀时缓存击穿。分布式锁(Redisson)解决 “一人一单”、并发安全问题。消息队列异步化削峰填谷,提升系统吞吐量。SQL 原子扣库存数据库兜底,从根本上杜绝超卖。全链路分层防护前端、接口、缓存、数据库四层拦截,层层减压。秒杀系统的优化,本质是把高并发挡在缓存,把一致性交给数据库。通过限流、缓存、异步、分布式锁、原子 SQL五大手段,既保证了高性能,又保证了数据安全,是高并发业务的经典实践。
2026-03-14 21:28:03
465
原创 redis实现分布式锁
SET NX PX原子加锁 + Lua 脚本原子解锁;锁标识(UUID)是防误删的关键,解锁必须判归属;生产环境优先用 Redisson,仅需关注tryLock和unlock核心调用。
2026-03-12 20:35:19
72
原创 Java的Function<T, R>
是 Java 8 引入的函数式接口(位于包下),核心作用是表示一个 “输入一个参数、返回一个结果” 的函数—— 你可以把它理解为一个 “类型化的函数模板”,专门用来封装 “接收 T 类型参数,返回 R 类型结果” 的逻辑。
2026-03-08 21:49:52
102
原创 缓存击穿问题及其解决方案
缓存击穿是高并发场景下的典型缓存问题,指缓存中某个热点 key 突然失效(过期 / 被删除),此时大量并发请求直接穿透缓存,集中冲击数据库,导致数据库压力骤增、响应延迟甚至宕机的现象。与缓存穿透(查询不存在的 key)、缓存雪崩(大量 key 集中过期)不同,缓存击穿的核心特征是:目标 key 真实存在,仅因缓存失效引发瞬时高并发穿透。缓存击穿的本质是 “热点 key 缓存失效后的并发穿透”,解决方案的核心思路的是:要么避免缓存失效,要么限制穿透数据库的并发请求。// 写入缓存(设置合理过期时间)。
2026-03-08 12:32:41
342
原创 缓存雪崩问题及其解决方案
缓存雪崩指两类核心场景导致的连锁故障:一是大量缓存键在同一时间段集中过期失效,二是Redis 服务突发整体不可用。这两种情况都会让原本由缓存承接的海量请求瞬间穿透到后端数据库,数据库因无法承受突发高并发请求崩溃,进而引发整个业务系统的连锁故障。场景 1(集中过期):电商大促时,所有促销商品缓存统一设置 2 小时过期,2 小时后海量用户请求同时穿透缓存查询数据库,数据库连接池瞬间被打满;
2026-03-07 21:59:01
432
原创 缓存穿透问题及其解决方案
在实际开发中,无需过度追求复杂方案,可根据业务场景灵活选择:简单场景用 “缓存空值 + 参数校验”,高并发、高安全需求场景用 “布隆过滤器 + 组合策略”,既能有效解决缓存穿透,又能保证系统性能和稳定性。缓存穿透是 Redis 缓存架构中常见的性能问题,指客户端请求的数据既不在 Redis 缓存中,也不在后端数据库中,导致所有请求都直接穿透缓存层,高频次冲击数据库的现象。缓存穿透的本质是 “无效请求未被拦截,直接冲击数据库”,解决思路可归纳为 “源头拦截 + 中间防护 + 兜底保障”:。
2026-03-07 20:24:45
393
原创 Redis缓存与数据库主动更新的策略
避免 “缓存与数据库更新顺序颠倒” 导致的脏数据:若先更缓存,再更数据库,此时数据库更新失败,缓存会一直是脏数据;落地时无需追求 “完美一致性”,需结合业务场景定义 “可接受的不一致窗口”,再搭配缓存预热、锁机制、定时同步等兜底方案,即可实现 “高性能 + 高可用 + 合理一致性” 的平衡。而主动更新策略的核心目标是:数据库数据变更时,主动触发缓存更新或失效,最小化一致性窗口,同时兼顾性能与可用性。缓存与数据库的主动更新策略,本质是 “一致性” 与 “性能” 的权衡:。缓存与数据库的一致性痛点。
2026-03-05 22:21:41
372
原创 Java在自定义拦截器如何实现依赖注入
都知道要实现自定义拦截器要将这个类交给spring管理,就是要把这个类在mvcConfig中添加。在mvcConfig里面就可以实现依赖注入。所以我们可以在这里注入后再在拦截器类中加一个构造函数,这样就可以接收config类传过来的注入。在自定义Interceptor中不能实现@Autowired改怎么办。
2026-02-19 22:29:47
37
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅