2026.3.30
230. 二叉搜索树中第 K 小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(k 从 1 开始计数)。 思路:遍历顺序肯定是中序,才能用上搜索树的性质。 全局记录答案。 123456789101112131415161718192021class Solution { private int ans; private int k; public int kthSmallest(TreeNode root, int k) { this.k = k; dfs(root); return ans; } // 左中右遍历,在根节点k--。 private void dfs(TreeNode node) { if (node == null || k <= 0) { return; } dfs(node.left); //...
2026.3.29
xxl-job对比其他定时任务处理器的优势 支持动态更新cron表达式 日志写入 任务失败通知 提供可视化监控 支持分布式任务 IOC的原理 项目启动的时候会扫描所有类是否包含容器化管理的注解,如果有先将类信息统一封装成BeanDefination的规范,然后通过反射机制调用空参构造函数进行实例化,然后进行依赖注入,调用初始化方法,以及postconstruct注解方法,进行aop增强,包装成bean对象后放入IOC容器中 xxxxxxxxxx public class Main { public static volatile AtomicInteger INTEGER = new AtomicInteger(0); public static void main(String[] args) throws InterruptedException { // 原子类实现自增操作 for (int i = 0; i < 10; i++) { new...
多线程的一些工具类
countdownlatch 1234567891011121314151617181920public class Main { public static void main(String[] args) throws InterruptedException { // 主线程等待n个子线程,每次调用countdown表示该线程准备好了 CountDownLatch latch = new CountDownLatch(2); new Thread(() -> { System.out.println("线程1执行"); latch.countDown(); }).start(); new Thread(() -> { System.out.println("线程2执行"); ...
ai agent开发(持续更新)
提示词(prompt) zero-shot:零样本学习,无提示 few-shot:少样本学习,少量示例 检索增强(RAG) 通过构建向量数据库等为大模型提供新的知识库,大模型通过检索这些知识库学习新的知识。 我们可以通过文本嵌入大模型将文本转换成向量,模型会把一段文本拆分成多个维度(抽象语义特征)的数字列表。 进行向量匹配时,主要使用余弦相似度算法来确定两段文本的相似度。 余弦相似度:计算两个向量的夹角。 对于两个 n 维向量 $A = [a_1,a_2,…,a_n]$、$B = [b_1,b_2,…,b_n]$,余弦相似度计算公式为:$$ \cos(\theta) = \frac{\sum_{i=1}^{n} a_i b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \cdot \sqrt{\sum_{i=1}^{n} b_i^2}} $$ LangChain 三种模型:LLM、聊天模型、 文本转向量: 123456from langchain_community.embeddings import DashScopeEmbeddingsmodel =...
2026.3.26
如果xxx宕机了怎么办(以redis服务宕机为例) 宕机中:这个阶段主要就看兜底策略能帮助服务缓解多大压力了。比如设置多级缓存,在宕机过程中还能顶住一部分流量。比如开启熔断,降低数据库压力,走降级策略。比如设置好互斥锁,当缓存挂了,请求需要获取锁才能访问数据库。 预防:通过一些手段预防宕机。比如建立集群。 tomcat是什么,有什么用 sevlet容器,用于部署基于sevlet的应用程序,如springboot、spring。 它可以将java程序看不懂的http请求封装成对象,并且选择合适的sevlet去处理这个请求 MVC是什么 M是model:处理业务逻辑,跟数据库进行交互 V是view:我们能看到的视图层,负责与用户交互 C是controller:负责接收view的请求,选择合适的model处理
2026.3.25
面向对象的三大思想 封装:将事物的属性和行为封装为实体,对外隐藏实现,只暴露其接口 继承:对事物本质的抽象,实现了代码的复用 多态:一个接口或方法可以有多个实现,提高灵活性 guava cache 过期分为写入后过期和访问后过期 123456789101112131415161718192021LoadingCache<String, String> userCache = CacheBuilder.newBuilder() // 设置并发级别,允许同时写缓存的线程数 .concurrencyLevel(8) // 设置缓存初始容量 .initialCapacity(100) // 最大容量限制 .maximumSize(5000) // 写入 30 分钟后过期 .expireAfterWrite(30, TimeUnit.MINUTES) // 开启统计功能(可以监控命中率等) .recordStats() // 设置移除监听器(当缓存被清理时触发) ...
2026.3.23
点赞系统的实现 技术:redis hash/set 业务:判断文章的点赞set中有无该用户id,没有就是点赞,有就是取消点赞 问题:数据库与redis的一致性(异步写/同步锁)、大key问题(拆分set) 签到系统的实现 技术:redis bitmap 业务:每个用户按月维护的bitmap,获取连续的签到市场需从当前日期开始向前遍历直到第一个0 问题:大量bitmap也占内存(mysql持久化)、跨月统计(遇到月初继续递归上一个月)、时区问题(依赖统一的UTC时间) 使用netty作为底层的通讯架构,在此基础上封装了很多消息类型,用于实现如服务注册、心跳检测、消息订阅等功能 仿照小红书开发的社交购物平台,主要基于redis实现了各种社交功能 平台优化点 限流:原本是滑动窗口算法的非原子性实现,后改为令牌桶+lua脚本的原子性实现。优化考虑点:1.原方案无法保持原子性 2.滑动窗口针对请求次数限流,令牌桶可以比较tokens限流 3.令牌桶支持突发流量,滑动窗口不支持 缓存:原本是guava...
2026.3.21
Problem: 289. 生命游戏 思路 难点在于题目要求根据当前情况直接得出变化后的情况,但程序肯定需要一个个遍历。 考虑四种状态:0-死细胞,1-活细胞,MAX_VALUE-要活的死细胞,MIN_VALUE-要死的活细胞 解题过程 先遍历一个位置的8个方位,判断细胞所处的状态。 再遍历每个位置的状态,转变不稳定状态的细胞。 复杂度 时间复杂度: $ O(n*m) $ 空间复杂度: $O(1)$ 12345678910111213141516171819202122232425262728293031323334353637class Solution { public void gameOfLife(int[][] board) { int[][] dir = new...
2026.3.18
...
2026.3.11
接口测试用例包含的内容/怎么设计接口测试用例 名称、预制条件(前提条件)、请求方法、请求头、请求体、预期结果 设计思路: 针对数据:1.正确值 2.边界值、空值、特殊符号 针对参数:1.全参、必选参数、可选参数 2.多参、少参、无参、错参 性能测试的测试策略 基准测试: 在单用户下运行,确定系统的基本响应时间指标。 负载测试(Load): 逐步增加压力,找到系统满足 SLA(服务等级协议)的最大并发量。 压力测试(Stress): 持续加压直到系统崩溃,观察系统的极限承载能力和失效模式。 稳定性测试(Soak): 在高负载下长时间运行(如 7x24h),检查是否有内存泄漏或资源耗尽。 SQL 慢的优化策略 打开EXPLAIN分析语句执行情况,重点关注type、rows、extra字段,看看有没有用索引 创建联合索引时注意最左匹配原则 调整sql语句结构,利用join替换子查询 如果数据量太大,可以考虑分库分表或创建缓存 接口自动化怎么做? 先讲手动的接口测试,根据测试用例一个个在postman等工具中调试 我们利用代码减少重复的操作就是自动化。 代码的编写主要包括...







