【redis】redis缓存击穿

目录

        • 一、什么是缓存击穿
        • 二、解决缓存击穿

一、什么是缓存击穿

  • 1.一个被高并发访问且缓存重建业务比较复杂的key过期了,会造成大量的请求访问数据库
  • 2.key失效,线程A获取key缓存未命中,去查数据库,拿到数据,构建缓存,构建时间长,还没来得及将数据写入到缓存中,线程B获取key缓存也未命中,去查数据库,拿到数据,构建缓存,构建时间长,缓存还未写入。大量的并发都会去查数据库,给数据库造成压力

二、解决缓存击穿

  • 1.给缓存重建逻辑加上互斥锁,线程A获取key缓存未命中,拿到互斥锁,开始查数据库拿到数据,构建缓存,然后写入到缓存。线程B获取key缓存未命中,没有拿到互斥锁,休眠一会再去拿缓存,缓存未命中,也没获取到锁,继续重试,直到获取到缓存为止。只有一个线程去构建,如果构建过程慢,会导致其它线程等待,效率低
  • 2.逻辑过期,给缓存的数据加上逻辑过期的属性,但该key永不过期,线程A查询缓存,发现逻辑时间已过期,获取互斥锁成功,开启新线程C(线程C查询数据库数据重建缓存,写入缓存重置逻辑过期时间,释放互斥锁),线程A直接返回过期数据。线程B查询缓存,发现数据逻辑时间过期,当线程C还在重建时,尚未释放锁,线程B尝试获取锁失败,直接返回过期数据。当线程D查询缓存,发现数据逻辑时间未过期,则直接返回
  • 3.互斥锁没有额外的内存消耗,能保证一致性,实现简单,但线程需要等待,性能受到影响,会有死锁风险(如果业务需要查多个缓存,构建时互相持有锁,可能会造成死锁)
  • 4.逻辑过期线程无需等待,性能较好,但不保证数据一致性,也有额外的内存消耗(过期的数据仍然会被缓存),实现复杂

你可能感兴趣的:(redis,面试,redis)