Redis 缓存穿透、雪崩、击穿以及相关解决方案

缓存流程:

缓存穿透:

  1. 什么是缓存穿透:是指 redis 和数据库都没有这个数据,大量请求该数据造成数据库挂掉,该请求一般是非正常用户

  2. 解决方案:

    1. 布隆过滤器:将数据库中所有的查询条件放入布隆过滤器中,当大量的请求过来的时候, redis 里面没有,再去布隆过滤器进行查,如果请求存在,则继续查;如果不存在,直接丢弃。
    2. 第一次请求打到数据库,无法是否能查询到数据还是空,都返回给 redis 做缓存,防止二次请求穿透 redis
    3. IP 拉黑
    4. 参数合法性校验,参数不合法,直接返回

缓存雪崩

  1. 什么是缓存雪崩:redis 缓存中 key 同一时间大量失效,大量的请求(不同key)全部打到数据库,就像雪崩来了一样

  2. 解决方案:

    1. 设置缓存失效时间,不要在同一时间失效,在设置缓存的时候随机初始化有效时间,这样就不会让所有的缓存同时失效
    2. 不设置失效时间,让缓存永远不失效
    3. 跑定时任务,定时刷缓存,然后设置新的失效时间
    4. redis 集群,热点 key 部署到不同节点的 redis 上

缓存击穿

  1. 什么是缓存击穿:在高并发情况下,如果好多请求都在查询一个 Key ,这个 key 因为某些原因失效了,这样就会导致大量的请求直接打到数据库上了,造成数据库挂掉

  2. 解决方案:

    1. 缓存永远不过期
    2. 分布式锁:第一个请求拿到了锁,到数据库获取数据,并缓存到 redis,其他请求被阻塞,睡眠几毫秒然后再次请求 redis ,这时的 redis 已经有缓存,直接返回
    3. 单体应用使用互斥锁

什么是布隆过滤器?

参考:
https://www.bilibili.com/video/BV1f5411b7ux
https://mp.weixin.qq.com/s/SlfLgsfbvytxNS46fTFUdA

posted @ 2020-10-17 20:49  熠然  阅读(152)  评论(0编辑  收藏  举报