- 博客(60)
- 收藏
- 关注
原创 全面升级!阿里巴巴2023年最新版Java面试八股文合集(架构师版)
最近面试的、跳槽的一波又一波很多小伙伴在里面反馈问题,学习群里也异常活跃,一起复盘,还是很有收获的。有面了十多家一二线互联网公司的卷王谈到,发现在Java后端面试中,Redis是所有框架/中间件中被问到频率最高的。大厂面试题1. 如何用Redis高效实现12306的复杂售票业务2. 新浪微博突发事件如何做好Redis缓存的高可用3. 高并发场景缓存穿透&失效&雪崩如何解决4. Redis高并发场景热点缓存如何重建5. Redis集群架构如何抗住12306与双11的洪峰流量。
2025-01-02 14:25:44
486
原创 SpringEvent 解决 WebUploader 大文件上传解耦
关于Spring的Event机制,相信使用Java开发的朋友们一定非常熟悉。Spring Event是Spring框架内建的一种发布/订阅()模式的实现,它允许应用内部不同组件之间通过事件进行通信。当某个特定事件发生时,系统中对这类事件感兴趣的监听器可以接收到通知并执行相应操作。是不是看起来跟消息队列差不多,尤其是这种发布/订阅的模式,确实非常符合消息中间件的模式。通常来说,消息队列一般有以下几种作用。异步、解耦和削峰。
2024-12-27 19:41:56
735
原创 @Import注解应用指南
可见借助@Import注解,可以很方便地实现自定义导入对应的配置类,甚至是新增扫描起点,这对于我们Spring Boot模块化开发是一个有利的工具。也可见该注解功能非常强大,可以通过实现对应接口方法,完成灵活地自定义导入。大家需要理解@Import注解具体作用是什么,以及该注解可以传入哪些类作为参数,以及其大致的工作流程。
2024-12-27 19:41:09
1051
原创 SpringBoot 打造图片阅后即焚功能
引言“阅后即焚”(Snapchat-like feature)是指一种社交媒体或信息传递功能,用户在阅读某条信息或查看某张图片后,该信息或图片会自动销毁,无法再次查看。这种功能的主要目的是保护用户的隐私和信息安全,防止敏感信息被未经授权的人获取。一、背景与需求分析信息安全和隐私保护愈发受到重视。随着社交媒体和即时通讯工具的普及,很多用户希望能够分享临时信息而不留下痕迹。图片阅后即焚功能正是在这样的背景下应运而生。它不仅能满足用户的隐私需求,还能增强信息的安全性。本文将详细介绍如何使用Spring
2024-12-27 19:40:19
1072
原创 IDEA Mybatis插件:极大提升 CRUD 效率
虽然写了很久的CRUD,但是依旧觉得写好CRUD是一件非常难且麻烦的事情,以下的情况在开发过程中应该都遇到过:SQL的编写需要细心,写错了SQL字段或者表名称,修改完要重启(几分钟过去了)SQL编写好后进行测试时,造数据也好麻烦,特别是还存在表关联的情况,数据内容不真实,还容易超出字段长度,让人抓狂SQL好不容易能跑了,又会有以下的疑问符不符合SQL开发规范?是否能命中索引?又可能命中哪个索引?日常环境数据太少,如何模拟SQL在生产环境下运行的真实情况?性能怎么样,最大TPS可以达到多少?
2024-12-27 19:34:14
1084
原创 SpringBoot接口防抖(防重复提交)的一些实现方案
在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。key分隔符是用来将多个参数合并在一起的,比如userName是张三,userPhone是123456,那么完整的key就是"张三&123456",最后再加上redis锁前缀,就组成了一个唯一key。从测试的结果上看,防抖是做到了,但是随着缓存消失、锁失效,还是可以发起同样的请求,所以要真正做到接口幂等性,还需要业务代码的判断、设置数据库表的UK索引等操作。
2024-12-27 15:14:02
625
原创 当 Semaphore 遇到 finally,有大坑
前几天有个读者给我发来一段代码,他说这段代码会照成死锁,但是实在不知道是什么原因。他给的代码很长,幸好同时也给了我一个相应的代码解释:Semaphore 类指定了 3 个许可证,且是指定公平锁方式。然后开了 3 个线程,线程 A,C 只能获取一个许可证,线程 B 可以获取 2 个许可证。但是在运行时,有时只会执行完线程 A,线程 B 和线程 C 都不会输出。感觉是死锁了,想不明白,想探讨一下。歪师傅在本地运行了一下,发现确实如他所说。
2024-12-27 15:11:11
622
原创 如何解决Redis热点key问题
在Redis中,我们把访问频率高的key,称为热点key。如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。
2024-12-27 15:08:14
818
原创 Redis cluster集群原理,客户端是怎样知道该访问哪个分片的。
redis的cluster集群原理,客户端是怎样知道该访问哪个分片的。我们应该怎样更好回答呢?可以分这几个维度为什么需要Redis Cluster?哨兵模式不香吗?客户端是怎样知道该访问哪个分片的?(哈希槽)redis实例上并没有相应的数据,会怎么样?(MOVED重定向和ASK重定向)各个节点之间是怎么通信的呢(Gossip协议)集群内节点出现故障怎么办(故障转移)加餐:Redis Cluster的Hash Slot 为什么是16384?
2024-12-27 15:07:26
841
原创 RocketMQ消费者消费的时候,宕机了,消息会丢失吗?
最近一位星球粉丝去美团面试,问了这么一道题: RocketMQ消费者消费的时候,宕机了,消息会丢失吗?如何保证RocketMQ消息的可靠性.一个消息从生产者产生,到被消费者消费,主要经过这3个过程:因此,本文将从以下这几个维度来回答:生产者如何保证不丢消息存储端如何保证不丢消息消费者如何保证不丢消息最后消费者消费的时候,宕机,消息会不会丢呢?
2024-12-27 15:05:37
801
原创 手把手教你分析MySQL死锁问题
在分析死锁日志前,先做一下锁介绍,哈哈~最后,遇到死锁问题,我们应该怎么分析呢?模拟死锁场景查看死锁日志找出死锁SQLSQL加锁分析,这个可以去官网看哈分析死锁日志(持有什么锁,等待什么锁)熟悉锁模式兼容矩阵,InnoDB存储引擎中锁的兼容性矩阵。
2024-12-27 15:02:32
929
原创 Java 线上问题定位处理的终极利器
Arthas是Alibaba在 2018 年 9 月开源的Java 诊断工具。支持JDK6+, 采用命令行交互模式,提供Tab自动不全,可以方便的定位和诊断线上程序运行问题。截至本篇文章编写时,已经收获Star17000+。Arthas官方文档十分详细,本文也参考了官方文档内容,同时在开源在的Github的项目里的Issues里不仅有问题反馈,更有大量的使用案例,也可以进行学习参考。
2024-12-27 15:01:34
866
原创 分享50个让你代码更好的小建议
反例:」...「正例:」...❝因为如果定义为static,即类静态常量,在每个实例对象中,它只有一份副本。如果是成员变量,每个实例对象中,都各有一份副本。显然,如果这个变量不会变的话,定义为静态常量更好一些。❞。
2024-12-27 14:59:33
885
原创 MongoDB vs MySQL,哪个更快?
本文主要是为了介绍bulkWrite()方法的使用,也就是MongoDB的批量写操作,通过实验可以看出MongoDB使用bulkWrite()方法进行大量数据的写操作比使用常规的方法进行写操作效率要高很多。文章也介绍了mysql几种写操作下批量和非批量的对比,可以看出他们批处理方式比非批处理快点,但没有MongoDB那么明显。对于MongoDB与mysql的比较,批量操作下,MongoDB插入、删除、更新都比mysql快,非批量操作下,MongoDB插入、删除、更新都比mysql慢。
2024-04-08 15:43:06
2251
1
原创 缓存穿透、缓存雪崩、缓存击穿
分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。当然,除了上述方案,我们还可以限流、降级、熔断等服务层的措施,也可以考虑数据库层是否可以进行横向扩展,当缓存异常发生时,确保数据库能够抗住流量,不至于让整个系统崩溃。缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。为什么说不得不考虑?
2024-04-07 16:33:50
325
原创 一个注解实现 WebSocket 集群方案,这样玩才爽
最后请允许我发表一点对于抽象的拙见抽象其实就和 “道生一,一生二,二生三,三生万物” 一样,根据你的顶级接口(也就是核心功能)不断的向外展开,你的顶级接口就是道(狭义的来讲)以这个库为例,ConnectionLoadBalanceConcept就是这个库的道,他的核心功能就是发送消息,至于怎么发,发给谁,不确定,像是一个混沌的状态。
2024-04-07 16:32:03
316
原创 遇到个MySQL索引长度限制的问题
前言前言我只是创建个索引而已,没想到还这些遇到个诡异的问题!😱😱话说你平时创建mysql时遇到过以下创建索引报错的情况吗?报错提示如下//需要添加索引的字段的长度太长,超过了767字节🚩什么?索引长度限制?我从没遇到过啊,MySQL还会对索引键的长度有限制?是的,一般都不会遇到,不过这个问题我一个同事就遇到了!他用,都是相同的,但是一个测试环境和一个线上MySQL版本,一个执行成功一个执行失败!
2024-04-07 16:29:02
372
原创 SpringBoot:一个注解就能帮你下载任意对象
下载功能应该是比较常见的功能了,虽然一个项目里面可能出现的不多,但是基本上每个项目都会有,而且有些下载功能其实还是比较繁杂的,倒不是难,而是麻烦。所以结合之前的下载需求,我写了一个库来简化下载功能的实现传送门:https://github.com/Linyuzai/concept/wiki/Concept-Download如果我说现在只需要一个注解就能帮你下载任意的对象,是不是觉得非常的方便@Download@Download感觉差别不大?那就听听我遇到的一个下载需求。
2024-04-07 16:27:04
479
原创 百度一面问了 3 个 ES 问题,直接干懵了
先自上而下,后自底向上的介绍ElasticSearch的底层工作原理,试图回答以下问题:为什么ElasticSearch占用很多内存?
2024-04-07 16:21:34
389
原创 WebSocket 集群解决方案
WebSocket是一种在网络应用程序中,使客户度端和服务器之间可以进行双向通信的协议。它允许数据可以在建立连接后进行实时交换,而不必依赖传统的HTTP请求-响应模式。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
2024-04-03 15:04:47
844
1
原创 缓存穿透、缓存雪崩、缓存击穿
分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。当然,除了上述方案,我们还可以限流、降级、熔断等服务层的措施,也可以考虑数据库层是否可以进行横向扩展,当缓存异常发生时,确保数据库能够抗住流量,不至于让整个系统崩溃。缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。为什么说不得不考虑?
2024-04-02 19:31:48
264
原创 RocketMQ为什么这么快?我从源码中扒出了10大原因
在传统IO中,如果想将用户缓存区的数据放到内核缓冲区,需要经过CPU拷贝mmap()sendfile()mmap()是将用户缓冲区和内核缓冲区共享,操作用户缓冲区就好像直接操作内核缓冲区,读写数据时不需要CPU拷贝Java中可以使用MappedByteBuffer这个API来达到操作内核缓冲区的效果sendfile()主要是用于文件传输,可以通过sendfile()将一个文件内容传输到另一个文件中或者是网络中。
2024-04-02 19:17:56
509
原创 微服务+多级缓存,性能起飞
另外陈某的知识星球开通了,公众号回复关键词:知识星球 获取限量20元优惠券加入只需179元,一顿饭钱,但是星球回馈的价值却是巨大,目前更新了Spring全家桶实战系列、亿级数据分库分表实战、DDD微服务实战专栏、我要进大厂、Spring,Mybatis等框架源码、架构实战22讲等....每增加一个专栏价格将上涨20元。
2024-04-02 19:14:32
389
原创 微服务Token鉴权设计的几种方案
根据需求积分服务提供了一个给用户添加积分的API,如果你的API是通过获取的当前登录用户ID增加的积分,那么面对场景二时你需要重新编写一个给用户添加积分的API,因为当前登录的是后台管理员而不是用户(代码复用率较低)缺点:A服务调用B服务时,B服务需要写一个内部调用的Controller接口A服务才能通过Fegin调用到B服务,增加了代码量(这里的设计方案是内部调用与外部调用Controller是分开的)各位服务都有自己的鉴权方式,当然也可以通过jar包的方式统一各服务的鉴权方式。
2024-04-02 19:11:05
470
原创 SpingBoot的5个扩展点,超级实用!
目录1、初始化器ApplicationContextInitializer2、监听器ApplicationListener3、Runner6、后记。
2024-04-02 17:26:01
373
原创 MySQL 的 varchar 水真的太深了!
来看极限边界情况,innodb为了记录一下varchar真实存储多少个字节,最多分配2个字节的空间去记录,2个字节16个比特位,全部为1,最大能记录的数字是2^16-1是65535个,innodb最大能记录varchar占用的字节数就是65535个,utf8mb4字符集一个字符是最大是4个字节,65535 / 4 = 16383.75,只要varchar字符数不超过16383个,innodb就可以记录真实占用的长度L,再多就记录不了了!这20字节的空间存储的是分散行的地址和占用的字节数。
2024-04-02 17:25:14
324
原创 面试官:Redis为什么默认16个数据库?
比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。对于db正确的理解应为“命名空间”,多个应用程序不应使用同一个Redis不同库,而应一个应用程序对应一个Redis实例,不同的数据库可用于存储不同环境的数据。Redis是一个字典结构的存储服务器,一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。以MySQL实例为例。
2024-04-02 17:24:19
348
原创 MyBatis 流式查询,真心强大!
上面的代码中,1 处我们创建了一个 TransactionTemplate 对象(此处 transactionManager 是怎么来的不用多解释,本文假设读者对 Spring 数据库事务的使用比较熟悉了),2 处执行数据库事务,而数据库事务的内容则是调用 Mapper 对象的流式查询。流式查询的过程当中,数据库连接是保持打开状态的,因此要注意的是:执行一个流式查询后,数据库访问框架就不负责关闭数据库连接了,需要应用在取完数据后自己关闭。所以,解决这个问题的思路不复杂,保持数据库连接打开即可。
2024-04-02 17:23:36
376
原创 Docker 是什么? 和 k8s 之间是什么关系?
• Docker 本质上就是一个将程序和环境打包并运行的工具软件,而 Docker 容器本质上只是个自带独立运行环境的特殊进程,底层用的其实是宿主机的操作系统内核。• Docker 软件 通过 Dockerfile 描述环境和应用程序的依赖关系, docker build 构建镜像, docker pull/push 跟 Docker Registry 交互实现存储和分发镜像,docker run 命令基于镜像启动容器,基于容器技术运行程序和它对应的环境,从而解决环境依赖导致的各种问题。
2024-04-02 17:21:50
354
原创 字节二面:如何设计一个支撑数亿用户的系统?
要设计出一套能支撑几十亿人的系统是很困难的。对于软件架构师来说,这一直是一项很大的挑战,但是,从现在开始,看完我的文章,你就会觉得容易很多了。下面是我在本文中提到的几个话题:从最简单的开始:万事合一。可扩展性的艺术:纵向扩展,横向扩展。扩展关系型数据库:主 - 从复制、主 - 主复制、联合、分片、非规范化和 SQL 调优。使用哪种数据库:NoSQL 还是 SQL?先进概念:缓存、CDN、geoDNS 等。在这篇文章里,我不打算谈论诸如容错、可靠性、高可用性等高性能计算的通用术语。
2024-04-02 17:19:56
709
原创 SpringBoot 优雅地实现文件的上传和下载
mavenspringbootmybatis-plusmysqlthymeleafbootstrap4.创建 springboot 项目这里我们主要引入以下依赖:webmybatis-plusmysql 驱动thymeleafcommons-fileuploadlombokcommons-fileupload 是一个上传文件的组件,该组件封装了一些上传文件的方法。6.修改配置文件这里主要包含数据源、thymeleaf、mybatis-plus 三个模块的配置。这里使用 mybatis-p
2023-05-26 13:53:56
390
原创 重学了计算机网络,略有小成,经验全部分享出来
重学计算机网络已经有一段时间了,终于在离开大学多年后又重新拾起了一部分,时至今日已略有小成,并且写了一系列的文章了,会慢慢 发出来。我反正在学习的过程中是画了好多张图上大学的时候就想好好学习网络,梦想着以后成为一名网管。后来发现计算机网络还真是不太好学,非常非常抽象,发现有很多概念好像怎么学都学不明白。这才知道,原来更适合我的网吧管理员,而不是网络管理员。而写代码就不一样了,没那么抽象,而且写出来东西马上能看到成果,写一个方法一运行,马上能输出结果;写一个网页、一段样式,马上就能看到界面的变化。
2023-05-26 13:47:50
153
原创 蚂蚁 Golang 领域驱动设计(DDD)极简最佳实践
在本文中你可以看到一套较为完整的仓储层 => 领域层 => 表现层的 Golang 代码实现,但是肯定不会覆盖全部 DDD 概念,各位可以将它看作一种 Golang 中 DDD 的最佳实践来参考。01背景因为业务需求,我们当时正在用 Golang 从 0 到 1 构建一个Web 系统,由于是个新系统,所以很多东西要自己摸索,当时摆在面前的实际问题是如何更好的组织数据访问层和核心领域模型的代码。相比 Java 构建的系统,代码组织方式、分层等最佳实践已经固化在 Sprint Boot、Sofa Boot 等框
2023-05-26 13:45:04
2081
原创 优雅可拓展的登录封装,让你远离if-else
Hi,大家好,,相信各位码农朋友在搭建从0到1项目时在搭建完基建等任务后,最先去做的都是去搭建系统的用户体系,那么每一个码农朋友都会去编码属于自己系统的一套用户登录注册体系;但是登录方式极其多样,光小编一个人对接的就有google登录,苹果登录,手机验证码,微信验证码登录,微博登录等各种各样的登录;针对这么多的登录方式,小编是如何进行功能接入的呢?
2023-05-26 13:42:24
214
原创 SpringBoot核心配置全面总结
在SpringBoot核心配置文件中,除以上使用内置的配置项之外,我们还可以在自定义配置,然后采用注解方式去读取配置。
2023-05-26 13:42:20
520
原创 用好Java 8中的CompletableFuture类,程序性能起飞
CompletableFuture是Java 8中提供的一种非常方便的异步编程工具,它可以处理各种异步操作,并提供了丰富的方法来创建、操作和组合CompletableFuture对象。在实际应用中,我们可以根据实际需求选择合适的方法来使用CompletableFuture,提高代码的性能和可读性。
2023-05-26 13:40:58
240
原创 阿里 推荐的 Redis 使用规范,太优雅了 !
非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中(latency可查)),查找方法和删除方法。关注公众号小黄鸭编程社区,回复关键字手册,获取最新开发手册。默认策略是volatile-lru,即超过最大内存后,在过期键中使用lru算法进行key的剔除,保证不过期数据不被删除,但是可能会出现OOM问题。
2023-05-26 13:39:55
158
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人