Files
examination/topics/architecture/cache-system/cache-architecture/fill_blank.json
T
2026-09-05 12:03:21 +08:00

181 lines
7.1 KiB
JSON

{
"topic": "cache-architecture",
"type": "fill_blank",
"schema_version": "1.0.0",
"generated": "09-2026-09-05T00:00:00+08:00",
"questions": [
{
"id": "fb-001",
"type": "fill_blank",
"difficulty": 1,
"tags": [
"单机缓存"
],
"question": "判断单机应用是否需要引入 Redis 的核心依据不是'是否单机',而是缓存是否需要被______共享。",
"answer": [
"多进程/多个服务"
],
"answer_rule": "any",
"explanation": "决定要不要 Redis 的核心判断是'缓存是否需要被多进程/多能力共享'。单进程应用可用本地缓存;一旦多进程共享缓存,就必须引入 Redis 以保证一致性。常见误判是把'单机'当'单进程'。",
"source": null,
"related": []
},
{
"id": "fb-002",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"多进程共享"
],
"question": "一台机器上多个进程需要共享缓存时,若各进程持本地副本会彼此不一致,此时应引入______作为独立的共享缓存层。",
"answer": [
"Redis"
],
"answer_rule": "any",
"explanation": "多个业务进程同时访问缓存时,进程内本地缓存各持副本必然不一致,应引入 Redis 这类独立进程的缓存服务作为共享层,保证所有进程看到同一份数据。",
"source": null,
"related": []
},
{
"id": "fb-003",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"Redis持久化",
"AOF"
],
"question": "在进程重启后缓存不能丢失,且依赖原子自增(INCR)能力的场景下,应选择的缓存组件是______,并结合______持久化保证重启不丢。",
"answer": [
"Redis",
"AOF"
],
"answer_rule": "ordered",
"explanation": "需要跨进程共享、进程重启不丢且依赖原子计数时,应选 Redis。Redis 通过 AOF(追加日志)或 RDB(快照)持久化;其中 AOF 基于操作日志、重放后数据恢复更完整,符合'重启不丢'的诉求。",
"source": null,
"related": []
},
{
"id": "fb-004",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"Write-Behind",
"回写式缓存"
],
"question": "客户端不直接访问 DB,统一读写缓存层,由缓存层异步批量写回 DB,这种架构被称为 Read-Through + ______(回写式缓存 / 懒更新缓存)。",
"answer": [
"Write-Behind"
],
"answer_rule": "any",
"explanation": "Write-Behind 也叫回写式缓存或懒更新缓存:写操作只更新缓存,由缓存层异步批量同步到 DB。它带来了异步落库、可批量合并写的优势,但也有丢写风险和外部读到旧值的代价。",
"source": null,
"related": []
},
{
"id": "fb-005",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"Write-Behind"
],
"question": "Write-Behind 架构下为保证不丢写,缓存必须开启______持久化,并配套兜底日志/队列;为保证批量落库不乱序,需为数据附带______或时间戳。",
"answer": [
"AOF",
"版本号"
],
"answer_rule": "ordered",
"explanation": "Write-Behind 丢写风险高,缓存必须持久化(AOF)并有兜底日志/队列;批量落库时要带版本号或时间戳,防止旧数据覆盖新数据造成乱序。绝不能把缓存当作唯一真相源。",
"source": null,
"related": []
},
{
"id": "fb-006",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"多级缓存"
],
"question": "多级缓存(L1 本地 + L2 Redis)副本不一致的常见解法之一是:本地缓存设短 TTL 结合______过期做兜底,或写时通过 MQ ______通知各节点清本地缓存。",
"answer": [
"逻辑",
"广播"
],
"answer_rule": "ordered",
"explanation": "L1 本地与 L2 Redis 副本不一致是核心难点。缓解手段包括:本地短 TTL + 逻辑过期兜底;主动失效 + MQ 广播通知所有节点清本地缓存;版本号/时间戳判定过期。",
"source": null,
"related": []
},
{
"id": "fb-007",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"Caffeine",
"TinyLFU"
],
"question": "Caffeine 是进程内 JVM 内存缓存,采用______淘汰策略,单次访问纳秒级、无网络开销,适合做 L1 ______热点缓存。",
"answer": [
"TinyLFU",
"极热/高"
],
"answer_rule": "ordered",
"explanation": "Caffeine 使用 TinyLFU 淘汰策略,能更精确地识别高频热数据;作为进程内内存虽然纳秒级访问,但重启即失、无法跨进程共享,因此适合做 L1 极热/高访问层,与 Redis(L2 共享)搭配成多级缓存。",
"source": null,
"related": []
},
{
"id": "fb-008",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"限流",
"熔断"
],
"question": "在缓存降级设计中,当 Redis 抖动不可用时,为防止流量全部回源打爆 DB,应引入本地缓存兜底、配合______、______等保护手段。",
"answer": [
"限流",
"熔断"
],
"answer_rule": "ordered",
"explanation": "Redis 不可用时应降级而不是无限回源。常用手段包括:本地缓存兜底、限流(限制回源速率)、熔断(快速失败保护后端)、以及返回降级数据。共同目标都是保护 DB 和后端服务免于过载。",
"source": null,
"related": []
},
{
"id": "fb-009",
"type": "fill_blank",
"difficulty": 4,
"tags": [
"哨兵",
"Redis Cluster"
],
"question": "Redis 高可用的两种组成方式:由______负责主从复制的故障检测与自动切换,由______负责数据分片以实现横向扩容。",
"answer": [
"哨兵/Sentinel",
"Redis Cluster"
],
"answer_rule": "ordered",
"explanation": "哨兵(Sentinel)部署在主从复制之上,监控、故障检测并自动提升换来主从切换,保障高可用;Redis Cluster 按 slot 分片,把数据分发到不同分片实现水平扩展。两者职责互补。",
"source": null,
"related": []
},
{
"id": "fb-010",
"type": "fill_blank",
"difficulty": 4,
"tags": [
"RDB"
],
"question": "Redis 提供两种主流持久化方式:______以周期性快照落盘,______则记录每一次写命令,二者可以同时开启。",
"answer": [
"RDB",
"AOF"
],
"answer_rule": "ordered",
"explanation": "RDB(快照)按周期把内存数据整份序列化写入磁盘,恢复快但可能丢失最后一次快照后的数据;AOF 记录每次写命令的追加日志,可重放到最近状态,数据更安全。两者不相斥,生产上可同时开启。",
"source": null,
"related": []
}
]
}