- 博客(863)
- 资源 (12)
- 收藏
- 关注
原创 ############---------写博客的意义---------############
简介 每个人对于博客的用户可能不一样,我这个博客呢主要记录一些我在工作中遇到的一些技术问题,或者是网上查找的一些资料整理。有原创文章,也有转载的,都是记录自己觉得有意义的东西。起因 2014年的一天,开始进行部分EveryNote资料迁移 2011年毕业工作我就在记录自己接触到的知识了,之前我都是将自己的资料和整理的信息记录到EveryNote上,但是...
2014-02-24 10:01:34
2338
1
原创 复合索引 (item1, item2, item3 ) > (?, ?, ?) 不起作用,EXPLAIN 后type=ALL(全表扫描)
复合索引多列同时违反最左前缀原则,优化器无法解析,导致全表扫描。最优方案:改写查询为「等值 + 范围」的嵌套逻辑,充分利用现有复合索引,无需额外修改表结构。备选方案:虚拟列 + 单列索引,适配无法改写查询的场景,需注意存储和排序规则一致性。验证关键:用EXPLAIN查看type和key列,确认索引生效。
2026-01-12 19:53:42
609
原创 Trae、Cursor、Copilot、Windsurf对比
随着AI技术的爆发式发展,AI编程工具正在重塑软件开发流程。作为先驱者长期占据市场主导地位,但新一代工具如CursorWindsurf和Trae正以颠覆性创新发起挑战。本文基于多维度实测数据,深度解析三款工具的核心竞争力,揭示AI编程工具的格局演变趋势。
2026-01-04 21:36:49
1752
2
转载 搞懂大模型 - RAG(检索、增强、生成)
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索技术与语言生成模型的人工智能技术。该技术通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型(LLMs),以增强模型处理知识密集型任务的能力,如问答、文本摘要、内容生成等。RAG模型由Facebook AI Research(FAIR)团队于2020年首次提出,并迅速成为大模型应用中的热门方案。 RAG(Retrieval-Augmented Generatio
2026-01-04 21:17:00
69
原创 多级缓存对比(Caffeine + Redis),以及缓存不一致问题的解决
而 Spring Cache 的强大之处,还体现在它对多种缓存实现的支持,其中 Caffeine 和 Redis 无疑是备受瞩目的两种方案。真实的业务工程中,建议使用Caffeine作为本地缓存,另外使用redis或者memcache作为分布式缓存,构造多级缓存体系,保证性能和可靠性。可以使用MQ的广播模式,当数据修改时向MQ发送消息,节点监听并消费消息,删除本地缓存,达到最终一致性;两级缓存与数据库的数据要保持一致,一旦数据发生了修改,在修改数据库的同时,本地缓存、远程缓存应该同步更新。
2026-01-04 20:27:00
753
原创 Java: HashMap 和 ConcurrentHashMap的区别
分段锁(Segmented Locking)是一种用于提高多线程程序性能的锁机制,通过将锁细分来减少竞争,从而在高并发环境中提高性能。分段锁在Java的中有广泛应用。安全性:ConcurrentHashMap 在多线程环境下是安全的,而HashMap 不是。使用场景:如果是单线程环境,使用HashMap 更优;如果是多线程环境,且需要高性能的线程安全Map,则应选择ConcurrentHashMap。。
2025-12-03 21:03:32
754
原创 RocketMQ、Kafka 和 RabbitMQ 等中间件对比
RocketMQ 的 NameServer 高可用单节点 NameServer 存在单点风险,生产环境需部署 3 + 节点,Producer/Consumer 配置多个 NameServer 地址(用分号分隔)Kafka 的分区数量陷阱分区数并非越多越好,每个分区都会占用内存和文件句柄,建议单个 Broker 的分区总数不超过 2000RabbitMQ 的内存控制默认配置下,内存使用达到 40% 会阻塞生产者,需通过vm_memory_high_watermark参数调整阈值RocketMQ 凭借。
2025-12-03 20:47:39
1275
原创 延迟双删介绍
具体来说,在某些场景下,我们需要先更新或删除数据库中的数据,然后再更新或删除缓存中的数据,以保证数据的一致性。但在某些情况下,由于网络延迟、服务器故障或其他原因,可能导致缓存中的数据更新或删除失败,从而导致数据库和缓存中的数据不一致。这种策略通常用于解决数据在缓存和数据库中不一致的问题。值得注意的是,不管哪种方案,都避免不了Redis存在脏数据的问题,只能减轻这个问题,要想彻底解决,得要用到同步锁和对应的业务逻辑层面解决。如果缓存和数据库负载很高,主从同步很慢,很有可能不能在延时的时间内实现同步。
2025-10-28 21:13:20
439
原创 防止重复提交订单
在电商平台中,用户提交订单是一个非常敏感的动作。库存扣减优惠券核销支付下单消息发送点两次“提交订单”按钮网络卡顿时刷新页面使用浏览器回退再次提交重复提交订单,造成资源浪费,甚至业务损失!请求唯一性接口幂等性服务端锁机制。
2025-10-28 21:06:45
747
原创 注册中心 eureka、nacos、consul、zookeeper、redis对比
服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。
2025-10-28 20:56:58
776
原创 分库分表详解,以及ShardingJDBC介绍
传统应用项目设计通常都是采用单一数据库作为存储方案,但是随着互联网的迅猛发展以及应用数据量的增长,数据库会随着数据量的增长而渐渐成为整个应用框架的性能瓶颈。首先是由于关系学数据库大多是采用B+Tree类型的索引,当数据量超过一定的阈值之后,会导致索引的深度增长,而索引的深度又直接影响了磁盘IO操作的次数,直接影响了数据库查询性能的优劣。
2025-10-28 20:46:43
770
转载 分库分表实践
原大众点评的订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到瓶颈,应用只能通过限速、异步队列等对其进行保护;业务需求层出不穷,原有的订单模型很难满足业务需求,但是基于原订单表的DDL又非常吃力,无法达到业务要求。随着这些问题越来越突出,订单数据库的切分就愈发急迫了。这次切分,我们的目标是未来十年内不需要担心订单容量的问题。先对订单库进行垂直切分,将原有的订单库分为基础订单库、订单流程库等,本文就不展开讲了。
2025-10-28 20:28:33
49
转载 Springboot6种解决循环依赖方案
本文梳理了解决循环依赖的几种方法。大体分三类:配置解决,延后注入使用和解耦调用关系。如果出现了循环依赖,大体是设计有点问题,是软件开发中的坏味道,如果暂时无法从架构层面解决,那可以根据场景选择适合的方案。
2025-10-20 21:06:54
180
转载 主流的大数据技术栈
↓(业务转换,数据合并,数据清洗(统一枚举值,填充null值,清晰非法值等)保证数据质量)数据集市DM 【维度建模】(基于多张宽表形成某主题的报表数据) → BI/APP/API。存储层(HDFS / HBase / Iceberg / Hive)查询层(StarRocks / Doris / Presto)分析层(Superset / Tableau / 自研看板)采集层(Kafka / Flume / DataX)计算层(Flink / Spark / Trino)↓(格式/接口定制)
2025-10-20 20:57:49
446
转载 常见的索引原则
索引字段顺序 = 查询条件顺序,从过滤强到弱;性别 / 状态这种字段别建索引,浪费空间;别对索引字段做函数 / 运算,like 别用 % 开头;查什么就索引什么,省掉回表时间;索引不是越多越好,定期清理没用的;自增 ID 最省心,UUID 慎用作主键。其实索引原则就像 “交通规则”—— 不懂规则乱建索引,就像开车闯红灯,早晚出事故;懂规则并灵活运用,才能让数据库 “跑” 得又快又稳。最后送大家一个习惯:写复杂查询前先用explain看看执行计划,重点看typerefrange是好的,ALL。
2025-09-11 21:28:04
174
原创 双token
顾名思义,本机制下所使用的令牌分为长短两种:长令牌即过期时间较长的,专门用于token的续签,同时刷新两种token;短令牌即过期时间较短的access_token,进行常规业务请求时使用。登陆用户登录成功后,同时获得长短两种令牌,之后长令牌存在客户端暂不使用,仅使用短令牌用于常规业务请求。服务端在接收到每个携带短令牌的业务请求时,按照JWT的规则进行用户的身份验证,并从payload中获取用户身份信息,此即“三验证”中的第一种验证。
2025-09-10 21:28:24
718
原创 分布式存储:RustFS与MinIO全面对比
当全球开发者因MinIO社区版突然移除Web管理界面而措手不及,当AGPL许可证的“传染性”风险让企业用户如履薄冰,一个来自中国的开源力量正以颠覆性姿态破局——RustFS。这款基于Rust语言的高性能分布式存储系统,仅用一年时间便在GitHub狂揽1.5k星,成为炙手可热的MinIO替代方案。本文将深度解析其技术架构、性能表现与落地实践,揭示它如何重构存储范式。RustFS与MinIO代表了分布式对象存储的两种技术路线:前者以Rust语言为基石,聚焦高性能、轻量级和国产化;后者以成熟生态和企业级功能见长。
2025-09-10 20:48:20
1457
原创 Valkey vs Redis详解
Redis 作为最受欢迎的内存型 NoSQL 键值存储系统之一,一直都很受广大用户的推崇。然而,由于Redis 调整了许可政策,这一举措在开源社区引起了广泛争议。2024 年 3 月 20 日,Redis Labs 宣布从 Redis 7.4 开始,将源码使用协议修改为RSAv2和SSPLv1协议。该变化意味着 Redis 在 OSI(开放源代码促进会)定义下不再是严格的开源产品。包括亚马逊云科技在内的40多家公司持续投入在Valkey项目上。
2025-09-02 21:26:57
1702
原创 Spring Boot 与 Spring AI 深度实战(基于DeepSeek)
文章指出,随着业务复杂度提升,传统单体架构在扩展性和维护性上的不足日益凸显。作者通过实践案例,分享了如何从单体架构平滑迁移至微服务架构的经验,重点介绍了服务拆分、数据一致性保障和渐进式迁移策略等关键环节。迁移过程中需注意服务治理、监控体系建设和团队协作方式的调整,最终实现系统的高可用和快速迭代能力。该案例为企业级架构演进提供了可参考的实施路径。
2025-09-02 21:15:45
202
原创 Github Copilot 快捷键,以及快捷键修改
虽然github copilot足够智能,绝大部分时候都能补全想输入的内容(尤其注释或者文档,有奇效),但依然有很多时候是会选择IDEA自带的补全。,在IDEA的设置中修改keymap,删除原有的TAB快捷键,我是选择增加了```这个按键作为github copilot的补全键。但每次习惯性按下TAB键的时候,IDEA默认都会自动采用github copilot的补全代码。开始支持IDEA后,就开始使用,但这个插件和IDEA默认的自动补全快捷键都是用的TAB键。接受内联建议:使用 Tab 键。
2025-09-02 21:14:38
918
原创 MySQL 回表详解
在MySQL数据库中,回表(Look Up)指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行。换句话说,回表是指根据索引查询到的主键值再去访问主键索引,从而获取完整的数据记录。在实际应用中,我们可以根据具体的场景来决定是否使用回表操作。需要返回更全面的数据:有些查询场景下,返回的字段可能不仅仅是索引所包含的列,此时回表可以提供更全面的数据信息。使用非聚簇索引:当表中没有定义主键或者查询条件没有使用主键时,非聚簇索引成为主要的索引选择,但回表操作则难以避免。
2025-09-02 21:11:54
772
转载 Netty 底层零拷贝
Netty 的零拷贝技术是通过优化数据传输过程中的数据复制操作,以降低系统的开销和提高性能。通过以上方式,Netty 实现了数据传输过程中的零拷贝,大大提高了系统的性能和吞吐量,特别是在高并发、大数据量的网络应用场景下,可以显著地降低系统的资源消耗和延迟。
2025-08-28 21:43:58
108
原创 Spring Boot对访问密钥加解密——HMAC-SHA256
HMAC-SHA256 是一种基于 哈希函数 的消息认证码(Message Authentication Code, MAC),它结合了哈希算法(如 SHA-256)和一个密钥,用于验证消息的完整性和真实性。HMAC 是 “Hash-based Message Authentication Code” 的缩写,它广泛应用于网络通信中,用于保证消息在传输过程中未被篡改,同时也可以校验消息是否来自可信方。
2025-08-28 21:39:13
1702
原创 主流配置中心对比
在单体应用中,配置管理可能不是什么大的事情,通常会以配置文件的方式。常见的方法比如将配置通过打包脚本打入应用包中,或者直接放到运行应用的服务器的特定目录下,或者存储到数据库中。配置变化频繁时,需要频繁的打包部署应用。不同环境的配置需要分开管理(比如测试环境与生产环境)。而在分布式微服务架构中,服务数量剧增,如果还是手动去实现配置信息的修改或数据的迁移等,效率是很低的,而且手动操作配置也极有可能出现错误的情况。
2025-08-27 21:51:28
1076
转载 Sprintboot 添加banner
在日常开发中,我们经常会看到各种各样的启动画面。例如以下几种①spring项目启动画面②启动画面③若依项目启动画面还有很多各式各样好看的启动画面,那么怎么定制这些启动画面呢?
2025-08-13 14:06:56
181
原创 restTemplate禁用url编码
在将queryUrl传入RestTemplate之前,将其封装为一个URL对象,避免了queryUrl被RestTemplate进行2次UrlDecode。param={"name":"张三","age":22}我们想要的结果并不想restTemplate调用的时候二次编码,而是使用我们的url。param={"name":"张三","age":22}在restTemplate调用方法的时候默认对url做了编码处理。这时使用restTemplate调用接口,会对url再次编码成。接口放接收到路径解码后。
2025-08-07 13:39:19
500
原创 SpringBoot设置跨域的几种方式
来源是URL的结构是这样的,在这个URL的组成部分中,Origin是指协议、主机和端口号的组合,例如:80、443。CORS 的出现是因为来源不同。也就是说,必须遵守 SOP。-> 这意味着该政策只允许相同的来源。过去,出于安全考虑,严格只允许来自同一来源的通信,但最近,从不同来源获取和使用资源变得非常普遍,因此创建了作为 SOP 例外的 CORS 策略。当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域首先编写一个过滤器,可以起名字为MyCorsFilter.java。
2025-08-06 15:12:20
865
原创 Spring Boot 3.5.x 使用 SpringDoc 2 / Swagger3
Springfox 是一套可以帮助 Java 开发者自动生成 API 文档的工具,它是基于 Swagger 2.x 基础上开发的。除了集成 Swagger 2.x,Springfox 还提供了一些额外功能,例如自定义 Swagger 文档、API 版本控制、请求验证等等。但是随着时间的推移,Swagger2.x 终究成为历史,所以我们可以看出 springfox-boot-starter 的坐标从 3.0.0 版本(2020 年 7 月 14 日)开始就一直没有更新;
2025-07-29 16:36:46
2392
1
原创 Springboot集成knife4j
针对以上两种情况,Knife4j基于Servlet体系提供了过滤Filter功能,如果开发者使用Spring Boot开发框架进行开发的话,只需在。配置文件中配置相关属性即可方便的解决上面的问题,不用删除Springfox-swagger的jar包或者删除相关代码等复杂的操作,提升开发体验.功能时,同很多开发者经常讨论的问题就是在生产环境时,屏蔽或者去除Swagger的文档很麻烦。注解来使用增强功能,自2.0.6版本后,只需要在配置文件中配置。在以前的版本中,开发者需要在配置类中手动使用。
2025-07-18 13:55:46
1781
转载 Navicat切换到DBeaver,如何同步连接信息
公司不让用Navicat了怎么办?可以选择DBeaver来替换,怎么才能将Navicat中的DB连接信息导入到DBeaver呢?此时导入的连接不能用,因为密码是经过Navicat加密的,在DBeaver中不能使用,需要重新更新密码。但是该密码为密文,怎么获取到它对应的明文呢?用文本编辑器打开文件connections.ncx,查看密码。最终会得到一个connections.ncx文件。在Navicat中导出DB连接信息。在DBeaver中导入连接。连接成功,正常使用即可。
2025-07-18 08:33:27
897
原创 ngx_slab_alloc() failed: no memory in upstream zone
最近使用upstream的 resolve和zone配置,遇到这个问题,网上查了查,这里记录一下。
2025-06-03 15:10:12
311
原创 【容易坑】mybatis中使用if标签比较两个字符串是否相等
继续往下面想,这个if语句的执行顺序,应该是在执行SQL查询之前,那可以推断的是,Mybatis在执行SQL时,首先是先将所有的标签转化组装为SQL,然后在执行SQL语句。activityType就是在这个if判断语句中,被赋值为2的,即使在Mybatis的初始绑定值为3,那这么说的话,activityType不为null时,它的值会一直为2。这是一个简单的条件判断,并决定排序字段的语句,但是中间却使用了等号作为判断条件,显然这儿是不成立的,大抵已经找到原因了。注意:使用如下方式是错的。
2025-05-21 17:50:42
1974
原创 MyBatis if choose 动态 SQL
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
2025-03-27 17:00:48
1173
原创 nginx之gzip_static详解
Nginx支持静态和动态两种包体gzip压缩方式,分别对应模块ngx_http_gzip_static,ngx_http_gzip。我们知道gzip是CPU密集型的应用,实时动态压缩比较消耗CPU资源。另外,如果使用gzip,则sendfile零拷贝技术无法使用。为进一步提高Nginx的性能,我们可以使用静态gzip压缩,提前将需要压缩的文件压缩好,当客服请求到达时,直接发送压缩好的.gz文件,如此就减轻了服务器CPU的压力,提高了性能。
2025-03-21 14:41:42
684
中文分词算法介绍、分类详解
2010-04-25
linux 定时发送邮件 应用sendmail技术
2010-04-25
Cluence搜索引擎源码
2009-01-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