Spring Cache 与消息集成

共 33 题
#

1. @Cacheable 的 sync=true 在高并发下避免击穿(Cache Stampede)的实现

A sync=true 让并发线程共享一次加载,单线程加载避免缓存击穿 ✓ 正确答案
B sync=true 让每个线程都加载
C sync=true 与缓存击穿无关
D sync=true 只支持多 key 组合
#

2. @Cacheable 缓存值的序列化(GenericJackson2JsonRedisSerializer)

A 它只能序列化字符串
B 它把对象序列化为 JSON 并保留类型信息,反序列化时还原对象,可读且跨语言 ✓ 正确答案
C 它不保留类型信息
D 它比 JDK 序列化更不可读
#

3. CacheManager 的 SPI 在 Redis(Caffeine)+ 多级缓存场景下的实现细节

A 本地缓存天然一致
B 多级缓存无需一致性处理
C CacheManager 只能用于单一缓存
D 自定义 CacheManager 包装 Caffeine(本地)+ Redis(远程),需处理本地缓存一致性失效广播 ✓ 正确答案
#

4. Spring 7 中 CacheResolver 在动态选择缓存(按租户、按业务线)的工程价值

A 缓存名只能在注解中静态指定
B 自定义 CacheResolver 可按租户/业务线动态选择缓存名,实现缓存隔离与差异化策略 ✓ 正确答案
C CacheResolver 与 CacheManager 无关
D 无法动态选择缓存
#

5. Spring Cache 与 Redis 集成(RedisCacheManager)

A 它只能用于本地缓存
B 它管理 Redis 缓存,配置 TTL、序列化与前缀,@Cacheable 通过它读写 Redis ✓ 正确答案
C 序列化策略无需配置
D 它不管理 TTL
#

6. Spring Integration 与 Kafka Streams 的整合

A 两者功能完全重叠
B Spring Integration 负责消息接入与路由,Kafka Streams 负责流处理,二者互补 ✓ 正确答案
C Kafka Streams 只做消息收发
D Spring Integration 做流处理
#

7. Spring Integration 的 Message/Channel/Endpoint 模型

A Endpoint 只做传输
B 只有 Message 与 Channel
C Message 封装数据,Channel 承载传递,Endpoint 处理消息,三者组成集成流 ✓ 正确答案
D 模型与 EIP 无关
#

8. Spring Integration 的事务边界

A 消息处理无事务
B 可在消息处理端点或 poller 配置事务,使消息处理具备事务性 ✓ 正确答案
C 事务边界无法配置
D 事务只作用于整个应用
#

9. @Cacheable/@CachePut/@CacheEvict 的语义差异

A @CachePut 先查缓存
B 三者都读缓存
C @Cacheable 读缓存、@CachePut 写缓存(总执行方法)、@CacheEvict 删缓存 ✓ 正确答案
D @CacheEvict 只写缓存
#

10. @Gateway 与 Spring Integration 的服务调用

A 网关不能接收应答
B 网关方法直接执行业务逻辑
C 网关与消息流无关
D @Gateway 把接口方法调用映射为消息发送到通道,返回值从应答通道接收,封装消息流 ✓ 正确答案
#

11. Cache.put 与 Cache.evictIfPresent 的工程价值

A 只能通过注解操作缓存
B 两者都无条件删除
C evictIfPresent 与 evict 相同
D put 显式写入缓存,evictIfPresent 仅当 key 存在时删除,提供精细缓存控制 ✓ 正确答案
#

12. ClaimCheck 模式与大消息

A 该模式与大消息无关
B 消息体越大越好
C ClaimCheck 增加消息体
D 大消息体存外部存储,消息只携带票据引用,减少传输开销 ✓ 正确答案
#

13. Spring Cache 6.x/7.x 的演进

A 缓存抽象被完全重写
B 缓存抽象稳定,增强可观测性、AI 缓存支持与细粒度操作(如 evictIfPresent) ✓ 正确答案
C 无任何新特性
D 只增强性能
#

14. Spring Cache 与 Caffeine 集成

A Caffeine 与 Spring Cache 无关
B Caffeine 只能做远程缓存
C Caffeine 无法配置容量
D 通过 CaffeineCacheManager 集成,配置 maximumSize/expireAfterWrite 等控制本地缓存 ✓ 正确答案
#

15. Spring Cache 与 JSR-107(JCache)的集成

A JCache 与 Spring Cache 互不兼容
B Spring Cache 通过 JCacheCacheManager 适配 JCache 标准,使 @Cacheable 可操作 JCache 缓存 ✓ 正确答案
C JCacheCacheManager 只适配默认缓存
D JCache 是 Spring 私有 API
#

16. Spring Cache 与 Spring Modulith 的边界

A 两者都管缓存
B Spring Cache 管数据缓存,Spring Modulith 管模块化架构,二者维度不同可协同 ✓ 正确答案
C 两者都管模块化
D 两者完全重叠
#

17. Spring Cache 失效事件的发布(CacheInvalidationEvent)

