缓存的收益和成本
收益:
- 加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍,通过缓存的使用可以有效的加速读写,优化用户体验
- 降低后段负载:帮助后端减少访问量和复杂计算,在很大程度降低了后端的负载
成本:
- 数据不一致性: 缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关
- 代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本
- 运维成本:以Redis Cluster为例,加入后无形中增加了运维成本
常见的缓存问题
缓存穿透
原因:
在高并发下,查询一个根本不存在的数据,缓存层和存储层都不会命中,导致大量请求都要到存储层去查询,失去了缓存保护后端存储的意义
方案:
1. 缓存空对象,可能存在的问题一 空值做了缓存,会导致缓存层中存了更多的键,需要更多的内存空间,二 如果在过期时间内增加了对应数据,会有数据不一致情况,因此缓存空对象的过期时间不易设置的过长
2.布隆过滤器, 缓存空对象是对不存在的数据增加空对象缓存,布隆过滤器是对所有已存在的key做标记,当查询一个不存在的key时,就不访问存储层,在一定程度保护了存储层
两种方案的优缺点
解决缓存穿透 | 使用场景 | 维护成本 |
缓存空对象 |
|
|
布隆过滤器 |
|
|
缓存雪崩
原因:
在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到存储层,产生大量失效的情况有:某一时间大量key过期,redis集群节点出现异常。
方案:
1.分布式锁
使用互斥锁保证只允许一个重键缓存,其他缓存等待重建缓存的线程执行完,重新从缓存获取数据即可
2.缓存永远不过期
为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会异步去构建缓存
两种方案的优缺点
解决方案 | 优点 | 缺点 |
简单分布式锁 |
|
|
永远不过期 | 基本杜绝热点key问题 |
|