自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 常见的排序算法

【代码】常见的排序算法。

2026-07-05 17:24:17 178

原创 【业务编程题】订单的ID生成

在电商项目中,订单号是用来跟踪和识别每一个订单的唯一标识。为了保证订单号的唯一性,需要设计一个订单号生成器,可以根据日期,顺序数字和用户ID生成订单号。请实现一个订单号生成与查询系统。现已经有订单类(Order)如下。

2026-07-03 16:16:01 231

原创 【双指针】【简单】移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。进阶:你能尽量减少完成的操作次数吗?

2026-06-23 22:20:36 177

原创 【哈希】【中等】最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

2026-06-23 14:48:55 217

原创 【哈希】【中等】字母异位词分组

给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。解释:在 strs 中没有字符串可以通过重新排列来形成 “bat”。字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。

2026-06-17 22:15:11 184

原创 LangChain基础使用

幻觉问题:模型可能生成看似合理但实际错误的信息提示词不统一:不同场景需要反复调整提示词,缺乏标准化模型切换成本高:不同厂商的LLM接口差异大,迁移困难编码集成不便:开发者更希望通过结构化数据(JSON/XML等)接口获取能力,而非纯文本知识截止日期:模型训练数据有时间限制,无法获取实时信息专业领域知识薄弱:在医学、法律等垂直领域,模型结果仅能作为参考,可信度不足解决方案上述问题的核心在于:大模型本身缺乏外部知识检索、工具调用和状态管理能力。

2026-06-17 22:05:53 368

原创 kafka消息的可靠性及幂等性

生产者重启后,用同一个 transactional.id 再次初始化,Kafka 会恢复上一次的 PID 和序列号状态,从而可以继续去重。如果Leader所在的Broker宕机,一个Follower可以被选举为新的Leader,继续提供服务,保证系统的高可用。Kafka将消息以追加(append-only)的方式写入磁盘文件,避免了昂贵的随机I/O,在保证持久化的同时提供了高性能。,如果重启,会给生产者设置一个新的PID,这个时候就可能重复消费了。且仅对单分区有效,序号是分区维护的,无法跨分区去重。

2026-06-11 20:56:45 452

原创 【Redis】布隆过滤器原理

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在集合中,常用于防止缓存穿透。它可能会误判(假阳性,False Positive):说一个元素在集合中,但实际可能不在。它不会漏判(假阴性,False Negative):如果它说元素不在集合中,那么一定不在。通俗理解:布隆过滤器是一个“也许在”的判断器,用来快速过滤掉确定不存在的元素。

2026-06-11 17:23:37 214

原创 【数据结构】HashMap

源码注释里给了泊松分布的计算结果:在理想情况下(哈希随机性很好),一个桶中链表长度达到 8 的概率极低(小于千万分之一)。这说明一旦长度超过 8,往往是严重恶意的哈希冲突(比如有人故意构造相同 hashCode 的 key),此时必须用红黑树来防止性能崩溃。

2026-06-08 22:17:40 500

原创 从CNN到RNN再到Transformer的架构理解

RNN通过一个叫隐藏状态的小本本,把之前看到的信息记下来,然后传给下一步。多头注意力就是多用几组不同的权重,生成多组 Q、K、V(比如 8 组),每组独立计算注意力,得到 8 个不同的结果。CNN的核心设计哲学是局部连接+参数共享,这源于图像等数据具有“局部相关性”(邻近像素更相关,远处像素相关性弱)。RNN通过隐藏状态在序列中传递信息,每个时间步的输出依赖于前一个时间步的隐藏状态,然后把这 8 个结果拼接在一起,再经过一层线性变换,得到最终的输出。如下图,左边的是编码器,右遍的是解码器,其过程如下,

2026-06-08 20:56:23 367

原创 【哈希】【简单】两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。题干中描述只会存在一个有效答案,因此可以遍历数组的同时,将数组数据存储到HashMap中。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。边遍历边寻找已经存入的HashMap中是否有target-当前值。进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?你可以按任意顺序返回答案。

2026-06-07 21:31:11 182

原创 【MySQL】存储引擎

5,4>3,4<6,3<=4<=6但是4存在m_ids中,都不满足,所以不可以访问,所以这一次快照读不应该读当前的数据,这个时候就会通过指针找上一条记录,再进行对比,直到满足可以访问的条件(trx_id的时候才满足可以访问,可以理解为查询的时候只有事务2提交了,所以可以查询到事务2 更改后的结果)(这里的随机就是指更改的操作随机发生在缓冲区中,即一会update a,一会update b),这样性能低,但如果不即使刷新就可能丢失缓冲区中的数据,导致前后不一致。后台线程负责刷新脏页,但此时。

