缓存穿透
要查询的数据,redis中没有,数据库中也没有,那么每一次的查询都要经过redis和数据库,redis几乎没有起到该有的作用。
解决这个问题的方式一般认为有两种:
第一种是从数据库查询不到时,给查询的key一个空值,存入redis,失效时间可以短一些,那么对同一个不存在的key,就没有缓存穿透的问题。
第二种是对于可以确定的key值,取hash值存储起来,当要查询的key值不在hash表中,直接丢弃。
第一种方式的缺点是当key值很多时,会很大程度上增加redis的存储压力,这种方式比较适合key变化不是很快的场景。
第二种方式的缺点是key值要已知,类似于白名单,很多场景都不太适用。
缓存击穿
一个很热的key值,从redis中失效清除后,突发的大量查询涌入数据库,导致数据库超负载。
目前看到的解决方案,都是在数据库访问中加锁,控制数据库的访问量,防止数据库宕机。
缓存雪崩
redis数据库不能正常工作(也有可能工作正常,但是命中率很低),导致所有的查询请求都跑到数据库中来。
解决方案,对于redis宕机的,使用集群,分化风险;对于命中率很低的场景,可以提前缓存到redis中,场景类似双11要提前下单,然后等到双11当天结账。