- 博客(881)
- 收藏
- 关注
原创 SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
一个标准的返回格式至少包含3部分:status 状态值:由后端统一定义各种返回结果的状态码message 描述:本次接口调用的结果描述data 数据:本次返回的数据。"message":"操作成功",当然也可以按需加入其他扩展值,比如我们就在返回对象中添加了接口调用时间timestamp: 接口调用时间@Data/** 结果状态 ,具体状态码参见ResultData.java*//**操作成功**/RC100(100,"操作成功"),/**操作失败**/
2026-03-16 21:50:58
90
原创 给你一个亿的keys,Redis如何统计?
Set集合的交差并的计算复杂度很高,如果数据量很大的情况下,可能会造成Redis的阻塞。那么如何规避阻塞呢?建议如下:在Redis集群中选一个从库专门负责聚合统计,这样就不会阻塞主库和其他的从库了将数据交给客户端,由客户端进行聚合统计。Set和Sorted Set支持交集、并集的聚合运算,但是Sorted Set不支差集运算。Bitmap也能对多个Bitmap做与、异或、或的聚合运算。List和SortedSet。
2026-03-16 21:50:19
111
原创 大厂怎么解决MySQL死锁问题?差点被坑到享年
死锁是并发系统中常见的问题,同样也会出现在数据库MySQL的并发读写请求场景中。当两个及以上的事务,双方都在等待对方释放已经持有的锁或因为加锁顺序不一致造成循环等待锁资源,就会出现“死锁”。常见的报错信息为 。举例来说 A 事务持有 X1 锁 ,申请 X2 锁,B事务持有 X2 锁,申请 X1 锁。A 和 B 事务持有锁并且申请对方持有的锁进入循环等待,就造成了死锁。如上图,是右侧的四辆汽车资源请求产生了回路现象,即死循环,导致了死锁。从死锁的定义来看,MySQL 出现死锁的几个要素为:两个或者两个以上事务
2026-03-16 21:49:37
119
原创 Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)
这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小。说起这个我是比较有感触的,之前的经历,到现在想起来心里还难受,我也是把数据库账号明文密码误提交到GitHub,然后被哪个大宝贝给我测试库删了,后边我长记性了把配置文件内容都加密了,数据安全问题真的不容小觑,不管工作汇还是生活,敏感数据一定要做脱敏处理。如果对脱敏概念不熟悉,可以看一下我之前写过的一篇。
2026-03-16 21:49:02
247
原创 一口气说出 Redis 16 个使用场景,好家伙!
Redis 用的好,加薪少不了,面试被问redis是个大概率事件,与其等着面试官问你在哪场景用过,不如给他雷霆一击,有理有据一口气说出16 个常见使用场景,干翻他!1、缓存String类型例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。
2026-03-16 21:48:27
290
原创 高并发下玩秒杀,你必须知道的9个细节
高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功。这类活动商家绝大部分是不赚钱的,说白了是找个噱头宣传自己。虽说秒杀只是一个促销活动,但对技术要求不低。下面给大家总结一下设计秒杀系统需要注意的9个细节。
2026-03-16 21:47:54
229
原创 JVM太难了!快来学习!
jvm将虚拟机分为5大区域,程序计数器、虚拟机栈、本地方法栈、java堆、方法区;程序计数器:线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址;虚拟机栈:线程私有的,每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数、动态链接和方法返回等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError;
2026-03-16 21:47:11
306
原创 9 张图总结一下 MySQL 架构
目前大部分的后端开发人员对MySQL的理解可能停留在一个黑盒子阶段。对MySQL基本使用没什么问题,比如建库、建表、建索引,执行各种增删改查。所有很多后端开发人员眼中的MySQL如下图所示导致在实际工作中碰到MySQL中死锁异常、SQL性能太差、异常报错等问题时,直接百度搜索。然后跟着博客捣鼓就解决了,可能自己都没搞明白里面的原理。为了解决这种的问题,阿星的会带着大家去探索MySQL底层原理的方方面面。这样大家碰到MySQL的一些异常或者问题时,能够直戳本质,快速地定位解决。
2026-03-16 21:46:16
283
原创 55 张图吃透 Nacos,微服务的灵魂摆渡者强大在哪
Nacos的服务注册发现很简单,比Eureka简单多了,无需自己构建个注册中心。Nacos实现配置管理和动态配置刷新很简单,总结如下步骤:添加对应依赖使用原生注解@Value()导入配置使用原生注解刷新配置根据自己业务场景做好多环境配置隔离(Namespace)、不同业务配置隔离(Group)切记:命名空间和分组的配置一定要放在或者配置文件中Nacos集群搭建非常简单,唯一的配置就是中设置三个Nacos服务,这也正是Nacos的设计理念,让开发者能够尽快上手,专注业务的开发。
2026-03-16 21:45:20
346
原创 啪!啪!@Transactional 注解的12种失效场景,这坑我踩个遍
在使用@Transactional注解声明事务时,有时我们想自定义回滚的异常,spring也是支持的。可以通过设置参数,来完成这个功能。@Slf4j@Service如果在执行上面这段代码,保存和更新数据时,程序报错了,抛了SqlException、DuplicateKeyException等异常。而BusinessException是我们自定义的异常,报错的异常不属于BusinessException,所以事务也不会回滚。
2026-03-15 21:22:26
113
原创 OpenFeign 夺命连环 9问,又挂这上了
前面介绍了Spring Cloud 中的灵魂摆渡者Nacos,和它的前辈们相比不仅仅功能强大,而且部署非常简单。OpenFeign,同样是一款超越先辈(RibbonFeign)的狠角色。传参的方式有很多,比如文件传参.....陈某这里只是列举了四种常见得传参方式。上述步骤仅仅演示一种替换方案,剩下的一种不再演示了,原理相同。本篇文章主要面对初学者,深入的源码以及熔断降级放在后面详细介绍,文中若有表述不清,错误的地方欢迎指正!
2026-03-15 21:21:46
133
原创 狗东面试,起手就问 MVCC 原理
事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。假如A转账给B 100 元,先从A的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。为什么要有事务呢?就是为了保证数据的最终一致性。MVCC,即Multi-Version Concurrency Control (多版本并发控制)。
2026-03-15 21:20:54
120
原创 缓存和数据库一致性问题,看这篇就够了
好了,总结一下这篇文章的重点。1、想要提高应用的性能,可以引入「缓存」来解决2、引入缓存后,需要考虑缓存和数据库一致性问题,可选的方案有:「更新数据库 + 更新缓存」、「更新数据库 + 删除缓存」3、更新数据库 + 更新缓存方案,在「并发」场景下无法保证缓存和数据一致性,且存在「缓存资源浪费」和「机器性能浪费」的情况发生。
2026-03-15 21:20:11
308
原创 面试官问:订单30分钟未支付,自动取消,该怎么实现?
今天给大家继续上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己试一把了哈!在开发中,往往会遇到一些关于延时任务的需求。例如生成订单30分钟未支付,则自动取消生成订单60秒后,给用户发短信对上述的任务,我们给一个专业的名字来形容,那就是。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下 3 点区别:定时任务有明确的触发时间,延时任务没有定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期。
2026-03-15 21:19:35
287
原创 Java 后端实现 token自动续期,这方案有点优雅!
在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个token。前端(如vue)在接收到 token后会将token存储到LocalStorage中。后续每次请求都会将此token放在请求头中传递到后端服务,后端服务会有一个过滤器对token进行拦截校验,校验token的合法性以及token是否过期,如果token过期则会让前端跳转到登录页面重新登录。因为token中一般会包含用户的基础信息,为了保证token的安全性,一般会将token的过期时间设置的比较短。
2026-03-15 21:18:52
142
原创 11 张图总结下,微服务增量拉取
上一篇我们讲解了客户端首次获取注册表时,需要从注册中心全量拉取注册表到本地存着。那后续如果有客户端注册、下线的话,注册表肯定就发生变化了,这个时候客户端就得更新本地注册表了,怎么更新呢?下面我会带着大家一起来看下客户端第二次(这里代表全量获取后的下一次)获取注册表的方式。题外话:之前写过一篇 Redis 主从同步的架构原理,里面也涉及到首次同步和第二次同步,其实原理也类似,但是 Redis 的主从同步原理要复杂些。
2026-03-15 21:18:22
331
原创 线程池里的代码明明报错了,为什么控制台一行异常日志都不打?
线程池吞异常是一个非常不易发现的坑,一般都只有在线上才容易看到,细节决定绩效,记住就行了!!!
2026-03-15 21:14:03
216
原创 十万个why:Nacos 服务注册为什么默认是临时实例?
为什么默认是临时实例?因为在现在的微服务架构里,活着比记住更重要。是流动的资源,用临时实例(AP 模式)。挂了就清理,保持服务列表的有效性,别让客户端调用到死节点。是固定的资源,用持久实例(CP 模式)。挂了保留记录,方便运维排查。大家在 K8s 环境下用 Nacos,建议就保持默认配置,不要手动去开持久化模式,否则你的控制台里可能会留下一堆清理不掉的无效数据。!!
2026-03-15 21:13:29
323
原创 Java面试突击指南+面试题库+模拟面试!
Spring AOP 通过动态代理实现,有两种方式:JDK 动态代理(针对实现接口的类,通过反射生成代理类)和 CGLIB 动态代理(针对没有实现接口的类,通过继承生成子类作为代理)。:您好,我有 3 年 Java 开发经验,一直从事电商系统开发,参与过订单中心、秒杀系统的设计与实现,熟悉 Spring 全家桶、JVM 调优、Redis 缓存和分布式架构,希望能在贵司继续深耕 Java 技术。:根据我的经验和市场行情,期望薪资在 35K-40K 之间,当然也可以结合贵司的薪资体系来谈。
2026-03-12 21:59:28
321
原创 腾讯二面:Redis 事务支持 ACID 么?
鬼吹灯之《云南虫谷》中的摸金校尉有句话叫「合则生,分则死」,为了寻找雮尘珠他们三人分工明确、齐心协力共进退方可成功。事务(Transaction)是并发控制单位,一个操作序列组合而成,这些操作要么都执行,要么都不执行。「是一个不可分割的工作单位」。事务在执行时,会提供专门的属性保证:原子性(Atomicity):一个事务的多个操作必须完成,或者都不完成(ps:MySQL 的原子性靠什么实现呢?欢迎留言区评论);
2026-03-12 14:21:38
127
原创 灰度发布、蓝绿发布、滚动发布,有什么区别?这下明白了
在项目迭代的过程中,不可避免需要”上线“。上线对应着部署,或者重新部署;部署对应着修改;修改则意味着风险。目前有很多部署发布的技术, 这儿将常见的做一个总结。上面所说难免有些抽象, 举一个情景例子, 加入你是微博项目负责人员, 现在新版本较原来的老版本有很大的改变, 这设计到服务架构、前端UI等等, 经过测试功能没有障碍, 那么这时候如何让用户切换到新的版本呢?显而易见, 第一次发布的应用是没有所谓的这个问题的, 这种如何发布的思考只会出现在后面的版本迭代中。
2026-03-12 14:18:12
86
原创 我有 10 种方法搞定定时任务,10种!
不知道你有没有遇到过这种场景:有时需要临时统计线上的数据,然后导出到excel表格中。这种需求有时较为复杂,光靠写sql语句是无法满足需求的,这就需要写java代码了。然后将该程序打成一个jar包,在线上环境执行,最后将生成的excel文件下载到本地。为了减小对线上环境的影响,我们一般会选择在凌晨1-2点,趁用户量少的时候,执行统计程序。(其实凌晨4点左右,用户才是最少的)由于时间太晚了,我们完全没必要守在那里等执行结果,一个定时任务就能可以搞定。那么,这种情况用哪种定时任务更合适呢?linux。
2026-03-12 14:12:29
160
原创 Redis 分布式锁的正确实现原理演化历程与 Redisson 实战总结
红锁是不是这个?泡面吃多了你,Redlock红锁是为了解决主从架构中当出现主从切换导致多个客户端持有同一个锁而提出的一种算法。大家可以看官方文档(https://redis.io/topics/distlock),以下来自官方文档的翻译。想用使用 Redlock,官方建议在不同机器上部署 5 个 Redis 主节点,节点都是完全独立,也不使用主从复制,使用多个节点是为容错。一个客户端要获取锁有 5 个步骤客户端获取当前时间T1(毫秒级别);使用相同的key和value顺序尝试从N个Redis。
2026-03-12 14:11:23
124
原创 25 张图吃透「偏向锁」,这个 JVM又爱又恨的崽
偏向锁可能就这样的走完了它的一生,有些同学可能直接发问,都被 deprecated 了,JDK都 17 了,还讲这么多干什么?java 任它发,我用 Java8,这是很多主流的状态,至少你用的版本没有被 deprecated面试还是会被经常问到万一哪天有更好的设计方案,“偏向锁”又以新的形式回来了呢,了解变化才能更好理解背后设计奥卡姆剃刀原理,我们现实中的优化也一样,如果没有必要不要增加实体,如果增加的内容带来很大的成本,不如大胆的废除掉,接受一点落差。
2026-03-12 14:10:47
186
原创 实战干货!Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权!
今天这篇文章介绍一下Spring Cloud Gateway整合OAuth2.0实现认证授权,涉及到的知识点有点多,有不清楚的可以看下陈某的往期文章。文章目录如下:微服务认证方案目前有很多种,每个企业也是大不相同,但是总体分为两类,如下:网关只负责转发请求,认证鉴权交给每个微服务控制统一在网关层面认证鉴权,微服务只负责业务你们公司目前用的哪种方案?先来说说第一种方案,有着很大的弊端,如下:代码耦合严重,每个微服务都要维护一套认证鉴权无法做到统一认证鉴权,开发难度太大第二种方案明显是比较简单的一种,优点如下:
2026-03-12 14:09:47
285
原创 不会一致性hash算法,劝你简历别写搞过负载均衡
简单的阐述了下一致性hash,如果有不对的地方大家可以留言指正,任何技术都不会十全十美,一致性Hash算法也是有一些潜在隐患的,如果Hash环上的节点数量非常庞大或者更新频繁时,检索性能会比较低下,而且整个分布式缓存需要一个路由服务来做负载均衡,一旦路由服务挂了,整个缓存也就不可用了,还要考虑做高可用。不过话说回来,只要是能解决问题的都是好技术,有点副作用还是可以忍受的。
2026-03-12 14:06:07
179
原创 什么是 MySQL 的“回表”?
小伙伴们在面试的时候,有一个特别常见的问题,那就是数据库的回表。什么是回表?为什么需要回表?今天小富就来和大家聊一聊这个话题。
2026-03-12 13:59:08
182
原创 没想到吧!8 个 Class 手写了一个配置中心!
到这里全部的代码介绍完了,最后做一个简要的总结吧,虽然通过这几个类能够实现一个简易版的配置中心功能,但是还有不少的缺陷,例如:没有处理注解只处理了yml文件,没有处理properties文件目前处理的bean都是基于singleton模式,如果作用域为prototype,也会存在问题反射性能低,如果某个属性涉及的类很多会影响性能目前只能代码嵌入到项目中使用,还不支持独立部署及远程注册功能……总的来说,后续需要完善的点还有不少,真是感觉任重道远。最后再聊聊项目的名称,为什么取名叫。
2026-03-11 15:19:52
87
原创 《面试八股文》之 MySql 35卷,年后靠它了
相信大家小时候学习汉字的时候都会查字典,想想你查字典的步骤,我们是通过汉字的首字母 a~z 一个一个在字典目录中查找,最终找到该字的页数。想想,如果没有目录会怎么样,最差的结果是你有可能翻到字典的最后一页才找到你想要找的字。索引就「相当于我们字典中的目录」,可以极大的提高我们在数据库的查询效率。回表就是先通过数据库索引扫描出该索引树中数据所在的行,取到主键 id,再通过主键 id 取出主键索引数中的数据,即基于非主键索引的查询需要多扫描一棵索引树.
2026-03-11 15:18:51
69
原创 20 个高频实用 Java 8 Stream 案例,玩转集合的筛选、归约、分组、聚合。。。
System.out.println("一次改动后:" + personListNew.get(0).getName() + "-->" + personListNew.get(0).getSalary());System.out.println("二次改动前:" + personList.get(0).getName() + "-->" + personListNew.get(0).getSalary());从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合。
2026-03-11 15:17:02
66
原创 狗东面试复盘,索引失效的 10 种场景
不知道你在实际工作中,有没有遇到过下面的这两种情况:明明在某个字段上加了索引,但实际上并没有生效。索引有时候生效了,有时候没有生效。今天就跟大家一起聊聊,mysql数据库索引失效的10种场景,给曾经踩过坑,或者即将要踩坑的朋友们一个参考。
2026-03-11 15:13:43
313
原创 设计 API 的 22 条最佳实践,实用!
任何API设计都遵循一种叫做“面向资源设计”的原则:资源:资源是数据的一部分,例如:用户集合:一组资源称为集合,例如:用户列表URL:标识资源或集合的位置,例如:/user。
2026-03-11 15:10:02
192
原创 6 个 Java 工具,轻松分析定位 JVM 问题!
你可能一开始会比较畏惧使用复杂的工具去排查问题,又或者是打开了工具感觉无从下手,但是随着实践越来越多,对 Java 程序和各种框架的运作越来越熟悉,你会发现使用这些工具越来越顺手。这篇文章中介绍下如何使用 JDK 自带工具来分析和定位 Java 程序的问题。
2026-03-11 15:06:53
225
原创 京东一面:MySQL 主备延迟有哪些坑?
高可用性(high availability,缩写 HA),指系统无中断地执行其功能的能力,代表系统的可用性程度。高可用性通常通过提高系统的容错能力来实现。MySQL 的高可用是如何实现的呢?首先,我们来看张图过程:开始时,处理流程主要是场景一客户端读、写,访问的是主库主库通过某种机制,将数据实时同步给备库当主库突然发生故障(如:磁盘损坏等),无法正常响应客户端的请求。此时会自动主备切换,进入场景二客户端读写,访问的是备库(此时备库升级为新主库)看似天衣无缝,那是不是可以高枕无忧了呢???
2026-03-11 15:05:47
170
原创 10个经典案例,聊聊如何优化慢 SQL
在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL 语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的 SQL 就是整个系统性能的瓶颈。MySQL5.6 之后新增的 ICP,using index condtion 就是使用了 ICP(索引下推),在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据减少回表的数据。mobile 是字符类型,使用了数字,应该使用字符串匹配,否则 MySQL 会用到隐式替换,导致索引失效。
2026-03-11 14:57:18
376
原创 7天Java面试突击,拿高薪offer的奇妙操作!附Java面经及逐字稿!
每天任务闭环,当天学完当天练,学完直接能上场,彻底告别 “背了不会说、说了不加分、被问就卡壳” 的痛点。
2026-03-10 15:13:56
794
原创 16 图总结 Nacos 一个服务注册请求会经历什么?
上篇我们讲解了如何使用 Nacos 作为注册中心和配置中心。这次我们来聊下 Nacos 的注册服务的底层原理。Nacos 作为注册中心,用来接收客户端(服务实例)发起的注册请求,并将注册信息存放到注册中心进行管理。那么一条注册请求到底会经历哪些步骤呢?本文通过发起一条注册请求,讲解了 Nacos 客户端如何随机选择节点、Nacos Server 如何将请求进行路由转发、Nacos Server 如何存储注册实例。
2026-03-10 14:23:36
143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