缓存的收益及成本
- 收益:加速读写、降低后端负载
- 成本:数据不一致性、代码维护成本、运维成本
缓存更新策略
- LRU/LFU/FIFO算法剔除,用于缓存使用量超过预设最大值时的缓存处理
- 超时剔除:缓存数据超过过期时间后自动删除,存在一定时间的数据不一致性
- 主动更新:应用方对数据的一致性要求较高,需要在真实数据更新后立刻更新缓存数据
缓存粒度控制(即缓存的内容应该如何选择)
- 基于通用性、空间占用及代码维护三个层面考虑
缓存穿透优化(查询一个根本不存在的数据,缓存层和存储层都不会命中)
- 缓存空对象,这样在访问时会从缓存中直接返回空对象,保护了数据库
- 空值缓存意味着更多的键和内存空间,需要给这些空对象设置较短的过期时间
- 缓存层和存储层会存在一定时间的数据不一致现象
- 布隆过滤器,通过布隆过滤器判断键是否存在,不存在就不访问存储层,使用面积有限
缓存无底洞优化(缓存节点水平扩展后,性能因为获取的键散步于不同的机器上导致的IO增多使得请求反而变慢的现象)
- 串行执行,简单对所有请求的键执行get
- 串行IO,计算出请求的键分布于哪些节点上,对这些节点做mget或pipeline
- 并行IO,与串行IO的不同仅在于并行的请求节点做mget或pipeline
- hash_tag,将请求的键放到一个节点上
雪崩优化(缓存大量失效导致请求打到存储层)
- 保证业务高可用性
- 依赖隔离组件为后端限流降级
热点key重建优化(缓存失效的瞬间,热点key的大面积请求导致后台瞬间负载增大)
- 互斥锁:一个线程重建,其余线程等待(现已优化为一个线程重建,其余线程返回老数据)
- 永远不过期:现基本已改为缓存预重设
来源:oschina
链接:https://my.oschina.net/u/4525941/blog/4497733