登录功能架构:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051├── src│ ├── main│ │ ├── java│ │ │ └── com│ │ │ └── example│ │ │ └── auth│ │ │ ├── AuthApplication.java│ │ │ ├── config│ │ │ │ ├── AliyunSmsConfig.java│ │ │ │ ├── BloomFilterConfig.java│ │ │ │ └── RedisConfig.java│ │ │ ├── controller│ │ │ ...
缓存1.你在项目中是怎么设计缓存系统的?如何解决缓存与数据库之间的一致性问题?1.缓存的读取流程:本地缓存->redis->数据库
2.缓存写入策略,为了保持数据库和redis和缓存的一致性,使用了延迟双删策略。
写入数据时,先更新数据库;
然后立即删除 Redis 缓存;
最后通过定时任务或延迟队列再次删除缓存,避免并发读取导致旧缓存重新写入。
3.解决缓存的三大问题
缓存穿透:布隆过滤器,接口限流,空值检验。
缓存击穿:互斥锁,逻辑过期,延迟双写,热点key处理。
缓存雪崩:空对象,随机因子,限流,缓存预热,互斥锁,热点key不过期
4.服务降级&熔断
令牌限流,服务降级,只允许部分接口访问
秒杀1.假设您要设计一个秒杀系统,需要支持10万QPS的并发请求,商品库存只有1000件。整体架构设计(包括限流、缓存、数据库等)
如何防止超卖问题?
如何处理热点数据问题?
用户请求 → CDN → 网关限流 → 应用服务器 → Redis集群 → 异步写入MySQL
限流:AOP + IP/用户ID限流,网关 + 应用层双重限流,系统过载时快速失败
缓存设计:三层缓 ...
自我介绍2025.8.4版本:
您好,我叫xxx,来自齐鲁工业大学,主攻 Java 后端开发方向。
在校期间,我积极参与开源社区,在 GitHub 上持续贡献代码。比如在 Spring AI Alibaba 项目中,我实现了模板节点功能、修复了 NPE 异常,并完善了 JSON 结构的表达逻辑;也为 Fastjson2 提交了多个 PR,修复了关键 Bug,并深入学习了其源码设计。
在技术栈方面,我熟练掌握 Spring Boot 与 MyBatis 框架,能够独立进行完整的接口开发;熟悉 Redis、MySQL、RocketMQ 等常见中间件,了解其使用场景与性能优化思路。我也习惯于搭建本地环境做实测,熟练使用 Docker、IDEA、Apifox 等工具进行开发与调试。
同时,我也热衷于知识分享,平时喜欢通过写博客总结学习过程中的技术要点和实战经验,一方面加深理解,也希望能帮助到其他开发者。
我对后端架构设计与工程实践充满热情,感谢您给我这次面试机会,期待有机会为贵公司贡献力量。
自我真实面试6.30宁波某小厂40min腾讯会议,项目是外卖和MyDB
1.问的学业情况,课程情况,到 ...
数据库分库分表分库分表是解决海量数据存储和高并发访问的有效手段,但其设计并非一蹴而就,需要深入思考以下几个核心原则和复杂性。
分片键—-重要分片键是数据分布的依据,其选择直接决定了分片策略的有效性和未来的可维护性。
业务相关性: 分片键应与核心业务逻辑紧密相关。例如,用户相关数据以 user_id 分片,订单相关数据可能也以 user_id 分片以保证用户维度的数据局部性。
数据均匀性: 理想的分片键能够将数据均匀地分散到各个分片中,避免出现“热点”(某个分片数据量过大或访问压力过高)。通常采用哈希(如 MD5(user_id) % N 或更复杂的哈希算法)或自定义算法来确保均匀分布。
可以通过历史数据分析来模拟不同分片键策略下的数据分布情况,评估其均匀性。对于哈希取模,可以考虑使用一致性哈希,它在节点增减时能更好地保持数据分布的均衡性,减少数据迁移量。
稳定性: 分片键一旦确定,通常不应改变。如果分片键的值会频繁更新,会带来数据迁移和维护的巨大挑战。
对于那些不含分片键的查询,需要特别关注。这类查询通常会触发全表扫描(或全分片扫描),性能极低。在设计业务功能时,应尽量引导业务方 ...
消息队列1.什么是消息队列?你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下:
我们通常说的消息队列,简称MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafka。
2.消息队列怎么选型?Kafka、ActiveMQ、RabbitMQ、RocketMQ来进行不同维度对比。
特性
ActiveMQ
RabbitMQ
RocketMQ
Kafka
单机吞吐量
万级
万级
10 万级
10 万级
时效性
毫秒级
微秒级
毫秒级
毫秒级
可用性
高(主从)
高(主从)
非常高(分布式)
非常高(分布式)
消息重复
至少一次
至少一次
至少一次 最多一次
至少一次最多一次
消息顺序性
有序
有序
有序
分区有序
支持主题数
千级
百万级
千级
百级,多了性能严重下滑
消息回溯
不支持
不支持
支持(按时间回溯)
支持(按offset回溯)
管理界面
普通
普通
完善
普通
k ...
介绍Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡。
上图基本上说明了当下流行的技术架构,其中Nginx有点入口网关的味道。
正向代理:
反向代理:
由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助VPN来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。
当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。
保障应用服务器的安全(增加一层代理,可以屏蔽危险攻击,更方便的控制权限)
实现负载均衡(稍等~下面会讲)
实现跨域(号称是最简单的跨域方式)
Nginx的Master-Worker模式启动Nginx后,其实就是在80端口启动了Socket服务进行监听,如图所示,Nginx涉及Master进程 ...
困难现状软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?
用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。
如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:”它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
但是会有以下的问题:
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 ...
web基础1.JavaWeb是什么(静态资源和动态资源)
JavaWeb 是基于 Java 技术的 Web 开发体系,用于构建浏览器/服务器(B/S)架构的动态网站或服务。
核心组成部分:
模块
说明
Servlet
JavaWeb 的核心,用于处理 HTTP 请求
JSP / Thymeleaf
页面展示层,用于动态生成 HTML 内容
Filter / Listener
过滤器和监听器,提供请求过滤、生命周期监听等功能
Web.xml
部署描述文件,用于配置 Servlet、Filter 等组件(Spring Boot 多用注解配置)
静态资源
纯前端文件,如 HTML、JS、CSS、图片等
动态资源
由 Servlet / Controller 处理、运行时生成的内容
类型
描述
是否经过服务端处理
静态资源
浏览器请求后直接返回内容(如 HTML/CSS/JS/图片)
❌ 不经过 Java 代码处理,直接由服务器返回
动态资源
运行时由后端生成(如 .jsp、Servlet、Controller 响应 JSON) ...
题目解答一 基础知识1.若CPU的寻址能力是 2^n字节(Byte),那么地址总线宽度为 n 位。
8KB = 2^13byte
所以为13
2.1KB存储器的地址范围, 1KB = 1024个存储单元,地址从0开始编号
所以为0-1023
3.1KB存储器可存储的数据量,1KB = 2^13bit
可存储 2^13 bit
可存储 2^10 Byte
4.常见的转换:::
1KB = 2^10Byte
1MB = 2^20Byte
1GB = 2^30Byte
6.传输1024字节所需次数
若数据总线宽度为 n 位,则每次传输 n/8 字节
所需次数 = 总字节数 ÷ 每次字节数
8086(16位)→ 一次2B → =512 次
80386(32位)→ 一次4B → =256 次
8080:8位 → 1B
8088:8位 → 1B
8086:16位 → 2B
80286:16位 → 2B
80386:32位 → 4B
二 寄存器1.补充完整:
mov 是赋值指令,不影响标志位。
add 是加法指令,结果存入目标寄存器。
ax 包括 ah(高8位)和 al(低8位)。
指令演示:
...
计算方法——公式汇总第一章:误差分析
绝对误差
Δ=∣x∗−x∣\Delta = \bigl|x^* - x\bigr|
相对误差
δ=∣x∗−x∣∣x∗∣\delta = \frac{\bigl|x^ - x\bigr|}{\lvert x^\rvert}
四舍五入误差限(保留到第 nn 位有效数字)
Δmax=12×10−n,δmax=Δmax∣x∣\Delta_{\max} = \tfrac12 \times 10^{-n}, \quad \delta_{\max} = \frac{\Delta_{\max}}{\lvert x\rvert}
有效数字与相对误差关系 若已知相对误差 ε\varepsilon,则有效数字位数 nn 满足
12 10−(n−1) ≤ ε < 12 10−(n−2).\frac12 \,10^{-(n-1)} \;\le\; \varepsilon \;<\; \frac12 \,10^{-(n-2)}.
误差传播
乘除法:
δ(f(x1,…,xk))≈∑i=1kδ(xi).\delta\bigl(f( ...
日志1.在 Mydb 数据库中,日志模块是如何实现崩溃恢复的?请详细说明日志格式、校验机制、写入流程和恢复逻辑,并分析可能存在的性能瓶颈及优化方案。日志设计
redo log:记录事务提交后的数据修改,用于崩溃后重做已提交事务(如数据页修改记录);
undo log:记录事务提交前的原始状态,用于回滚未提交事务(如行版本号、旧值)。
12[全局校验码(4B)][日志条目1][日志条目2]... 日志条目格式:[条目长度(4B)][校验码(4B)][数据内容(N字节)]
日志文件头部 4 字节为全局校验码,每条日志以[4字节长度+4字节校验码+数据]组成。启动时会从头部开始校验每条日志的 checksum,若全局校验码不一致则截断文件尾部。”
崩溃恢复
校验
从文件头部开始读取每条日志,校验单条日志的 checksum;
累计计算全局校验码,与文件头部校验码比对,不一致则截断文件尾部。
redo
扫描日志,提取所有状态为COMMITTED的事务记录;
按日志顺序重新执行数据修改操作(如更新数据页)。
undo
扫描日志,找到状态为ACTIVE或ABORTED的事务;
根据 ...
架构项目分为四个主要模块:
backend:数据库核心功能实现
client:客户端实现
transport:网络传输层
common:公共工具和异常处理
后端dm/数据管理:实现数据页面的管理和持久化
DataManager.java:数据管理器接口
DataManagerImpl.java:数据管理器实现
PageOne.java:特殊页面,存储元数据
PageX.java:数据页面
Logger.java:日志管理
im/索引管理:实现B+树索引
BPlusTree.java:B+树实现
Node.java:B+树节点
LeafNode.java:叶子节点
InternalNode.java:内部节点
tbm/表管理:实现表的创建、删除和管理
Table.java:表的抽象
TableManager.java:表管理器接口
TableManagerImpl.java:表管理器实现
Field.java:字段定义和管理
tm/事务管理:实现事务的ACID特性
ransactionManager.java:事务管理器接口
TransactionManagerImpl ...