Redis(二)-----缓存优化

本文介绍了缓存穿透、无底洞及雪崩等常见问题及其解决方案,包括缓存空对象、使用布隆过滤器、增加缓存服务器及提高缓存层高可用性等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

穿透优化

缓存穿透是指查询一个根本不存在数据,缓存层和存储层都不会命中

造成的问题

缓存层不命中,每次都要取存储层访问存储层,没有起到保护存储层的作用,更有可能导致后端负载加大引起后端宕机。
检测方式:统计总调用数、缓存命中数、存储层命中数查看是否有大量的存储层空命中

如何解决
  • 缓存空对象,即使存储层查询不到也返回null给缓存层存储,之后的访问直接从缓存层拿数据了。
    设置较短时间的超时清除缓存策略,减少缓存层空对象占用内存,若出现数据不一致,可利用消息系统等方式删除旧缓存并从新缓存
    适合命中率不高但实时性要求高的场景,维护简单但需要过多的存储空间并且会出现数据不一致
  • 布隆过滤器拦截,在缓存层和存储层前面加一个存放已存在key的布隆过滤器,做第一层拦截
    适合数据实时性不高相对固定的场景,代码维护复杂,但是缓存空间占用少

无底洞优化

增加更多的缓存服务器反而引起性能下降的现象就叫“无底洞”现象
产生原因:因为通过增加缓存服务器作水平扩展的时候,键值会分布到更多的节点上,因此在进行批量操作的时候就会增加多次网络时间

如何解决
  • 串行命令:将批处理分解成多个单一命令,编程简单,keys很大的时候耗时长
  • 串行IO:对每个节点作批量处理,这样将一个多节点的批处理变成多个单节点的批处理,操作时间=node次网络时间+n次命令时间,节点太多的时候性能较差
  • 并行IO:将串行IO中单节点的批量操作变为多线程同时进行,变成一次节点处理的网络时间,总的时间=max_slow(node网络时间)+n次命令时间,极大地减少了网络时间,但是编程复杂,维护也较难
  • hash_tag:将多个key强制分配在一个节点上面,操作时间=1次网络时间+n次命令时间,性能最好,维护成本较高,容易出现数据倾斜

雪崩优化

缓存雪崩是指当缓存层缓存了大量的数据,极大减轻了后端存储层的负载,然后缓存层突然不可用,导致所有的请求直接到达后端,后端直接崩掉

如何解决
  • 提高缓存层的高可用性
  • 依赖隔离组件为后端限流并降级
  • 提前压力测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值