Redis常见穿透问题、击穿问题、雪崩问题解决方案
穿透问题
定义
Redis 缓存穿透指的是大量请求Redis缓存时,查找不到对应key,导致请求每次都会触发查询数据库,导致数据库压力过大。如果请求量大的时候极有可能压垮数据库。
解决方案
- 做好参数校验,无效的请求直接返回,只能避免一部分情况,攻击者总是可以找到一些没有覆盖的情况。
- 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
- 推荐:采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
击穿问题
定义
某个缓存的key失效,导致大量的请求全部转向查询数据库,导致数据库压力过大。
解决方案
- 对热点key设置永不过期或提前预热数据
- 加互斥锁,缓存中没有热点key对应的数据时,由获得锁的线程去读取数据库然后设置缓存,没有获得锁的请求等待100ms,再重新去缓存取数据。
- 接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。
雪崩问题
定义
缓存雪崩主要指的是短时间内大量key失效,导致所有请求全部转向数据库,导致数据库压力过大。
解决方案
- 在设置缓存事件时加随机值,避免缓存扎堆失效。
- 可以把缓存层设计成高可用的,个别节点宕掉,依然可以提供服务。利用sentinel或cluster实现。
- 双缓存机制,缓存A的失效时间为20分钟,缓存B没有失效时间,从缓存A读取数据,缓存A中没有时,去缓存B中读取数据,并且启动一个异步线程来更新缓存A。
- 加锁排队(容易造成堵塞,不推荐)
网友评论