redis的高并发和高可用
如何用 redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 redis 保证自己不是挂掉以后就直接死掉了,即 redis 高可用。
redis 实现高并发主要依靠主从架构,一主多从,一般来说,很多项目其实就足够了,单主用来写入数据,单机几万 QPS,多从用来查询数据,多个从实例可以提供每秒 10w 的 QPS。
主从架构
redis的主从架构就是读写分离,一主多从。
主节点负责写,其他的从节点负责读
其中重要的就是数据的一致性的问题,就是数据的replication。我们采用了主从架构的时候,必须开启持久化
Redis 采用异步方式复制数据到 slave 节点,不过 Redis2.8 开始,slave node 会周期性地确认自己每次复制的数据量;
一个 master node 是可以配置多个 slave node 的;
slave node 也可以连接其他的 slave node;
slave node 做复制的时候,不会 block master node 的正常工作;
slave node 在做复制的时候,也不会 block 对自 ...
缓存
1.为什么要用缓存?
用缓存,主要有两个用途:高性能、高并发。
就是说对于一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求,那么直接将查询出来的结果放在缓存中,后面直接读缓存就好。
缓存功能简单,说白了就是 key-value 式操作,单机支撑的并发量轻松一秒几万十几万,支撑高并发 so easy。单机承载并发量是 mysql 单机的几十倍。
如果按照我们存储的位置来分的话,缓存分为:
本地缓存,访问速度最快的,一般我们查数据的时候,首先查的就是本地缓存,比如Caffeine, Guava Cache, Ehcache
分布式缓存,容量更大,多个应用之间可以i将那些共享数据,比如Redis, Memcached, Hazelcast
客户端缓存,缓存数据存储在客户端,比如浏览器缓存,app缓存等等
CDN缓存,缓存静态资源在离用户较近的 CDN 节点上,常用于加速访问的速度
数据库缓存,数据库自身提供的缓存机制, 用于缓存查询结果,比如mysql就有缓存机制
Redis
1.Redis 和 Memcached 有啥区别?
Redis 相比 Memcac ...
面试二轮
76. 最小覆盖子串(x)
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
1234567891011121314151617181920212223242526272829303132333435363738class Solution{ public String minWindow(String S, String t) { int[] cnt = new int[128]; int less = 0; for (char c:t.toCharArray()){ if (cnt[c]==0){ less++; } cnt[c]++; } char[] s = S.toCharArray(); int m ...
场景题
1.如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
问题分析:
1.大量的消息在MQ里积压了
2.MQ中的消息过期失效了
3.MQ的队列快满了
第一个问题:
消息在MQ大量积压是消费者和生成者生产消费的速度差距过大
消费者消费的少,生产者生产的多
那么我们就先修复消费者的问题,确保消费者都能使用
然后紧急扩容,新建一个 topic,partition 是原来的 10 倍,临时建立好原先 10 倍的 queue 数量。
写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue。
临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据。这种做法相当于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常的 10 倍速度来消费数据。
然后恢复原先的架构
或者是业务支持批量发送的时候,使用批量发送
或者是跳过非重要的消息,
123456789101 ...
介绍
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
下面的命令可以查看当前节点的所有 Index。
1curl -X GET 'http://localhost:9200/_cat/indices?v'
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
Document 使用 JSON 格式表示,下面是一个例子。
12345{ "user": "张三", "title": "工程师", & ...
缓存
1.你在项目中是怎么设计缓存系统的?如何解决缓存与数据库之间的一致性问题?
1.缓存的读取流程:本地缓存->redis->数据库
2.缓存写入策略,为了保持数据库和redis和缓存的一致性,使用了延迟双删策略。
写入数据时,先更新数据库;
然后立即删除 Redis 缓存;
最后通过定时任务或延迟队列再次删除缓存,避免并发读取导致旧缓存重新写入。
3.解决缓存的三大问题
缓存穿透:布隆过滤器,接口限流,空值检验。
缓存击穿:互斥锁,逻辑过期,延迟双写,热点key处理。
缓存雪崩:空对象,随机因子,限流,缓存预热,互斥锁,热点key不过期
4.服务降级&熔断
令牌限流,服务降级,只允许部分接口访问
秒杀
1.假设您要设计一个秒杀系统,需要支持10万QPS的并发请求,商品库存只有1000件。
整体架构设计(包括限流、缓存、数据库等)
如何防止超卖问题?
如何处理热点数据问题?
用户请求 → CDN → 网关限流 → 应用服务器 → Redis集群 → 异步写入MySQL
限流:AOP + IP/用户ID限流,网关 + 应用层双重限流,系统过载时快速失败
缓存设计 ...
登录功能
架构:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051├── src│ ├── main│ │ ├── java│ │ │ └── com│ │ │ └── example│ │ │ └── auth│ │ │ ├── AuthApplication.java│ │ │ ├── config│ │ │ │ ├── AliyunSmsConfig.java│ │ │ │ ├── BloomFilterConfig.java│ │ │ │ └── RedisConfig.java│ │ │ ├── controller│ │ │ ...
自我介绍
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回溯)
管理界面
普通
普通
完善
普通
...
介绍
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,虚拟机依然需要几百 ...













