一、缓存雪崩
概念:
简单来说就是Redis大量的key集体失效,大量的请求全部都去请求数据库,数据库压力骤增,甚至发生宕机现象就叫雪崩
解决方法:
处理缓存雪崩简单,在批量往Redis
存数据的时候,把每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效,我相信,Redis这点流量还是顶得住的。
setRedis(Key,value,time + Math.random() * 10000);
二、缓存击穿
概念:
缓存击穿是指缓存中没有但数据库中有的热点数据(一般是缓存时间到期的热点数据),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力,这就是缓存击穿。
解决方法:
- 设置热点key永远不过期,或者快过期时,通过另一个异步线程重新设置key
- 当从缓存拿到的数据为null,重新从数据库加载数据的过程上锁
三、缓存穿透
概念:
每秒发送大量不存在的请求,缓存中没有就要去查询数据库,数据库中也没有,这样缓存就不起作用,数据库也很快被打死,一般都是黑客的恶意请求,这就是缓存穿透。
解决方法:
- 对请求参数进行校验,不合理直接返回(如id<=0)
- 查询不到的数据也放到缓存,value为空,如 set -999
- 使用布隆过滤器,快速判断key是否在数据库中存在,不存在直接返回