A 本地缓存无需同步
B 失效事件与分布式无关
C 缓存失效时发布事件,用于跨节点同步失效,解决多实例本地缓存一致性 ✓ 正确答案
D 事件只在单节点生效
#

18. Spring Cache 抽象(CacheManager/Cache)的体系

A CacheManager 直接操作数据
B 只有 Cache 一个接口
C 缓存后端无法切换
D CacheManager 管理缓存,Cache 定义操作,各后端实现可插拔、注解不变 ✓ 正确答案
#

19. Spring Cache 的 @Cacheable/@CacheEvict/@CachePut 在 Spring Framework 7 中的语义变化与 SpEL 解析边界

A SpEL 无解析边界
B 三注解语义被重写
C 三注解语义稳定,演进在可观测性与 SpEL 解析健壮性,key/condition/unless 作用域不同 ✓ 正确答案
D 只能解析固定表达式
#

20. Spring Cache 的 CacheErrorHandler 自定义

A 自定义 CacheErrorHandler 可让缓存异常降级处理,不影响主业务逻辑 ✓ 正确答案
B 缓存异常必须抛出
C 缓存失败会中断业务
D CacheErrorHandler 无法自定义
#

21. Spring Integration 6.x 的响应式支持

A 响应式端点返回同步对象
B 只支持阻塞处理
C 提供响应式 Channel 与端点,支持 Reactor 的 Flux/Mono 与背压 ✓ 正确答案
D 与 Reactor 无关
#

22. Spring Integration 与 Spring Batch 的边界

A Integration 管消息集成,Batch 管批处理,二者可协作(消息触发 Job) ✓ 正确答案
B 两者都做批处理
C 两者都做消息路由
D 无法协作
#

23. Spring Integration 与 Spring Cloud Stream 的边界

A Spring Integration 是更上层的抽象
B 两者完全独立
C Spring Cloud Stream 基于 Spring Integration 提供消息驱动微服务抽象与 binder 绑定 ✓ 正确答案
D 两者都做批处理
#

24. Spring Integration 与 Spring Modulith 事件的关系

A Spring Modulith 提供模块内事件,可结合 Spring Integration 桥接到外部消息系统 ✓ 正确答案
B 两者互不相关
C 事件只能留在模块内
D Integration 管模块化
#

25. Spring Integration 在 Spring 6.x 的演进

A 无任何变化
B 无响应式支持
C 仍基于 javax
D 基线提升到 Java 17 与 Jakarta,增强响应式支持与适配器 ✓ 正确答案
#

26. Spring Integration 测试支持(@SpringIntegrationTest)

A 它不加载集成上下文
B 它只能测试数据库
C 消息流无法测试
D 用它加载集成上下文,模拟消息发送并验证消息处理结果 ✓ 正确答案
#

27. Spring Integration 的监控指标

A 无法集成 Micrometer
B 无监控指标
C 指标只能本地查看
D 通过 Micrometer 暴露通道/端点统计(消息数、处理时间、队列深度),用于监控 ✓ 正确答案
#

28. @CacheEvict 的 beforeInvocation=true 与 afterInvocation 在方法抛异常时的缓存行为差异

A 方法异常时两者都删
B 两者都在方法后删
C beforeInvocation=true 在方法执行前删缓存,方法异常也会删;默认 afterInvocation 方法异常不删 ✓ 正确答案
D 两者行为相同
#

29. Spring Cache 的 key 生成策略(KeyGenerator/SimpleKey)与 SpEL 自定义 key 的坑

A 默认 SimpleKey 基于参数,SpEL 自定义 key 需注意参数名编译与对象 equals/hashCode ✓ 正确答案
B key 无需考虑参数
C SpEL 参数名无需配置
D 对象直接作 key 无需重写 equals
#

30. 缓存预热(启动加载)与异步刷新的实现方式,如何避免缓存雪崩

A 预热与雪崩无关
B 缓存雪崩无法避免
C 启动预热热点、异步刷新、TTL 随机化与多级缓存共同避免缓存雪崩 ✓ 正确答案
D TTL 越集中越好
#

31. @Cacheable/@CachePut/@CacheEvict 的语义与组合,缓存击穿/穿透/雪崩如何应对?

A 击穿用 sync=true、穿透用空值缓存/布隆过滤、雪崩用 TTL 随机化与多级缓存 ✓ 正确答案
B 三类问题同一策略解决
C 击穿与 sync 无关
D 穿透无需处理
#

32. Spring 消息抽象,JmsTemplate/KafkaTemplate 与 @JmsListener/@KafkaListener 的确认与重试如何?

A JmsTemplate/KafkaTemplate 发送,@JmsListener/@KafkaListener 消费,手动 ack 与重试策略保障可靠投递 ✓ 正确答案
B 消息自动确认,无需重试
C 确认与重试无关
D 无法手动确认
#

33. @Cacheable 对方法返回 null 的默认行为(不缓存)与 null 值缓存策略

A 无法控制 null 缓存
B 默认缓存 null
C null 缓存与穿透无关
D 默认返回 null 不缓存,allowNullValues=true 可缓存空值防缓存穿透 ✓ 正确答案