【原创】Redis 穿透、击穿、雪崩

Redis 缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时它也带来了一些问题,其中最重要的就是数据一致性问题,从严格意义上讲,这个问题无解,如果对数据一致性要求很高,那么就不能使用缓存。
另外的一些典型问题就是 缓存穿透 缓存雪崩缓存击穿

缓存穿透

用户想要查询一个数据,发现 Redis 数据库中没有,也就是缓存没有命中,于是向数据库持久层查询,发现也没有,本次查询失败。当用户很多时,缓存都没有命中(比如秒杀),于是都去请求持久层数据库,这会给持久层数据库造成很大压力,这就是缓存穿透。

解决方案

  • 布隆过滤器
  • 缓存空对象

缓存击穿

缓存击穿是指一个 key 非常热点,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿透缓存,直接请求数据库。

解决方案

  • 设置热点 key 永不过期。
  • 加互斥锁:使用分布式锁,保证每个 key 同一时间只有一个线程去查询,其它线程没有获得分布式锁的权限,只需等待即可。

缓存雪崩

缓存雪崩是指在某一时间段,缓存集体过期失效,Redis 宕机。

解决方案

  • Redis 高可用:布置多个 Redis,一台挂掉还可以有其他台工作。
  • 限流降级:加锁或者队列来控制读数据库缓存的线程数量。
  • 数据预热:在正式部署之前把可能的数据预先访问一遍,并设置不同过期时间,让失效的时间均匀。
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注