2026-06-07 17:15:10 370

原创 【MySQL】锁机制

无需显式使用,在访问一张表时会自动加上。MDL 锁的主要作用是维护表元数据的数据一致性,在表上有活动事务时,不允许对元数据进行写入操作,从而避免 DML 与 DDL 冲突,保证读写的正确性。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于上面的问题,InnoDB 引入了意向锁,意向锁是 InnoDB 在加行锁之前自动给表加的一种标志锁。PS:不用防止在1之前或者3之后插入数据,因为这里是对索引加锁,数据是顺序的,因此插入age=3一定会在3的前后。

2026-06-07 11:29:39 262

原创 【MySQL】SQL优化

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2026-06-01 21:56:08 210

原创 【MySQL】索引

对索引列的值应用哈希函数,计算出固定长度的哈希码(hash code),然后映射到哈希表的某个槽位(bucket),槽位中存储指向实际数据行的指针。SQL 提示是优化数据库的一个重要手段,即在 SQL 语句中加入一些人为的提示,影响优化器的选择(例如一个字段存在联合索引和普通索引,优化器可能选择了非预期的索引)。在MySQL中,支持hash索引的是Memory引l擎,InnoDB中具有自适应Hash功能,Hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。(而不是完整的行数据)。

2026-06-01 17:32:17 469

原创 零拷贝技术

其核心思想是:让数据尽量在内核态内部直接流转,避免在用户态和内核态之间来回复制。传统的 sendfile() 实现(未支持 SG-DMA 或 DMA Gather Copy 的老式网卡/驱动)虽然减少了上下文切换次数,但仍然需要一次 CPU 拷贝,结果共。传统 I/O 方式中,将一个文件从磁盘发送到网络(例如 Web 服务器返回一个静态文件),通常使用 read() + write() 两个系统调用。在现代操作系统中,为了保障系统的安全与稳定,CPU 通常支持两种运行模式:用户态 和 内核态。

2026-05-26 12:34:06 376

原创 Minio基础操作及使用

MinIO 是一个 高性能、Kubernetes 原生、完全兼容 Amazon S3 API 的对象存储服务器。采用 Go 语言编写,单一二进制文件即可启动,支持 Windows、Linux、macOS 以及 Docker/Kubernetes 环境。MinIO 的设计目标是为云原生工作负载提供轻量、快速、可扩展的对象存储,既可以单机运行(用于开发/测试),也可以部署成分布式集群(用于生产环境,实现数据冗余和高可用)。

2026-05-25 23:03:49 585

原创 ES基础指令及原理

Elasticsearch 是一个基于 Apache Lucene 构建的分布式、RESTful 风格的搜索与分析引擎。它能够近乎实时地存储、检索和分析海量数据,通常作为应用程序的核心搜索组件或大数据分析平台的基础。全文搜索:在大量文本中快速找到最相关的内容(例如电商搜索、日志搜索)。结构化聚合分析:对数据进行统计、分组、求平均等运算(例如“过去一小时的错误日志数量”)。

2026-05-25 16:10:02 672

原创 Kafka知识点汇总

Kafka 作为 Apache 基金会的顶级项目,由 LinkedIn 于 2011 年开源,已从最初的消息队列演化为一个成熟的分布式事件流平台——既能做消息缓冲,也能做日志采集、实时数据管道和流处理。需要根据业务逻辑(如用户ID、地区、时间等)自行决定分区号。可以实现 Partitioner 接口,覆盖 partition() 方法。@Override// 自定义逻辑:例如将消息全部发到分区 0return 0;// 省略 close() 和 configure()

2026-05-22 17:44:42 500

原创 常用的向量数据库

传统数据库(如MySQL、PostgreSQL)基于精确匹配——查询“名字=张三”就返回名字完全等于“张三”的记录。但在AI应用中,我们需要的是基于“相似性”的查询:用户输入“一件适合春天的轻薄外套”,引擎需要检索语义上最相似的商品,而不是文本完全匹配的结果。向量是一个由数百个数字组成的数组。使用预训练模型(如BERT、ResNet、OpenAI Embedding等),可以将文本、图像、音频等非结构化数据转换为高维向量嵌入。语义相似的输入在向量空间中也相互靠近。

2026-05-17 22:02:13 420

原创 大模型应用开发框架

直接向 ChatGPT 提问就能得到不错的回答,但这远远不够。真实的应用场景往往要求模型能够:查询实时信息、访问企业私有文档、按照严格的格式输出,甚至与外部系统交互。纯 Prompt 模式 – 最轻量,模型直接回答,适合通用场景。Function Calling – 让模型主动调用工具/API,获取实时数据或执行操作。RAG(检索增强生成) – 为模型外挂知识库,解决知识过时和私有文档问答问题。Fine-tuning(微调) – 用领域数据训练模型,改变其行为或风格,获得最高质量的定制效果。

