缓存服务基础概念
学习缓存的基本原理、常见模式和术语,建立缓存服务选型的基础认知
缓存服务基础概念
什么是缓存
缓存是将频繁访问的数据存储在高速存储层中,以减少对后端数据源的访问压力,提升系统响应速度。
缓存的核心价值
| 维度 | 无缓存 | 有缓存 |
|---|---|---|
| 响应时间 | 毫秒级(DB 查询) | 微秒级(内存读取) |
| 吞吐量 | 受限于 DB 连接数 | 单机 10w+ QPS |
| 扩展性 | 垂直扩展为主 | 水平扩展(集群/分片) |
| 成本 | DB 资源昂贵 | 内存成本可控 |
常见缓存模式
Cache-Aside(旁路缓存)
最常用的模式,应用同时连接缓存和数据库:
读:应用 → 缓存(miss) → DB → 写入缓存 → 返回
写:应用 → DB → 删除/更新缓存
适用:读多写少,对一致性要求不极端严格的场景。
Read-Through / Write-Through
缓存层代理所有读写,应用只与缓存交互:
读:应用 → 缓存(miss) → 缓存自动加载 DB → 返回
写:应用 → 缓存 → 缓存同步写 DB → 返回
适用:需要缓存与 DB 强一致的场景,但写入延迟较高。
Write-Behind(异步回写)
写入只到缓存,异步批量刷入 DB:
写:应用 → 缓存 → 返回(异步:缓存 → DB)
适用:写密集型场景,但有数据丢失风险。
主流缓存服务对比
| 服务 | 数据结构 | 持久化 | 集群 | 典型场景 |
|---|---|---|---|---|
| Redis | String/Hash/List/Set/ZSet/Stream/… | RDB + AOF | Cluster(16384 槽位) | 通用缓存、会话、排行榜、消息队列 |
| Valkey | 同 Redis(兼容) | 同 Redis | 同 Redis | Redis 替代方案(开源协议变更后) |
| Memcached | 纯 Key-Value | 无 | 客户端分片 | 简单 KV 缓存、Session 存储 |
| Dragonfly | 同 Redis(兼容) | 快照 | 单机多线程 | 高性能替代 Redis |
缓存常见问题
缓存穿透
查询不存在的数据,绕过缓存直接打到 DB。
解决:
- 布隆过滤器前置过滤
- 空值缓存(短 TTL)
缓存击穿
热点 key 过期瞬间,大量并发请求同时打到 DB。
解决:
- 互斥锁更新(SETNX)
- 永不过期 + 异步刷新
缓存雪崩
大量 key 同时过期或缓存集群宕机。
解决:
- TTL 加随机偏移
- 多级缓存(本地 + 远程)
- 限流降级
缓存一致性策略
| 策略 | 方式 | 一致性 | 性能 |
|---|---|---|---|
| Cache-Aside + 删除 | 写 DB → 删缓存 | 最终一致 | 高 |
| 延迟双删 | 删缓存 → 写 DB → 延迟再删 | 较高 | 中 |
| 订阅 Binlog | Canal 监听 MySQL Binlog → 更新缓存 | 较高 | 中 |
| 分布式锁 | 写操作加锁 | 强一致 | 低 |
选型建议
- 简单 KV 缓存、Session 存储 → Memcached
- 复杂数据结构、持久化、高可用 → Redis / Valkey
- 极致性能、Redis 兼容 → Dragonfly
- 关注开源协议、社区驱动 → Valkey