Redis面试主题:穿透|击穿|雪崩

缓存穿透

在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接落到数据库上,这会给持久层数据库造成很大的压力。

解决方案

  • 布隆过滤器:布隆过滤器是一种数据结构,用于数据量大的情况下代替hashmap判断某个元素是否存在,拦截对不存在数据的请求
  • 缓存空对象:当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取

缓存击穿

在高并发下,对一个特定的值进行查询,但是这个时候缓存正好过期了,缓存没有命中,导致大量请求直接落到数据库上。

解决方案

  • 使用锁,单机用synchronized,lock等,分布式用分布式锁。
  • 缓存过期时间不设置,而是设置在key对应的value里。如果检测到存的时间超过过期时间则异步更新缓存。
  • 在value设置一个比过期时间t0小的过期时间值t1,当t1过期的时候,延长t1并做更新缓存操作。
  • 设置标签缓存,标签缓存设置过期时间,标签缓存过期后,需异步地更新实际缓存

缓存雪崩

在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上。

解决方案

  • redis高可用:多增设几台redis,这样一台挂掉之后其他的还可以继续工作,集群模式
  • 限流降级:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
  • 数据预热:数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

You May Also Like

About the Author: daidai5771

发表评论

电子邮件地址不会被公开。 必填项已用*标注