Redis缓存穿透、雪崩、击穿,简析及解决办法

Redis穿透

查询数据在Redis和Mysql中都不存在,查询都落在Mysql上,使Mysql崩溃。

解决办法:

1、做好基础校验,包括用户鉴权,查询id参数等。

2、缓存空查询结果(设置短过期时间,否则资源浪费)

3、接口层增加 布隆过滤器,将所有可能存在的查询参数存储到一个bitmap中,查询时校验(会有一定的出错率)。

Redis雪崩

Redis中多个缓存key一段时间内集中失效(大面积),发生大量缓存穿透,同时大量请求进来,落到数据库,造成数据库阻塞、甚至宕机。

解决办法:

1、缓存预热:热点key设置永不过期、高并发之前手动触发更新。2、加锁或者队列控制写缓存的线程数量,如某个Key只允许一个线程查询数据库和写缓存,其他线程等待。

3、对不同的Key设置不同的过期时间,比如1-5分钟随机,避免集体失效。

4、Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。

5、本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。

6、Redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

Redis击穿

某个缓存key持续高并发访问,在失效的瞬间,高并发落在Mysql上使服务阻塞。

解决办法:

1、设置永不过期、或者过期时间超过抢购时间。

2、缓存数据更新不频繁,缓存刷新耗时较少时,可采用基于 Redis、zookeeper 等分布式互斥锁,或者本地互斥锁,使少量的请求能到数据库并重新构建缓存,其余线程则在锁释放后能访问到新缓存。

3、缓存数据更新频繁或者在缓存刷新的流程耗时较长时,可利用定时线程在缓存过期前主动地重新构建缓存或者延后缓存的过期时间,以保证所有的请求能一直访问到对应的缓存。(定时刷新缓存)

你可能感兴趣的:(redis,nosql数据库)