穿透
穿透是指在缓存中没有的数据,有人恶意请求数据,导致跳过了redis,直接去请求数据库的数据,导致数据库压力过大宕机。比如请求id为8888的信息,但是没有8888的信息,这时候恶意请求会一直去数据库中查询数据。
预防
- 常用的方式是直接将为空的数据也存到缓存总,比如id为8888的在数据库中不存在,那也照样存入到缓存中,这样就会去请求缓存中的数据。
- 布隆过滤器
他是以一个二进制数组的形式存在的,0代表不存在,1代表存在,一个位置上可能存在多个key。
但是他存在误判的情况,比如:实际不存在key:9999这个数据,但是他可能会判断为存在。
如果误判率越低,说明这个数组会很长,如果误判率高,说明这个数组很短。
当删除数据的时候,布隆过滤器是做不到移除、删除的,因为在一个位置上可能包含多个数据。
代码的复杂度维护也比较麻烦。
雪崩
所谓雪崩就是当许多缓存在同一时间过期,与此同时有很多的流量进来,这时候访问数据都不经过缓存,直接去访问了数据库,这使得数据库压力很大,可能导致宕机。
预防
1. 永不过期
2. 过期时间错开
比如:热点数据过期时间可以长一点,不经常用的数据过期时间可以短一点
3. 多缓存结合
可以与其他的缓存结合在一起,比如:Memcache。这样就可以先查询redis,redis没有去就去Memcache查。
4.采购第三方Redis
比如:阿里云