1. @RequestParam vs @RequestPart

在 Spring Boot 中,@RequestParam@RequestPart 都可以用于处理 MultipartFile 类型的文件上传,但它们的作用略有不同:

(1) @RequestParam("file") MultipartFile file

示例

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    return "文件名:" + file.getOriginalFilename();
}

(2) @RequestPart("file") MultipartFile file

示例

@PostMapping("/upload")
public String upload(@RequestPart("file") MultipartFile file) {
    return "文件名:" + file.getOriginalFilename();
}

(3) 二者的主要区别

@RequestParam @RequestPart
主要用途 处理表单参数(包括文件) 处理复杂的 multipart 请求
适用场景 表单文件上传 JSON + 文件组合
适用于 Feign 客户端 ❌ 不适用 ✅ 适用

结论


2. 如何让 Spring Cloud 的所有项目在 IDEA 的 Services 里统一管理

默认情况下,Spring Boot 项目启动后,不会自动出现在 IntelliJ IDEA Services 窗口里,需要手动配置。

(1) 通过 IDEA 添加多个 Spring Boot 运行配置

  1. 打开 Run | Edit Configurations
  2. 点击 +选择 Spring Boot
  3. 为每个微服务配置启动类
  4. 在 Services 里添加所有 Spring Boot 运行配置
  5. 这样所有 Spring Cloud 项目都可以统一管理,一键启动

(2) 直接使用 docker-compose 统一管理

如果你的 Spring Cloud 项目使用 Docker 部署,可以在 IDEA 的 Services 里启用 docker-compose 进行统一管理。

(3) 使用 spring-boot-admin

结论


3. Redis 为什么要预热?适用于什么场景?

Redis 预热(Warm-Up) 是指 在 Redis 服务启动或缓存失效后,提前加载数据到缓存,避免大并发时数据库压力过大。

(1) 预热的主要作用

  1. 避免缓存雪崩:
    • 如果缓存大规模过期,所有请求会打到数据库,导致数据库崩溃。
  2. 减少缓存击穿风险:
    • 热点数据(高频访问)如果突然失效,数据库会被瞬间压垮。
  3. 提高系统启动速度:
    • Redis 重新启动时,避免缓慢加载数据。

(2) 适用场景

(3) 预热方式

  1. 应用启动时主动加载:
    • ApplicationRunnerCommandLineRunner 里初始化 Redis 缓存。
  2. 定时任务定期预热:
    • 定时从数据库同步热点数据到 Redis。
  3. Redis 持久化(RDB / AOF):
    • 通过 RDBAOF 避免服务重启后数据丢失。

4. Bitmap 位图的 bit 概念,与 1024 的关系

(1) 位图(Bitmap)

(2) bit 是什么?

(3) Bitmap 适用场景

结论


5. 为什么 Redis BGSAVE 采用 COW 机制可以避免脏数据?

(1) BGSAVE 过程

  1. fork 子进程
    • 子进程共享主进程内存。
  2. 子进程写 RDB
    • 读取 fork 时的快照数据,并写入 RDB 文件。
  3. 主进程继续处理请求
    • 读操作: 访问共享内存。
    • 写操作: 由于 COW 机制,拷贝数据副本 B,再修改。

(2) 如何避免脏数据?


6. 如果没有 Copy-On-Write(COW),会出现什么问题?

如果没有 COW 机制:

  1. 主进程直接修改共享数据
    • 可能导致 RDB 备份数据在保存过程中被篡改。
  2. 快照数据可能不一致
    • 如果主进程在 BGSAVE 过程中修改 key,RDB 可能会存入不完整的数据。
  3. 可能存入“部分新、部分旧”的数据
    • 备份的数据可能是一部分新值 + 一部分旧值,造成数据不一致。

(1) 脏数据情况

时间点 事件
T1 fork 进程,创建子进程
T2 主进程修改 key1
T3 子进程写入 key1
结果 RDB 存入的是已修改的数据,导致脏数据问题

(2) COW 解决方案