Redis缓存穿透、缓存击穿(失效)、缓存雪崩问题

数据存储基本在 DB 中(如 MySQL、Hbase 等),但受硬件影响, DB 的读写性能低、延迟高,阿里云上4核8G通用mysql的最大iops才5000,再受网络影响,也可能会达不到。
由于Redis是基于内存的,读写性能快,可以用Redis做缓存来弥补DB的不足。
我拿垃圾电视盒子装了docker来测试Redis,性能都是Mysql的3倍了,

root@aml:~# docker exec -it redis /bin/bash
root@bfe674de53ce:/data# redis-benchmark -t set,get -n 100000 -q
SET: 15080.68 requests per second, p50=1.663 msec
GET: 14994.75 requests per second, p50=1.679 msec

root@bfe674de53ce:/data#

一般正常情况下,Redis的QPS会达到10万以上的,性能远超mysql。但使用缓存,也经常会遇到一些问题,下面讲了缓存穿透、缓存击穿(失效)、缓存雪崩这3种。

1. 缓存穿透

1.1 现象

缓存穿透是指查询一个不存在的数据,即数据不存在 Redis 也不存在于数据库中。一般都是些特殊的请求状况(如恶意攻击等)。这样导致每次请求都会穿透到数据库,缓存成了摆设。若请求次数过高,会使得数据库的压力非常大,甚至导致数据库服务压死。

1.2 解决方案

  • 接口层实现api限流、用户授权、id检查等
  • 缓存空值:当请求的数据不存在 Redis 也不存在数据库的时候,设置一个缺省值(比如:None),并设置30s有效期。当后续再次进行查询则直接返回空值或者缺省值
  • 布隆过滤器:在数据写入数据库的同时将这个 ID 同步到到布隆过滤器中,当请求的 id 不存在布隆过滤器中则说明该请求查询的数据一定没有在数据库中保存,就不要去数据库查询了。

2. 缓存击穿(失效)

2.1 背景

在高并发的情况下,当一个缓存key过期时,因为访问该key请求较大,多个请求同时发现缓存过期,因此对多个请求同时对数据库查询、同时向Redis写入缓存数据,这样会导致数据库的压力非常大可能会被压垮。
关键点:单一热点数据、高并发、数据失效

2.2 解决方案

    1. 使用锁
      分布式使用分布式锁:使用分布式锁保证对于每个key同时只允许只有一个线程查询到后端服务,其他没有获取到锁的权限,只需要等待即可;这种高并发压力直接转移到分布式锁上,对分布式锁的压力非常大。
      单个服务使用本地锁,和分布式锁机制一样,只不过分布式锁适应于服务集群、本地锁仅限于单个服务使用。
    1. 过期时间
      设置热点数据永不过期或者异步延长过期时间;
    1. 布隆过滤器

3. 缓存雪崩

3.1 背景

缓存雪崩是指缓存服务器重启或者大量的缓存集中在某个时间段失效,突然给数据库产生了巨大的压力,甚至击垮数据库的情况。

3.2 解决方案

  • 过期时间添加随机值,使数据不同时过期
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容