消息队列
消息队列是一种用于异步通信的中间件,通过解耦生产者和消费者,实现系统的高可用性、扩展性和灵活性
RabbitMQ 的消息传递流程是怎样的
生产者发送消息到 Exchange,Exchange 根据路由规则将消息转发到相应的 队列,消费者从 队列 中获取消息
RocketMQ 的消息传递流程是怎样的?
生产者通过 服务器 获取 路由,然后将消息发送到指定 路由 的 队列
消费者订阅路由 并拉取消息,从 队列 中读取数据
数据库
Redis
redis是一个非关系型数据库,项目中主要是用来存储热点数据,减轻数据库压力
持久化方式
它的持久化方式有两种,一种是ROB,另一种是AOF
RDB是以快照的方式来存储的,也是redis默认的持久化方式,每隔一段时间进行存储
AOF是在配置文件配置,每秒或每一次操作持久化一次。
Redis 支持哪些数据类型
我记得有5种数据类型,分别是
字符串
列表(List):双端链表,支持 push/pop 操作。
哈希(Hash):键值对的集合,适合存储对象。
集合(Set):无序不重复元素集合,支持交集、并集等操作。
有序集合(Sorted Set):元素按分数排序,适合排行榜。
MySQL
MySQL的索引
MySQL的索引主要就是用来提升查询的效率
创建索引的时候有些需要注意的地方,就是高频查询的字段建立索引;还有就是可以建立关联索引:使用多个字段建立索引
还有就是建立的索引不能过多,否则会影响新增,更新的效率
事务的 ACID
原子性(Atomicity):事务要么全部成功,要么全部回滚。
一致性(Consistency):事务前后数据保持逻辑一致性。
隔离性(Isolation):通过锁 保证并发事务互不干扰。
持久性(Durability):提交后数据永久保存(通过 redo log 实现)。
where和having的区别?
where是对分组前的条件进行限定。having是对分组后的内容进行限定。
where后面不能加聚合函数,having后可以跟聚合函数。
缓存
1. 缓存穿透
问题:恶意请求不存在的 Key,导致缓存未命中,直接查询数据库。
解决方案:
缓存空值(如 @Cacheable(value = “users”, unless = “#result == null”) 改为缓存空对象)。
使用布隆过滤器(Bloom Filter)拦截非法 Key。
2. 缓存雪崩,缓存击穿
问题:大量缓存同时失效,导致数据库压力骤增。
解决方案:
设置随机过期时间(如 expireAfterWrite(30 + random.nextInt(10), TimeUnit.MINUTES))。
使用缓存预热(启动时加载热点数据)。
使用互斥锁(如 Redis 的 SETNX)。
通过 @Cacheable(sync = true) 启用同步执行(仅 Spring 5.3+ 支持)。
微服务
什么是微服务
我理解的微服务就是将应用程序拆分成多个小型、独立的服务;每个服务专注于单一的业务功能
Java这块的微服务,我对SpringCloud和SpringCloudAlibaba比较了解
SpringCloud是基于SpringBoot专为分布式微服务架构而实现
它的核心组件有
Eureka 注册中心,服务注册与发现(AP协议,高可用)
Gateway 网关
Feign 它负责微服务间的 API 调用
Ribbon 负载均衡(与RestTemplate结合使用)
Resilience4j 熔断降级、线程隔离SpringCloudAlibaba是由阿里专为云生态设计的一套微服务框架
它的核心组件有
nacos 注册中心;它的作用类似于Eureka
Dubbo 服务调用作用类似Feign
Sentinel 负责流量控制、熔断降级、负载均衡
RocketMQ 消息队列
负载均衡机制
我记得有好多种;常用的有两种
一种是轮询机制,就是1,2,3;这样一个一个调用,完了再次循环调用
还有就是随机的方式,这种就是随机选个服务调用
熔断机制
它是微服务架构中用于防止系统雪崩的机制
熔断的工作流程分为三个状态
闭合状态(Closed)
正常情况,请求正常调用下游服务。
若失败次数超过阈值(如连续5次失败),触发熔断,进入打开状态。打开状态(Open)
直接拒绝所有请求,返回错误或降级结果。
经过一段时间后(如5秒),进入半开状态。半开状态(Half-Open)
允许少量请求尝试调用下游服务。
若请求成功,则关闭熔断,恢复正常;若失败,则重新打开熔断