如何通俗的理解Redis缓存击穿、穿透、雪崩
缓存雪崩
缓存服务器宕机,所有请求全部落到数据库上,导致数据库挂掉了。此时,就算是重启数据库,马上还会被新的请求给干掉。这就是缓存雪崩。
解决方案:
雪崩前:redis设计成高可用,防止大面积故障,如 Redis Sentinel 和 Redis Cluster
雪崩时:缓存限流、降级
雪崩后:redis持久化,快速备份和恢复数据
缓存穿透
当一个请求从缓存中取数据时,如果请求的key在缓存中不存在,就会跳过缓存,直接请求数据库,如果数据库中也不存在就会返回null,null是不会写入缓存的,多次请求,就会造成缓存穿透
解决方案:
1、返回空值也存入缓存中,并设置过期时间,不过要考虑到过多的空值的键造成的影响
2、布隆过滤,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。
缓存击穿
某个key访问非常频繁,处于集中式高并发的访问状态,当这个key在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库。
解决方案
将高访问量的数据设置为永不过期;
实现互斥锁,待一个请求构建完释放锁后,其他请求再进行访问。