缓存雪崩
大量缓存同时过期,就叫缓存雪崩。
-
缓存中有大量数据同时过期,导致大量请求缓存缺失
-
redis实例宕机
措施
-
设置过期时间时,随机小范围打散
-
服务降级
缓存命令率下降到警告值或者数据库负载突然增大时,很可能发生了缓存雪崩。
可以通过服务降级措施,来保证核心接口能正常查询数据库。也可以通过熔断措施,避免下游接口由于缓存雪崩链式导致当前服务异常。 -
限流指标减少
redis实例恢复前,整个系统负载上线已降低,可以通过限制网关请求量来保护数据库实例不受影响。
- 事前预防
redis服务考虑可用性,构建高可靠集群。
缓存击穿
某热点key过期,大量请求打到数据库。
措施
- 针对特别频繁的热点数据,不建议设置过期时间
缓存穿透
访问的数据不在redis缓存及数据库中,导致每次请求都达到数据库上。
措施
-
设置缺省空值,比如数据库中不存在,可以设置为空字符串或者0等
-
使用布隆过滤器进行拦截判断
布隆过滤器由一个初值都为0的bit数组和N个哈希函数组成,可以用来快速判断某个数据是否存在。
当想标记某个数据存在时(例如,数据已被写入数据库),布隆过滤器会通过三个操作完成标记:- 使用N个哈希函数,分别计算这个数据的哈希值,得到N个哈希值。
- 把这N个哈希值对 bit数组的长度取模,得到每个哈希值在数组中的对应位置。
- 对应位置的bit位置1。
-
Nginx拦截部分不合法的请求参数,减少恶意请求