sequenceDiagram
participant Client as 客户端
participant Cache as 缓存层
participant DB as 数据库
Client->>Cache: 查询 key=X (不存在)
Cache->>Client: 返回空/缓存未命中
Client->>DB: 查询 key=X (不存在)
DB->>Client: 返回空/数据不存在
Note over Client,DB: 大量此类请求会直接冲击数据库
2.2 缓存穿透解决方案
以下是几种常见的缓存穿透解决方案:
flowchart TD
A[请求进入] --> B[参数校验]
B --> C{布隆过滤器}
C -->|不存在| D[直接返回空]
C -->|可能存在| E[查询缓存]
E -->|命中| F[返回数据]
E -->|未命中| G[(查询数据库)]
G -->|数据存在| H[更新缓存]
H --> F
G -->|数据不存在| I[缓存空值]
I --> D
style C fill:#22c55e,color:#fff
style I fill:#f59e0b,color:#fff
flowchart TD
subgraph 参数校验层
A[请求参数校验] --> B[格式校验]
A --> C[范围校验]
A --> D[业务规则校验]
E[恶意请求识别] --> F[IP黑名单]
E --> G[请求频率限制]
E --> H[异常模式检测]
end
subgraph 布隆过滤器实现
I[布隆过滤器] --> J[多个哈希函数]
J --> K[哈希映射到位图]
K --> L[位运算判断存在性]
M[过滤器更新] --> N[新增数据时添加]
M --> O[删除数据时标记]
M --> P[定期重建过滤器]
Q[误判率控制] --> R[调整位数组大小]
Q --> S[调整哈希函数数量]
end
subgraph 缓存空值策略
T[缓存空值] --> U[设置短过期时间]
U --> V[避免内存浪费]
W[空值标记] --> X[特殊标记标识]
X --> Y[区分真正空数据]
Z[异步清理] --> AA[定时任务清理]
AA --> AB[避免长期占用]
end
subgraph 请求限流层
AC[限流策略] --> AD[基于IP限流]
AC --> AE[基于用户限流]
AC --> AF[基于接口限流]
AG[熔断降级] --> AH[断路器模式]
AH --> AI[失败率阈值]
AI --> AJ[自动恢复机制]
end
subgraph 数据存储层
AK[数据库查询] --> AL[索引优化]
AL --> AM[覆盖索引]
AM --> AN[查询缓存]
AO[数据存在] --> AP[写入缓存]
AP --> AQ[设置正常过期]
AR[数据不存在] --> AS[缓存空值]
AS --> AT[设置短过期]
end
subgraph 监控告警
AU[监控指标] --> AV[穿透率统计]
AV --> AW[空值缓存命中率]
AW --> AX[数据库压力]
AY[告警规则] --> AZ[穿透率阈值]
AZ --> BA[延迟阈值]
BA --> BB[自动告警]
end
A --> I
I --> T
T --> AC
AC --> AK
AK --> AU