在业务系统中,Http请求时,想要获取某个高频数据,一般先从缓存中获取,如果缓存中不存在,就从数据库中查询,如果查询到结果就将数据保存到缓存中在返回结果,那么在这个过程中使用的缓存一般会出现几种常见的问题,即击穿、雪崩和穿透。
-
缓存击穿
缓存击穿值得时某个Key一直扛着高并发,例如字典数据,那如果这个key在某个时间内托然失效了呢?那所有的请求立马会直接查询数据库,如果请求数够大,,很可能直接将数据库击垮。
解决方法: key不设置过期时间,如果该key数据更新了,那么通过互斥锁的方式将其更新,保证数据的一致性,牺牲一点点效率。
-
缓存雪崩
缓存雪崩: 某个时间节点,大量的key失效,导致大量的请求从缓存中获取不到数据而去请求数据库,因为大量的key失效,必然导致大量请求,那么数据库瞬间压力剧增,必然导致数据库宕机, 在这种情况下重启时没有用的,重启同样会大量请求涌入,瞬间宕机。
解决方法:
1. 加随机值即设置key的时间时再加一个随机值
2. 加锁
-
缓存穿透
缓存穿透的意思就是某个不存的key一直被访问,结果发现数据库也没有该记录,最终导致访问该key的所有请求都直接抵达数据库。如果在高并发的情况下就容易将数据库搞垮。
解决方法:
缓存空数据:假设某个key数据并不存在,那么存一个NULL并设置过期时间,例如:id =10000的记录不存在,然后本次访问没有查询到数据,缓存中存入的(key, value)就是(10000, NULL),如果新增了id为10000的记录,如果不设置过期时间,那他永远也获取不到。
布隆过滤器:
将数据库中所有的查询条件,放入布隆过滤器中,当一个查询请求过来时,先经过布隆过滤器进行查,如果判断请求查询值存在,则继续查;如果判断请求查询不存在,直接丢弃