2026-05-17 21:29:29 343

原创 RabbitMQ知识点汇总

在复杂的分布式系统中,服务间的同步调用会带来强耦合、性能瓶颈、级联故障等问题。随着业务不断扩展,需求越来越多样,系统间的耦合度也急剧增加。此时,消息队列(MQ)作为一种异步通信方式,能够实现服务间的解耦、异步、削峰填谷,成为构建弹性、高可用系统的基石。同步调用的优势在于时效性强,调用方会一直等待被调用方返回结果。拓展性差:增加新的调用链路需要修改代码,无法灵活应对业务变化。性能下降:调用方阻塞等待,吞吐量降低。级联失败:一个下游服务不可用,可能导致整个请求链路失败。

2026-05-16 11:02:59 503

原创 Git常用命令及应用

备份:代码随时可能因为误操作或硬件故障丢失,需要一个安全的远程存储点。代码还原:新功能开发到一半发现方向错了,需要回退到之前某个稳定的版本。协同开发:多人同时修改同一项目,如何有条不紊地合并各自的工作成果。追溯问题:线上出了 Bug,需要快速定位是谁、在什么时间、出于什么目的修改了哪一行代码。为了解决这些问题,版本控制系统(VCS, Version Control System) 应运而生。目前常用的版本控制工具主要有 SVN(Subversion)、CVS 和 Git。

2026-05-10 17:09:48 437

原创 点评项目的业务整体分析

例如上一页最后一列是 m6(时间戳为 6),下一页继续用时间戳 6 和偏移量 1 查询,但 Redis 的 LIMIT offset 是在 Redis 服务端内部计算的,代码需要在客户端循环跳过重复时间戳。需要注意的是,MySQL 的 WHERE id IN (5, 1) 查询结果不会按照 5、1 的顺序返回,因此需要加上 ORDER BY FIELD(id, 5, 1) 来保证查询顺序与参数中的 ID 列表一致。本例中的个人页面,是基于关注的好友来做Feed流,因此采用Timeline的模式。

2026-05-06 21:41:09 399

原创 MyBatis-Plus

MyBatis 的核心思想是将 SQL 语句与 Java 代码解耦。它将 SQL 控制在独立文件或注解中,但又能在运行时与 Java 对象灵活映射。与 Hibernate 等全自动框架不同,它的特色在于半自动机制:开发者需要手写 SQL,但省去了 JDBC 繁琐的结果集转换与连接管理。详细参考。

2026-05-06 11:35:45 400

原创 Redisson

例如下面的例子,Java 应用向 Redis Master 成功写入了锁,此时 Master 突然宕机,而这条锁数据还未同步到 Slave,Sentinel(哨兵)会从 Slave 中选举一个新的 Master,但新的 Master 中并没有 lock 这条数据。在 Redis 主从架构中,如果主节点写入锁数据后未来得及同步到从节点就宕机,从节点升级为主后,锁数据会丢失,其他线程可能重新获取到锁,造成并发安全问题。同时,一旦进程意外退出,Watch Dog 停止续期,锁会在 30 秒后自动释放。

2026-05-04 19:53:35 520

原创 Redis实现分布式锁

在单体应用中,我们可以使用 Java 的 synchronized 或 ReentrantLock 来保证多个线程对共享资源的互斥访问。这些锁都依赖于单一的 JVM 进程——锁监视器存在于同一个堆内存中,不同线程看到的是同一把锁。然而在分布式集群环境下,多个服务实例运行在不同的 JVM 进程中,每个进程都有自己独立的内存空间,单体锁无法跨越 JVM 实现线程互斥。此时就需要一把所有进程都能“看见”的公共锁,这就是分布式锁。

2026-05-04 12:15:34 795

原创 【JAVA Spring面经】Spring 事务失效情况

Spring 事务基于 AOP 动态代理实现,核心流程是:当调用被 @Transactional 标注的方法时,实际调用的是代理对象的方法。代理对象会在方法执行前开启事务,在方法正常结束后提交事务,在方法抛出特定异常(默认 RuntimeException 或 Error)时回滚事务。假设有一个 Service 原始类@Service@Override// ← 核心业务:插入数据库// 这是 Spring 动态生成的代理类(伪代码,实际更复杂)// 持有原始对象@Override。

2026-05-03 21:24:04 729

原创 优惠券秒杀业务分析

