- 博客(101)
- 收藏
- 关注
原创 Hot100 哈希题型思路解法
本文总结了三个使用哈希表解决的算法问题:1)两数之和,通过哈希表存储元素和索引,快速查找目标差值;2)字母异位词分组,将排序后的字符串作为键分组;3)最长连续序列,采用动态规划或哈希表存储数字及其序列长度。三种解法均利用哈希表优化了时间复杂度至O(n),空间复杂度也为O(n)。哈希表在高效查找和分组数据方面展现出强大优势。
2025-06-11 09:43:16
366
原创 Redis-ZipList实现原理
ZipList 是一种特殊的“双端链表”由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为 O(1)。
2025-06-09 10:41:13
83
原创 如何实现高可用评论服务
可以把前N条评论按照热度展示,后N条仍然按照时间顺序排序,这意味着同一条评论可能同时出现在热度和时间里面,当进行分页查询时,需要判断上次读取是热度还是时间,所以入参需要有标识,如果是热度,本次继续是热度(可能不够,那就夹杂时间),如果是时间,本次继续是时间
2025-06-09 10:37:11
1047
原创 设计模式-结构型模式(详解)
适配器模式、桥接模式和组合模式是三种常见的设计模式,分别用于解决不同的问题。适配器模式通过将一个类的接口转换为客户端期望的接口,解决接口不兼容问题,分为类适配器和对象适配器。
2025-05-23 21:18:22
1227
原创 设计模式-行为型模式(详解)
模板方法、策略模式和责任链模式是三种常见的行为型设计模式,分别用于解决不同的设计问题。模板方法模式通过定义算法的骨架,将不变部分放在抽象类中,可变部分由子类实现,实现代码复用和扩展。策略模式通过定义策略接口和具体策略实现,允许在运行时动态选择策略,提升系统灵活性和可扩展性,适用于多策略场景如支付方式切换。责任链模式将多个对象连接成链,请求沿链传递,直到某个对象处理为止,常用于日志处理、过滤器等场景。
2025-05-23 21:17:18
967
原创 系统性能优化指标
面试官询问性能优化相关工作时,旨在考察面试者的实际经验和理论理解。面试者应详细描述其性能优化经验,并阐述对性能优化指标的理解,如吞吐量、响应时间和并发数。吞吐量涉及系统单位时间内的请求处理能力,常用指标包括QPS和TPS。
2025-05-21 21:32:38
287
原创 Redlock算法和底层源码分析
lock()加锁关键逻辑 || ------------------------------------------------------------ || 加锁的Lua脚本,通过redis里面的hash数据模型,加锁和可重入性都要保证 || 加锁不成,需要while进行重试并自旋 |
2025-05-17 11:06:44
741
原创 bitmap/hyperloglog/GEO详解与案例实战
本文探讨了如何处理亿级用户访问量的大数据统计问题,提出了“存得进、取得快、多维度”的核心思路。通过Redis的多种数据结构(如Set、Zset、Bitmap、HyperLogLog等)实现聚合统计、排序统计、二值统计和基数统计。重点介绍了HyperLogLog的概率算法,通过分桶和Kmax估算去重数据量,适用于UV、PV等统计场景,误差仅为0.81%,且内存占用低。此外,还介绍了Redis的GEO命令,用于地理位置计算,如添加坐标、获取距离等,并提供了代码实例。整体方案旨在高效处理海量数据,满足实时统计需求
2025-05-17 11:01:05
978
原创 分布式ID全解决方案
分布式ID是分布式系统中用于唯一标识数据的ID,尤其在分库分表场景中至关重要。它需满足全局唯一、高性能、高可用、方便易用和安全有序递增等要求。常见的实现方案包括基于数据库和雪花算法。基于数据库的方案通过批量生成ID提升性能,但存在单点问题和安全性隐患。雪花算法利用时间戳、机器ID和自增序列生成ID,具有有序性和灵活性,但依赖时钟且可能发生时钟回拨。在实际应用中,如订单系统,分布式ID用于生成订单号、优惠券码等,确保唯一性和安全性。通过预处理思想和本地缓存,可以优化ID生成性能,避免数据库故障或时钟回拨带来的
2025-05-15 14:09:08
589
原创 LangChain4j +DeepSeek大模型应用开发——10 检索增强生成 RAG
例如,在处理一般性的文本资料,且使用的模型上下文窗口较大(如 4096 个 token)时,设置文本片段最大大小为 600 - 800 个 token,重叠部分为 30 - 50 个 token 可能是一个不错的选择。但最终的设置还需要通过实验和实际效果评估来确定,以找到最适合具体应用场景的参数值。
2025-05-15 13:32:15
1079
原创 亿级流量系统架构设计与实战 一
本文探讨了高并发架构的基础组件及其优化策略。首先介绍了DNS轮询、LVS和Nginx的工作原理及其在负载均衡中的应用。LVS作为网络层的转发工具,能够提升系统的高并发处理能力,而Nginx则在应用层提供代理服务,增强系统的稳定性和可扩展性。文章还讨论了服务注册中间层的故障处理机制,以及如何通过增量推送和集群部署来缓解服务地址变动带来的推送风暴。最后,文章分析了高并发架构的三个关键指标:高性能、高可用性和可扩展性,并提出了相应的优化策略,如使用PCTn指标衡量性能、确保系统可用性达到99.95%以上,以及通过
2025-05-08 21:22:27
656
原创 后端设计题---说说扫码登录的实现?
核心就是二维码,然后二维码可以 由前端或者后端生成,然后这块需要在二维码中。比如 在用户打开前端登录页面时,前端通过请求服务器生成一个唯一的二维码。前端轮询(长连接,websocket)请求服务器,获取二维码状态。移动端确认登录后,再次向后端发起请求,后端就更新token状态为。这个token也会设置一个有效期,过期了二维码就失效了。,同时把用户基本信息 解析出来,返回给移动端,问。,并携带token令牌,向后端发出扫描请求。,把用户信息传给电脑端,完成登录操作。用户移动端扫描二维码后,这块就是。
2025-05-06 14:42:42
151
原创 编译原理期末重点-个人总结——2 文法与语言
α→β或α∷=βα称为规则的左部(或生成式的左部)β称为规则的右部(或生成式的右部)文法习惯上只将产生式写出,用尖括号括起的是非终结符,否则为终结符。
2025-05-05 17:55:24
813
原创 编译原理期末重点-个人总结——1 概论
计算机语言的分类低级语言:机器语言(唯一能被计算机执行的),汇编语言高级语言:JAVA ,C++执行高级语言或汇编语言的步骤高级语言程序或汇编语言程序==> (通过解释 或 翻译)转成机器语言==>运行机器语言程序解释程序⭐核心就是边解释边执行源程序本身翻译程序把一种语言的程序翻译成另一种语言的程序 ,包括如下编译程序⭐源语言(高级语言)==> 目标语言(低级语言,如汇编或机器语言)汇编程序源语言(汇编语言)==> 目标语言(机器语言)过程高级语言程序的处理过程。
2025-05-05 17:47:29
216
原创 基于注解脱敏+链路追踪traceId 快速定位错误
脱敏注解相关方法加上注解后隐藏参数信息,脱敏前 密码没加密时会暴露用户密码等敏感信息//可以用在参数列表或者方法上,屏蔽不愿意记录的参数日志配置展示TraceId。
2025-05-04 11:38:05
1275
原创 LangChain4j +DeepSeek大模型应用开发——8 Function Calling 函数调用
Function Calling 函数调用也叫Tools 工具`
2025-05-04 11:29:37
323
原创 LangChain4j +DeepSeek大模型应用开发——7 项目实战 创建硅谷小鹿
这部分我们实现硅谷小鹿的基本聊天功能,包含聊天记忆、聊天记忆持久化、提示词。
2025-05-01 11:09:15
710
原创 LangChain4j +DeepSeek大模型应用开发——6 提示词
如果要显示今天的日期,我们需要在提示词中添加当前日期的占位符{{current_date}}设定角色,塑造AI助手的专业身份,明确助手的能力范围。中的内容每次都会被和用户问题组织在一起发送给大模型。**@UserMessage:**获取用户输入。如果有两个或两个以上的参数,我们必须要用。一起发送给大语言模型(LLM)。SystemMessaged的内容。结合使用 动态编写占位符,明确指定传递的参数名称。类的chat方法上添加。的内容将在后台转换为。中添加方法chat3。
2025-05-01 11:07:13
313
原创 LangChain4j +DeepSeek大模型应用开发——5 持久化聊天记忆 Persistence
MongoDB 是一个基于文档的 NoSQL( 非关系型的数据库 ) 数据库,设计理念是为了应对大数据量、高性能和灵活性需求。MongoDB使用集合()来组织文档(Documents),每个文档都是由键值对组成的。数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
2025-04-29 20:43:07
867
原创 LangChain4j +DeepSeek大模型应用开发——4 聊天记忆 Chat memory
由多个组件(大模型,聊天记忆等)组成的时候,我们就可以称他为。可以封装多轮对话的复杂性,使聊天记忆功能的实现变得简单。很显然,目前的接入方式,大模型是没有记忆的。为每个用户的新聊天或者不同的用户区分聊天记忆。测试聊天记忆的隔离效果。
2025-04-29 13:20:36
190
原创 LangChain4j +DeepSeek大模型应用开发——3 人工智能服务 AIService
AIService使用面向接口和动态代理的方式完成程序的编写,更灵活的实现高级功能。在LangChain4j中我们使用AIService完成复杂操作。底层组件将由AIService进行组装。为大语言模型格式化输入内容解析大语言模型的输出结果聊天记忆 Chat memory工具 Tools检索增强生成 RAG。
2025-04-28 18:14:54
468
原创 LangChain4j +DeepSeek大模型应用开发——2 接入其他大模型
而 Ollama 本地部署,只需一次性投入硬件成本,对于需要频繁使用大语言模型且对成本敏感的用户或企业来说,能有效节约成本。它集成了阿里的通义系列大模型和第三方大模型,涵盖文本、图像、音视频等不同模态。部署流程简单:只需通过简单的命令 “ollama run < 模型名>”,就可以自动下载并运行所需的模型。将配置参数上的base-url参数指定到百炼平台,使用百炼上的大模型名称和apiKey即可。为了apikay的安全,建议将其配置在服务器的环境变量中。(2)查看模型列表,选择要部署的模型,
2025-04-28 15:40:20
907
原创 LangChain4j +DeepSeek大模型应用开发——1 入门
LangChain4j 的目标是简化将大语言模型集成到 Java 应用程序中的过程。
2025-04-26 22:13:16
681
原创 SpringAI+DeepSeek大模型应用开发——5 ChatPDF
目前已经有了以下这些工具PDFReader:读取文档并拆分为片段;向量大模型:将文本片段向量化;向量数据库:存储向量,检索向量;要解决大模型的知识限制问题,需要外挂知识库;受到大模型上下文限制,知识库不能直接拼接在提示词中;需要从庞大的外挂知识库中找到与用户问题相关的一小部分,再组装成提示词;这些可以利用文档读取器、向量大模型、向量数据库来解决;RAG要做的事情就是将知识库分割==>利用向量模型做向量化==>存入向量数据库==>查询的时候去检索;每当用户询问AI时,
2025-04-18 17:20:51
1709
1
原创 SpringAI+DeepSeek大模型应用开发——4 对话机器人
前面的两种方案,都面临一个问题,SpringAI中的Message类未实现Serializable接口,也没提供public的构造方法,因此无法基于任何形式做序列化。所以必须定义一个可序列化的Message类,方便后续持久化。定义一ai.entity.po@Data//将SpringAI的Message转为我们的Msg//实现将我们的Msg转为SpringAI的Message基于Redis来实现自定义ChatMemory;包中新建一个RedisChatMemory。
2025-04-17 21:36:03
1336
2
原创 SpringAI+DeepSeek大模型应用开发——3 SpringAI简介
模型能够接收的输入类型、输出类型不一定相同。SpringAI整合了全球(主要是国外)的大多数大模型,而且对于大。目前SpringAI支持的大约19种对话模型,以下是一些功能对比。其中功能最完整的就是OpenAI和Ollama平台的模型了。的三种技术架构都有比较好的封装和支持,开发起来非常方便;
2025-04-17 11:27:49
307
原创 SpringAI+DeepSeek大模型应用开发——2 大模型应用开发架构
中检索出与查询最相关的文档片段。: 将检索到的文档片段与原始查询一起输入到大模型(如chatGPT)中,注意使用合适的提示词,比如原始的问题是XXX,检索到的信息是YY,给大模型的输入应该类似于: 请基于YYY回答XXXX。,就是在预训练大模型(比如DeepSeek、Qwen)的基础上,通过企业自己的数据做进一步的训练,使大模型的回答更符合自己企业的业务需求。由于每次都是从向量库中找出与用户问题相关的数据,而不是整个知识库,所以上下文就不会超过大模型的限制,同时又保证了大模型回答问题是基于知识库中的内容;
2025-04-17 10:54:29
1487
原创 SpringAI+DeepSeek大模型应用开发——1 AI概述
而Spring公司推出的SpringAI框架,充分利用了Spring框架中AOP、IOC的能力,可以与现有的Java项目无缝融合,非常方便;初级-大模型函数调用:模型感觉要调用某个工具==>生成一段API调用文本==>过滤器识别==>找到对应的功能函数去调用==>返回答案。感知能力:海量文本训练,接收用户输入文本,,PDF,图片==>OCR==>转成文本,但是会损失很多信息,如颜色布局,色调等。基础模型(V3):通用模型,高效便捷,适用于绝大多数任务, “ 规范性”任务 ,聪明且听话……
2025-04-16 21:45:15
1084
1
原创 负载均衡的实现方式有哪些?
负载均衡实现方式常见的有:扩展二层负载均衡:在数据链路层,基于MAC地址进行流量分发,较少见于实际应用中三层负载均衡:在网络层,基于IP地址来分配流量,例如某些路由器上的负载均衡功能四层负载均衡:在传输层,根据IP地址和TCP/UDP端口号来做决策,直接操作网络包进行转发七层负载均衡:在应用层,可以解析HTTP等协议内容,根据URL、Cookie等信息做更复杂的路由逻辑。
2025-04-16 10:47:20
734
原创 数据一致性策略之延迟双删-实现
查询数据之前优先去查Redis的缓存数据,减少数据库压力;这个时候你可以在加锁完成之后,去数据库查询之前,再查询一次缓存,这样你就可以减少一次数据库查询。导致A修改数据库后,C来读到没有修改的Redis旧数据 ,导致Redis和数据库不一致的情况。在去查询数据库之前,首先检查一遍缓存有没有,一般是缓存没有,才去查数据库,然后写入缓存。但是可能在你获取锁的这段期间,缓存已经更新一次了,这个时候你去查数据库就是没有必要的。正常情况:A->B->C->D 并发情况下就会存在A->C->D->B。
2025-04-16 10:43:34
257
原创 Seata 支持哪些模式的分布式事务?
以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。二阶段正常提交:因为数据库操作没有异常,无需回滚“业务 SQL”在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的undo_log快照数据和行锁删掉,完成数据清理即可异常情况 需回滚回滚方式是用“before image”还原业务数据。
2025-04-11 09:21:14
645
原创 Seata框架,如何保证事务的隔离性?
我们知道,在一阶段后,RM 的分支事务其实已经提交了,这时候在数据库层面来说就是读已提交,但是站在整个全局视角来说,只要二阶段还没执行提交或者回滚,整个全局事务都是处于未提交的阶段。tx1 先开始,开启本地事务,拿到本地锁,更新操作 m = 1000-100=900,本地事务提交前,先拿到该记录的。如果 tx1 的二阶段全局回滚,则 tx1 需要重新获取该数据的本地锁,进行反向补偿的更新操作,实现分支的回滚。拿 全局锁 的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。
2025-04-10 09:40:05
662
原创 多级缓存模型设计
为了有效避免缓存击穿、穿透和雪崩的问题。最基本的缓存设计就是从数据库中查询数据时,无论数据库中是否存在数据,都会将查询的结果缓存起来,并设置一定的有效期。后续请求访问缓存时,如果缓存中存在指定Key时,哪怕对应的Value值为空,也会将数据返回给客户端,客户端根据具体情况进行处理。业务设计上,如果从数据库中未查询到对应的数据,直接将nul或者空字符串等保存到缓存中,一方面是在代码的可能读性上比较差,不便于后期的维护,另一方面对于混合型缓存的实现上缺乏有效的逻辑处理能力。
2025-04-08 10:44:24
475
原创 秒杀场景多级缓存设计
本地缓存基于Cafine 实现,在设计本地缓存时,会将本地缓存的容量设置为15,过期时间设置为5秒,并且在设计本地缓存时,会基于版本号机制来实现缓存的失效策略。也就是说,在很小的一段时间内,允许缓存中的数据存在延迟,允许缓存中的数据与数据库中的数据在短时间内的不一致,只要在可接受的时间范围内。优先读取本地缓存数据,如果本地缓存失效,则读取分布式缓存数据,并且在同一时刻,只能有一个线程更新本地缓存,防止缓存击穿。注意: 在刷新分布式缓存时,并不会同时刷新本地缓存的数据,本地缓存采用自身的缓存刷新机制。
2025-04-05 13:51:54
757
原创 Sprring AOP封装分布式锁注解+ 弹性扩展
通过抽象接口和工厂模式依赖接口而非实现:业务代码仅依赖接口,与具体实现(Redisson、ZooKeeper 等)解耦。动态切换实现:通过注解,可以在 Spring Boot 的配置文件中动态指定锁的类型(如或zookeeperSpring 容器会根据配置加载对应的工厂类(如或),而业务代码无需任何修改。添加新实现:实现的子类配置切换:在中修改配置零侵入性:业务代码只需通过获取锁实例,无需感知具体实现。/*** 锁key(支持SpEL表达式)
2025-04-05 13:46:29
774
原创 为什么 JDK 1.8 对 HashMap 进行了红黑树的改动?
举个例子,一个节点反复添加,从8变成9,链表变红黑树,又删了,从9变成 8,又从红黑树变链表,再添加,又从链表变红黑树?因为红黑树节点的大小是普通节点大小的两倍,为了节省内存空间不会直接只用红黑树,只有节点到达定数量才会转成红黑树。这就是基于时间和空间的平衡了,红黑树占用内存大,所以节点少就不用红黑树,冲突很多,就用红黑树。同样也是为了平衡时间和空间,节点太少链表遍历也很快,没必要用红黑树,变成链表节约内存。因为红黑树的查找,更新的时间复杂度是 O(log_2n ),但。,防止链表超长时性能下降。
2025-04-01 09:56:46
320
原创 Java结合HotKey进行热点探测
根据官方压测: 一台8核 8G 的机器,每秒可以处理来自于数千台服务器发来的高达 16 万个的待测 key,8 核单机吞吐量在 16 万,16 核机器每秒可达 30 万以上探测量,所以仅采用 10 台机器,即可完成每秒近 300 万次的 key 探测任务。当客户端发送写请求时,领导者首先将写操作写入自己的日志中,并将写操作的日志分发给其他节点,其他节点收到日志后也将其写入自己的日志中。同理如果一道题访问的频率特别高,此时可以将其自动缓存在本地或者 Redis 中,提高访问性能的同时,降低数据库的压力。
2025-04-01 09:52:17
1145
原创 秒杀系统高并发大流量的应对之道
来实现,主要是设置并发数限流,可以通过自定义线程池,配置最大的连接数,以请求队列的长度和拒绝策略等参数进行限流,如果队列已满,并且已经达到最大的线程数,多余的请求就会根据具体的拒绝策略进行处理,以达到限流的目的和效果。光有缓存还不够,在处理的数据上要尽量少,不要查询或者返回无关紧要的数据。对整个秒杀活动进行风控处理,风控系统的建设不是一朝一夕就能完成的,建立风控的过程也是比较困难的,这需要建立在大量数据的基础之上,不断的完善用户的画像,需要通过复杂的业务场景的考验,不断的修正风控模型。
2025-03-30 15:35:47
932
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人