缓存问题

未匹配的标注

缓存穿透

  • 概念: 缓存穿透是指某一个数据在缓存中和数据库中都不存在, 当请求的时候, 由于缓存中不存在, 导致请求直接打到数据库中, 一般情况下是数据存在的时候才会往缓存中存储, 而当前请求的数据在数据库中并不存在, 所以就不会往缓存中存储, 这样就导致了每次请求都会打到数据库中, 这就是缓存穿透

  • 缓存穿透可能出现在下面情况:

    1. 请求一个 id 为负数的记录

    2. 请求一个超级大的 id

  • 解决办法:

    1. 在业务层添加数据验证, 当参数错误的时候直接抛出异常

    2. 修改缓存存储策略, 当查询出来的值为空的时候也进行缓存, 不过需要设置一个较短的过期时间, 否则会导致缓存中存在很多空值

    3. 使用布隆过滤器, 可以判断数据是否可能存在或者是否一定不存在


缓存击穿

  • 概念: 缓存击穿是指当一个 key 失效的同时, 有大量的请求进来查询该失效的键, 从而导致了所有的请求都打到了数据库上, 压垮数据库

  • 造成缓存击穿的原因:

    1. 该数据没有人查询过, 第一次就大并发访问 (冷门数据)

    2. 添加到了缓存, 但是 Redis 设置有数据过期时间, 而这条数据正好过期, 大并发访问 (热点数据)

  • 解决办法:

    1. 设置热点数据永不过期 (并不适用所有的场景)

    2. 使用互斥锁. 当从缓存中查询不到数据的时候, 进而到数据库中查询, 这个时候使用互斥锁, 等到从数据库中查询完毕后把数据写入缓存然后再释放锁, 而其他线程也在查询数据的时候, 发现获取锁失败, 则可以睡眠一段时间后, 再次请求, 此时缓存中已经有值了, 就可以从缓存中查询了

缓存雪崩

  • 概念: 缓存雪崩是指在同一时间, 有大量的 key 过期, 从而导致所有的请求都打到数据库中, 进而导致数据库压力过重雪崩

  • 造成缓存雪崩的原因:

    1. Redis 宕机

    2. 大部分数据失效

  • 解决办法:

    在设置 key 的过期时间的时候, 用指定的过期时间再加上一个随机的数值, 进而使过期时间分散开, 避免集中失效

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~