Redis缓存穿透、击穿和雪崩

缓存穿透

  • 问题描述:指客户端请求的数据在缓存和数据库中都不存在,这样每次请求都会穿透缓存直接访问数据库,导致数据库压力过大。
  • 解决办法
    • 布隆过滤器:在缓存前加一层布隆过滤器,判断请求的数据是否存在。如果布隆过滤器判断数据不存在,就直接返回,避免访问数据库。
    • 空值缓存:当数据库查询结果为空时,将空值也缓存到 Redis 的 key 中,并设置一个较短的过期时间,后续相同请求可直接从缓存中获取空值结果。

缓存击穿

  • 问题描述:指一个热点 key 在缓存中过期的瞬间,有大量请求同时访问该 key,这些请求会直接穿透缓存访问数据库,导致数据库压力骤增。
  • 解决办法
    • 设置永不过期:对于热点 key,不设置过期时间,或者定期更新过期时间,保证缓存一直有效。比如某一个热点数据的过期时间是1小时,那么每59分钟,通过定时任务去更新这个热点key,并重新设置其过期时间。
    • 互斥锁:当缓存失效时,让一个请求去查询数据库并更新缓存,其他请求等待该请求完成后再从缓存中获取数据。可以使用 Redis 的分布式锁来实现互斥访问。简单来说就是当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。

缓存雪崩

  • 问题描述:指大量的缓存 key 在同一时间过期,或者 Redis 实例发生故障,导致大量请求直接访问数据库,使数据库压力过大甚至崩溃。
  • 解决办法
    • 过期时间随机化:为了避免大量的缓存在同一时间过期,可以把不同的key过期时间设置成不同的, 并且通过定时刷新的方式更新过期时间。
    • 集群部署:采用 Redis 集群来提高系统的可用性和容错性,避免单点故障。
    • 数据预热:在系统启动前,将一些热点数据提前加载到缓存中,并设置不同的过期时间。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部