穿透优化
缓存穿透是指查询一个根本不存在数据,缓存层和存储层都不会命中
造成的问题
缓存层不命中,每次都要取存储层访问存储层,没有起到保护存储层的作用,更有可能导致后端负载加大引起后端宕机。
检测方式:统计总调用数、缓存命中数、存储层命中数查看是否有大量的存储层空命中
如何解决
- 缓存空对象,即使存储层查询不到也返回null给缓存层存储,之后的访问直接从缓存层拿数据了。
设置较短时间的超时清除缓存策略,减少缓存层空对象占用内存,若出现数据不一致,可利用消息系统等方式删除旧缓存并从新缓存
适合命中率不高但实时性要求高的场景,维护简单但需要过多的存储空间并且会出现数据不一致 - 布隆过滤器拦截,在缓存层和存储层前面加一个存放已存在key的布隆过滤器,做第一层拦截
适合数据实时性不高相对固定的场景,代码维护复杂,但是缓存空间占用少
无底洞优化
增加更多的缓存服务器反而引起性能下降的现象就叫“无底洞”现象
产生原因:因为通过增加缓存服务器作水平扩展的时候,键值会分布到更多的节点上,因此在进行批量操作的时候就会增加多次网络时间
如何解决
- 串行命令:将批处理分解成多个单一命令,编程简单,keys很大的时候耗时长
- 串行IO:对每个节点作批量处理,这样将一个多节点的批处理变成多个单节点的批处理,操作时间=node次网络时间+n次命令时间,节点太多的时候性能较差
- 并行IO:将串行IO中单节点的批量操作变为多线程同时进行,变成一次节点处理的网络时间,总的时间=max_slow(node网络时间)+n次命令时间,极大地减少了网络时间,但是编程复杂,维护也较难
- hash_tag:将多个key强制分配在一个节点上面,操作时间=1次网络时间+n次命令时间,性能最好,维护成本较高,容易出现数据倾斜
雪崩优化
缓存雪崩是指当缓存层缓存了大量的数据,极大减轻了后端存储层的负载,然后缓存层突然不可用,导致所有的请求直接到达后端,后端直接崩掉
如何解决
- 提高缓存层的高可用性
- 依赖隔离组件为后端限流并降级
- 提前压力测试