- 博客(84)
- 收藏
- 关注
原创 AI实践指南:AGENT、RAG和MCP在Java中的简单实现
AGENT(AI Agent)就像是一个能够"思考"和"行动"的智能助手。与普通的AI模型不同,AGENT不仅能理解和生成内容,还能根据目标采取行动,比如调用API、使用工具或执行任务。想象一下,普通AI就像是一个只会回答问题的顾问,而AGEN则是一个既能回答问题,又能帮你完成工作的助手。RAG(Retrieval-Augmented Generation)是一种让AI回答更准确的技术。
2025-05-03 11:14:25
862
原创 缓存与数据库一致性方案
在现代分布式系统中,缓存作为数据库的前置层,能显著提升系统性能。然而,缓存与数据库之间的数据一致性是一个经典难题。以下是三种常见的缓存更新策略及其优缺点分析。中小型系统:直接采用方案三(更新DB+删除缓存)配合简单重试机制大型分布式系统:引入Binlog+MQ的异步方案建立完善监控体系关键业务数据:可考虑短暂加锁保证强一致性牺牲部分性能换取绝对准确最终选择应权衡:业务对一致性的要求级别系统性能需求团队技术储备运维监控能力。
2025-04-23 10:47:18
833
原创 JVM运行时数据区内部结构难记?一个例子优化记忆
顾客 A 的小票写着“现在该结账第 3 件商品了”,顾客 B 的小票写“第 1 件”。:超市有个柜子,里面放着商品目录(类信息),比如“可乐:2 元/瓶,生产商:可口可乐公司”,还有固定记录(常量),“超市营业时间:8:00-22:00”。:顾客 A 拿了个篮子,先放一瓶可乐(调用方法 A),再放一袋薯片(调用方法 B)。:每个线程的“小本子”,记录顾客(线程)买东西走到哪一步了,防止乱套。:超市的“大仓库”,所有顾客共享,存放各种商品(对象)。:所有人共用,变化少,像超市的“档案室”。
2025-03-21 17:45:39
862
原创 JVM运行时数据区内部结构
对于jvm来说他的内部结构主要分成三个部分,分别是类加载阶段,运行时数据区,以及垃圾回收区域,类加载我们放到之后来总结,今天先复习一下类运行区域首先这个区域主要是分成如下几个部分下面举个例子来解释一下。
2024-12-16 20:39:52
512
原创 慢SQL优化方向
使用一些监控工具,比如 Percona Monitoring and Management (PMM) 或 Datadog,来实时监控数据库的性能,并定期审查和优化慢查询,确保数据库始终保持高效。此外,我会使用一些性能分析工具,比如EXPLAIN,来分析查询的执行计划,找出性能瓶颈。比如,增加 InnoDB 缓冲池的大小,让更多的数据可以缓存在内存中,减少磁盘 I/O 操作。首先,我会检查查询语句本身。比如,使用表分区来处理大表,或者根据实际需要在规范化和反规范化之间做出平衡,以减少复杂的JOIN操作。
2024-11-04 22:09:37
1040
1
原创 RabbitMQ怎么保障消息的可靠性
RabbitMQ通过生产者确认机制、消息持久化、镜像队列、消费者手动确认、死信队列等多层机制,从生产者、Broker、消费者和传输过程四个角度入手,建立了消息可靠性保障体系。RabbitMQ在底层实现上充分考虑了I/O优化、协议可靠性、连接恢复等因素,确保了消息在高并发和网络波动环境下的高可靠性。
2024-10-31 21:37:04
786
原创 Java如何实现站内消息系统的设计与实现
在现代互联网应用中,站内消息系统是一个不可或缺的功能模块,广泛应用于社交平台、电子商务网站以及在线学习系统等。这种系统能够向用户发送系统通知、事件提醒,并允许用户自定义消息设置。本文将详细探讨这三个模块的设计与实现,旨在帮助开发者理解站内消息系统的构建思路。
2024-10-25 22:15:38
2256
原创 Java 实现协同过滤算法推荐算法
基于用户的协同过滤:根据用户之间的相似性推荐物品。例如,如果用户A和用户B的评分相似,那么用户A喜欢的物品也可能会被推荐给用户B。基于物品的协同过滤:根据物品之间的相似性进行推荐。如果用户对物品X给出了高评分,且物品Y与X相似,那么物品Y会被推荐给用户。
2024-10-22 22:08:43
3138
原创 采用分布式锁机制解决Gateway配合Redis实现统一鉴权及分布式会话共享数据不一致问题
通过引入分布式锁机制,能够有效解决Gateway配合Redis实现统一鉴权及分布式会话共享时的数据不一致问题。具体而言,分布式锁确保了在高并发场景下,只有一个请求能够对token和会话信息进行修改,从而避免了数据冲突和不一致的情况。在实际系统设计中,除了分布式锁外,还可以结合乐观锁、事件驱动、缓存策略等技术手段,进一步增强系统的可靠性和一致性,提升用户体验和系统性能。
2024-10-20 16:07:28
1579
原创 MySQL 主从同步延迟的原因分析与优化解决方案
MySQL 主从同步延迟的产生有多方面的原因,包括主服务器负载、从服务器性能、网络延迟、大事务处理、锁争用以及配置问题。通过优化服务器性能、调整复制配置、使用并行复制和半同步复制等方法,可以有效减少同步延迟,提升数据复制的效率和一致性。通过针对性地分析与调整,企业可以确保 MySQL 数据库在高并发、海量数据的情况下依然保持高效的主从同步,减少因延迟带来的业务影响。
2024-10-15 22:16:56
2309
原创 解析 MySQL 查询优化:提升性能的十个关键策略
虽然索引能提升查询速度,但也会增加维护索引的成本,过多的索引会导致写入性能下降,因此需要在查询效率和写入效率之间找到平衡。: 如果需要对某个字段进行计算,最好在应用程序层完成计算,并将结果传递给查询,而不是在查询中进行计算或使用函数。:在小表中全表扫描的代价较小,通常不需要创建过多的索引,但在大表中,全表扫描会显著拖慢查询速度。:MySQL的查询优化器有时在面对参数化查询时无法充分确定使用哪个索引,这可能导致性能下降。值判断,索引将不起作用。: 在查询时明确指定索引,确保查询能尽可能利用已有的索引结构。
2024-10-14 22:07:49
3440
原创 RabbitMQ 如何保证消息不丢失?
要保证 RabbitMQ 的消息不丢失,需要从生产者、路由过程、消费者和 Broker 端采取一系列措施。消息丢失的常见原因包括:生产者发送失败、消息路由失败、消费者处理异常,以及 RabbitMQ 服务宕机未持久化。为解决生产者端的消息丢失问题,可以采用事务机制或发布确认机制,确保消息成功发送并得到确认。路由过程中,可以通过mandatory参数或设置备份交换机来处理路由失败的情况,确保消息到达队列。消费者端则应使用手动确认模式,保证消息处理完成后才返回 ACK,避免因处理失败导致消息丢失。
2024-10-13 22:12:45
3143
原创 如果要存IP地址,用什么数据类型比较好?(java)
存储IP地址需要考虑到IPv4和IPv6的不同特点,以及系统的需求。我们可以从字符串、整数和二进制三种常用方式来讨论如何高效存储和处理IP地址。IPv6的地址长度为128位,通常以十六进制格式表示,比IPv4更复杂。常用的存储方式包括字符串、二进制和整数分段存储。根据具体需求,可以选择适合的存储方式:对于IPv4来说,32位整数存储()是比较好的选择。而对于IPv6,使用二进制存储()更为高效,因为IPv6的整数存储方式较为复杂。
2024-10-11 21:33:04
2201
原创 让你设计一个秒杀系统,你会考虑哪些问题?
高并发瞬时流量:秒杀活动通常会引发大量用户同时抢购。热点数据:特定商品会成为热门,导致对该商品的高频请求。数据量大:秒杀活动产生的订单和用户数据量巨大。库存的正确扣减:需要确保库存准确,避免超卖或少卖。黄牛抢购:防止黄牛利用脚本等手段大量抢购商品。重复下单:防止用户重复下单,占用库存。对普通交易的影响:秒杀活动可能影响其他正常交易流程。
2024-10-11 21:27:40
2023
原创 40亿个QQ号,限制1G内存,如何去重?
在处理大规模数据时,特别是对于10位数字的QQ号去重,我们常常面临存储空间不足的问题。在位图中,每个数字只需要占用1个bit。通过使用位图技术,我们可以在大规模数据处理时大幅度节省内存空间,并有效地实现10位数字QQ号的去重。通过这种方式,将所有QQ号放入位图后,所有值为1的位置表示存在,不为1的位置表示不存在。对于相同的QQ号,只需设置一次1,因此可以有效地完成去重。考虑到数据中存在重复,1GB的空间显然是不够用的。完成去重后,我们可以遍历位图,将所有值为1的索引提取出来,便得到了去重后的QQ号列表。
2024-10-10 21:09:30
1905
原创 Redis 数据结构底层详解
Redis 是一种开源的高性能键值存储数据库,以其极快的读写速度、丰富的数据结构和简单的操作接口,广泛应用于缓存、消息队列、会话管理、排行榜等场景。本文将深入探讨 Redis 中常用数据结构的底层实现,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)有序集合是一种带有分数的集合,集合中的每个元素都有一个分数,Redis 会按照分数对集合中的元素进行排序。有序集合的底层使用了。集合类型适用于存储去重的数据集合,比如用户的好友列表、标签列表等。
2024-10-08 20:50:20
3098
原创 Java 实现 Feed 流实时更新数据的设计与实现
在现代社交媒体、新闻推送等场景中,Feed 流(Feed Stream)作为一种常见的数据展示形式,已经成为了用户获取实时信息的主要方式之一。Feed 流可以动态地向用户展示所关注的内容,例如微博的动态、朋友圈的状态更新等。
2024-10-08 20:47:24
3072
原创 如何进行SQL调优?
SQL调优是面试中常见的问题,考察候选人对SQL性能优化的理解和掌握程度。有效的SQL调优可以显著提升系统性能和响应时间,以下是进行SQL调优的一些步骤和策略。
2024-09-26 22:04:43
3756
原创 面经宝典【1】-拼多多
这个专题我主要想的是吧这些面经题目给整合起来,自己时不时可以看看然后回答回答,然后再根据一些面经去查漏补缺,具体的答案我都记录在在自己的语雀笔记当中,如果想要的可以私聊我,当然这些答案一般在网上都能找到。今天要分享的是网上拼多多一面的内容HashMap 数据结构为什么HashMap树化的阈值是 8,反树化的阈值是 6HashMap 是线程安全的吗?多线程情况下会有什么问题Java 线程安全的 Map 有哪些ConcurrentHashMap 的底层实现。
2024-09-24 22:02:04
3759
原创 如果在事务中使用update语句更新但是条件中没有使用主键,会使用什么级别的锁?
使用主键/唯一索引:通过索引定位记录,并加行级锁。不使用主键或唯一索引:全表扫描,找到符合条件的记录后加行级锁,但可能影响性能,尤其在数据量较大时。
2024-09-23 20:03:23
3870
原创 订单到期如何实现关闭?
电商、支付等系统中,一般都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的话,就需要把之前的订单(支付单)取消掉。这种类似的场景有很多,还有比如到期自动收货、超时自动退款、下单后自动发送短信等等都是类似的业务问题那么我们应该怎么做才能更好的实现关闭呢?
2024-09-22 20:02:48
4632
原创 1000w条数据插入mysql如何设计?
批量插入减少网络和事务开销。事务控制减少频繁的事务提交。是导入海量数据的最快方式。禁用索引与自动提交避免索引更新和事务管理的开销。分批处理避免一次性插入过多数据导致性能瓶颈。调优MySQL参数提升系统的整体插入性能。
2024-09-19 11:43:24
4594
原创 Redis在单线程下删除大Key会发生什么?怎么删除大Key?
大Key是指在缓存系统(如Redis)或分布式存储中,单个键(Key)对应的数据量非常大,通常存储的是大块数据结构,例如包含大量数据的哈希表、列表、集合或有序集合。这种大Key往往会对系统的性能和稳定性产生不利影响。在单线程的情况下,删除一个大key会导致阻塞操作,增加系统延迟,影响其他请求的响应时间。为了避免这些问题,可以采用分批删除、后台删除、数据分片等策略来优化删除大key的操作。
2024-09-14 21:36:13
4227
原创 如何解决分布式锁占用不释放的场景
设置过期时间是最基础的方案,适用于简单的分布式锁需求。租约机制更适合任务执行时间不确定且可能较长的场景。心跳检测用于在需要实时监控节点存活状态的场景下,提供更为细致的锁管理。监控和报警是一个补充措施,用于在锁机制失效时提供人工干预。
2024-09-11 21:56:45
4913
原创 如何知道服务的QPS?
服务能力梳理的第一步是明确接口及其场景,通过预估流量得到每个接口的 QPS 需求。在确定机器配置时,建议关注 CPU 和内存的使用情况。对于 CPU 高并发的场景,更多的机器可以分担负载,提升容错性。通过压测,可以得到服务的实际 QPS 承载能力。单接口压测和场景化压测都有各自的作用,通常压单个接口可以测试其性能上限,而场景化压测更接近实际业务场景。最后,通过合理的扩容,可以线性地提升服务的 QPS,并确保系统在高流量场景下的稳定性。
2024-09-10 22:20:05
4286
原创 大规模数据去重场景
首先对于这种大规模数据,不太好一个个比较找出重复数据,不仅时间长,数据库也会进行大量的io操作,还有可能造成内存泄漏。目前对于这种场景我是总结了两种方法,如有更好的方法也欢迎一起讨论。举个例子来说:Job 扫描数据:将数据放入 MQ:MQ 中的数据: 消费者处理消息:举个例子来说:例如:
2024-09-09 21:22:05
3462
原创 处理项目幂等场景
在计算机科学中,幂等性通常指的是某些操作或接口的特性。这些操作可以安全地被重复执行多次,而不会对系统产生不同的结果或副作用。支付系统如果用户提交了一个支付请求,幂等的设计可以确保无论支付请求被发送多少次,账户的余额只会被扣除一次。文件上传如果上传一个文件,重复上传相同的文件可以设计成只保存一次文件,避免重复文件的存储。数据插入如果插入某条记录,设计成幂等的插入操作可以确保即使同一记录插入多次,数据库中只有一条记录存在.
2024-09-08 16:58:44
3742
原创 反转二叉树(递归非递归解决)
递归解法:简洁直观,代码简单易懂,但可能受到递归深度的限制。非递归解法:避免了递归栈的开销,适合树的深度较大时使用。无论是递归还是非递归解法,关键点在于:每次将当前节点的左右子树交换,然后继续对其子节点进行相同操作。两种方法都能高效地解决二叉树的翻转问题。
2024-09-06 16:28:32
2728
原创 二叉树的最大深度(递归非递归解决)
给定一个二叉树root,返回其最大深度。二叉树的是指从根节点到最远叶子节点的最长路径上的节点数。3对于二叉树的深度遍历来说也有递归和非递归方法,递归方法和遍历的时候的方法类似,都很简单,但是一开始都不太好想到,但是一看就会醍醐灌顶。
2024-09-05 15:23:39
2821
原创 二叉树的中序遍历(递归非递归方法)
递归的代码看着还是很简单其实重点就是def里面的三行理解,因为是从左开始打印,所以此时首先递归先遍历的就是左节点,也就是如图的dfs(res,root.left);左节点完之后就是此时的中,此时的中也就是此时的根节点,所以直接加入数组即可。对于二叉树的中序遍历就是左中右,这么记住就行,前序后序就是把重放在前面和后面的区别,我们先把递归的方法看一下然后慢慢讲解。接下来就是我们需要重点讲解的非递归方法,我们这里用的是栈来存储相关结点。给定一个二叉树的根节点。以下面的二叉树举例子。
2024-09-04 19:42:02
2605
原创 Git 提交代码注释信息规范
在团队协作开发过程中,规范的 Git 提交信息不仅能提高代码维护的效率,还能让其他开发者更容易理解每次提交的目的和内容。下面是常用的 Git 提交信息类型及其详细说明。此外,还包括一些额外的提交类型,以便更全面地覆盖开发过程中可能遇到的场景。
2024-09-02 14:53:48
2778
原创 缓存三剑客(穿透,雪崩,击穿)理解
缓存穿透正如其名穿透,说明访问的数据在缓存和数据库里都没用,而且此时还大量的发起了访问,导致数据库崩溃一、第一种解决方法就是保存空值在数据库里面,但是这种情况会很消耗空间二、第二种办法就是使用布隆过滤器,当有数据来访问的时候,布隆过滤器检查一下如果缓存里没有,直接返回回去,此时布隆过滤器也有一定的弊处,假如我此时访问的数据是刚刚好过了我redis的过期时间,但是此时mysql里面还有数据,那不就可惜了吗?所以有一种方式叫缓存预热(缓存预热就是相当于我设置的数据过期时间是个假时间,什么意思呢?就是相当于我过期
2024-08-23 17:26:14
2575
原创 MapStruct和BeanUtils
如果你需要高性能、类型安全的转换,并且可能涉及复杂的映射逻辑,MapStruct是更好的选择。如果只是进行简单的属性复制,或者需要在临时的脚本或小工具中使用,BeanUtils会更方便。
2024-08-14 15:07:35
2478
原创 B端C端的理解总结
B端(B2B):企业对企业的商业模式,目标客户是其他企业。例子:阿里巴巴批发平台、Salesforce。C端(B2C):企业对消费者的商业模式,目标客户是个人消费者。例子:淘宝、亚马逊。
2024-07-30 16:08:46
2457
空空如也
网关配置都没问题访问一直404
2024-03-13
求10到100因子数最多的数输出最多因子数
2022-11-18
求1到m的素数隔行输出
2022-11-17
求矩阵对角线上的元素和
2022-11-13
输入几组数据将其排序处理输出
2022-11-10
将最小数和第一个数字互换最大数和最后一个互换
2022-11-10
为什么最后执行的switch case 输出default的值?
2022-11-03
输出绝对值最大的数字
2022-11-02
求两整数相除结果为啥最后输出为0?
2022-10-31
为什么输出值少一个为0?
2022-10-30
为什么最后结果是一堆乱码
2022-10-29
为什么最后最大值为0?
2022-10-25
为什么第三个printf输出为4 -2?
2022-10-25
为什么i++和++i互换后结果变了
2022-10-20
为什么输出最大最小值,之能输出最大值
2022-10-20
为什么最后输出的结果一直不对?
2022-10-20
为什么输出结果一直为零?
2022-10-17
这个用户类型怎么表示
2022-10-16
if循环为什么发生错误
2022-10-16
3n+1问题可运行但是得不出结果
2022-10-11
为什么图二无法运行?
2022-10-09
这两行代码有必要吗?没有也可以运行
2022-10-08
代码没问题为啥结果为0啊?
2022-10-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人