redis 缓存

缓存的收益和成本

收益:

  • 加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍,通过缓存的使用可以有效的加速读写,优化用户体验
  • 降低后段负载:帮助后端减少访问量和复杂计算,在很大程度降低了后端的负载

成本:

  • 数据不一致性: 缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关
  • 代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本
  • 运维成本:以Redis Cluster为例,加入后无形中增加了运维成本

常见的缓存问题

缓存穿透

 原因:

在高并发下,查询一个根本不存在的数据,缓存层和存储层都不会命中,导致大量请求都要到存储层去查询,失去了缓存保护后端存储的意义

方案:

1. 缓存空对象,可能存在的问题一 空值做了缓存,会导致缓存层中存了更多的键,需要更多的内存空间,二 如果在过期时间内增加了对应数据,会有数据不一致情况,因此缓存空对象的过期时间不易设置的过长

2.布隆过滤器, 缓存空对象是对不存在的数据增加空对象缓存,布隆过滤器是对所有已存在的key做标记,当查询一个不存在的key时,就不访问存储层,在一定程度保护了存储层

两种方案的优缺点

解决缓存穿透使用场景维护成本
缓存空对象
  • 数据命中不高
  • 数据频繁变化实时性高
  • 代码维护简单
  • 需要过多的缓存空间
  • 数据不一致
布隆过滤器
  • 数据命中不高
  • 数据相对固定实时性低
  • 代码维护复杂
  • 缓存空间占用少

 

缓存雪崩

原因:

     在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到存储层,产生大量失效的情况有:某一时间大量key过期,redis集群节点出现异常。

方案:

1.分布式锁

    使用互斥锁保证只允许一个重键缓存,其他缓存等待重建缓存的线程执行完,重新从缓存获取数据即可

2.缓存永远不过期

  为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会异步去构建缓存

两种方案的优缺点

解决方案优点缺点
简单分布式锁
  • 思路简单
  • 保证一致性
  • 代码复杂度增大
  • 存在死锁的风险
  • 存在线程池阻塞的风险
永远不过期基本杜绝热点key问题
  • 不保存一致性
  • 逻辑过期时间增加了代码维护成本和内存成本

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值