上述代码看似可行,但@Transactional 会失效,原因是 Spring AOP 的代理机制。容器注入的是代理对象,代理对象会在调用目标方法前后处理事务(开启、提交/回滚)。如果我们拿到的是原始对象(this)并直接调用,代理根本没机会插手,事务注解自然失效。所有用户争夺同一把锁,锁粒度太粗。→ 改为 只对当前用户 ID 加锁,即 synchronized (userId.toString().intern())。多个线程同时读取库存为 1,都判断“充足”,然后各自扣减,结果库存变成负数。

2026-05-03 20:03:53 204

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2026-05-02 20:33:50 569

原创 缓存更新策略

在真实业务中,数据库的数据会频繁发生变化,而缓存中的数据则是数据库数据的副本。如何保证缓存与数据库的数据一致性,是缓存使用中必须解决的核心问题。常见的缓存更新策略可分为三大类:内存淘汰:Redis 自带的内存淘汰机制,当内存达到 maxmemory 上限时,自动按规则淘汰部分 key,是一种被动的、无需人工参与的手段。超时剔除:给缓存设置过期时间(TTL),到期自动删除。这是最简单有效的最终一致性保证,任何缓存数据都应该设置合理的过期时间。

2026-05-02 15:37:34 548

原创 Session粘滞性问题->Redis实现session共享

两个拦截器为了解决Redis中token的过期时间问题,如果只设置一个拦截器,用户每次访问需要UserDTO登录校验的界面,会刷新token过期时间,但是如果访问商家页面这种不需要登录校验,此时token的过期时间就没有刷新。ThreadLocal相当于备份了Redis中的UserDTO数据,对于该次请求(该次线程)ThreadLocal中的数据存在,方便进行显示,不用再去Redis中查看了。此时Redis中存储的数据如下,code对应验证码校验,token存储对应的用户 UserDTO。

2026-04-29 19:14:36 657

原创 嵌入模型及其接入

如果我们对比它们的嵌入向量,计算出的余弦相似度可能高达 0.92,说明它们的语义方向非常接近。(大规模文本嵌入基准测试,Massive Text Embedding Benchmark)评测是最权威的嵌入模型评测榜单,覆盖了分类、聚类、配对分类、重排序、检索、语义文本相似度、摘要和双语挖掘等多达八个维度的任务,每个模型会得到一个综合平均分和各细分任务的独立得分。嵌入模型自身并不真正“理解”自然语言,而是通过捕捉不同数据在嵌入空间中的距离远近,挖掘它们背后隐藏的语义关系,通过数学运算模拟出对语言的理解能力。

2026-04-29 15:07:02 402

原创 TreadLocal和TreadLocalMap

get方法会先获取当前线程。key 使用弱引用,如果 key 是强引用,即使我们在代码中把 ThreadLocal 对象设为 null,ThreadLocalMap 中的 Entry 仍然强引用了它,导致它无法被GC回收,从而造成内存泄漏。InheritableThreadLocal 解决了这个问题,在创建子线程的瞬间,它将父线程的本地变量复制给子线程。输出结果:线程1打印"张三",线程1的threadLocal1打印"aaa",线程2打印"李四",主线程打印"null"——三个线程互不影响。

2026-04-28 17:08:27 978

原创 【JAVA基础面经】Java中的引用类型

JVM 会将关联的虚引用加入到引用队列中,程序可以通过监控这个队列来得知对象即将被回收,从而在回收之后做一些资源清理(如释放堆外内存)。只要强引用还存在,垃圾收集器就永远不会回收掉被引用的对象。虚引用通过 java.lang.ref.PhantomReference 类实现,它是最弱的引用类型。软引用通过 java.lang.ref.SoftReference 类实现,它比强引用弱一级。强引用是 Java 中最常见的引用类型,也就是我们平时直接 new 出来的对象赋值。虚引用就像根本不存在的绳子。

2026-04-28 16:33:28 372

原创 基于 SDK 进行 Openai 接入

【代码】基于 SDK 进行 Openai 接入。

2026-04-26 19:55:29 72

原创 通过 ollama 本地接入大模型

【代码】通过 ollama 本地接入大模型。

2026-04-26 17:34:46 223

原创 Postman 调用 Deepseek 的 API 教程

2026-04-26 16:32:11 160

原创 JWT 令牌

JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象形式安全地传输信息。简单理解,JWT就是经过签名的JSON,常用于身份认证和信息交换。

2026-04-24 22:15:45 354

原创 Redis基础

Redis 就是一个运行在内存中的、支持多种数据结构的 NoSQL 数据库Redis(Remote Dictionary Server)(远程字典服务)是⼀种基于键值对(key-value)的 NoSQL 数据库,其数据主要存储在内存中,而非硬盘,因此读写速度极快。

2026-04-24 21:05:33 424

空空如也

空空如也

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

TA关注的人

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