分布式缓存
设计要点
-
要不要加本地缓存形成二级缓存?
-
选择怎样的数据结构?
-
选择合适的持久化策略(是否纯缓存)
-
选择合适的过期时间、刷新策略(一致性问题)
-
容量评估(分片)、数据均衡、负载均衡
-
风险防范: 缓存穿透、缓存雪崩、hotkey问题
应用模式
-
Read-Through模式:应用先从Cache读,读到就返回,否则再读取DB,加载到Cache然后返回
-
Write-Through模式:应用保存数据到DB,然后刷新Cache
-
Write-Behind模式: 和Write-Through相对,它是异步的,先更新缓存,后续再更新DB
-
Refresh-Ahead模式:提前加载缓存,查询数据时缓存已经存在
刷新策略
实时刷新
-
读取: 先从cache读,读到就返回,否则从数据库读,成功后放cache返回
-
写入: 数据写入数据库,然后让cache失效
-
为什么不直接写cache? 如果存在同时更新数据库的情况,那么缓存可能会被覆盖
异步刷新
-
先更新数据库,再异步更新cache
- 实时性较差,但持久化有保证
-
先更新cache,再异步更新数据库
- 实时性好,但只适合数据并不是很关键的场景
定时刷新
-
应用只访问cache
- 适用数据量大,但更新频率不高,实时性要求不高的场景
风险防范
缓存穿透
-
缓存容量要够用,避免由于LRU被交换出去
-
对事实上不存在的key也进行缓存
-
先返回一个旧数据再异步更新
缓存雪崩
-
保证缓存层服务的高可用性
-
缓存更新要加锁,避免并发更新同一个key
-
设置不同的过期时间,避免同时过期
hotkey问题
-
本地缓存(局部性原理)
-
hash-tag