Redis缓存穿透、缓存击穿和缓存雪崩都是缓存机制中的一些问题,具体解释如下:
-
缓存穿透(Cache Penetration):指查询一个不存在的数据,由于缓存中没有数据,所以这个查询请求会直接穿过缓存层,到达数据库层,造成了数据库的压力。攻击者可以通过构造恶意请求,使得缓存层无法命中任何数据,从而导致请求直接访问数据库,从而引起数据库压力过大。
-
缓存击穿(Cache Breakdown):指缓存中某个热点数据失效,此时有大量并发请求同时访问这个失效的数据,导致这些请求直接访问数据库,造成数据库压力过大,甚至导致数据库崩溃。通常是由于缓存中某个热点数据过期失效,同时有大量并发请求访问该数据。
-
缓存雪崩(Cache Avalanche):指缓存中大量的数据失效,导致大量请求直接访问数据库,造成数据库压力过大。通常是由于缓存中大量的数据在同一时间失效,导致大量请求直接访问数据库。
针对上述问题,可以采取以下措施:
-
缓存穿透:可以在查询缓存之前,先对请求的参数进行合法性检查,如过滤非法字符、判断参数范围等;或者使用BloomFilter等数据结构,对查询参数进行过滤,只有在BloomFilter中判断有可能存在的情况下才会去查询数据库。
-
缓存击穿:可以使用锁机制或者分布式锁机制,避免大量并发请求同时访问失效的热点数据。另外可以设置热点数据的过期时间为随机时间,避免在同一时间大量数据同时失效。
-
缓存雪崩:可以采用多级缓存架构,减少缓存层的压力;或者设置不同的缓存过期时间,避免大量数据同时失效。另外可以在缓存层和数据库层之间添加限流、熔断等措施,避免因突发流量导致系统崩溃。