redis缓存穿透、缓存击穿和雪崩的原因和解决方法

什么是缓存穿透,缓存穿透带来的问题,如何解决缓存穿透?

  • 缓存穿透是什么:
    • key所对应的数据再数据源中并不存在,所以在缓存当中一直命中不了,则会进入到数据库当中进行查找。而设置缓存就是为了减少数据库压力,而这样的数据查找并不能实现缓存的意义。        
    • 可能出现的问题:网络攻击者频繁的使用这样的key去进行查询可能会压垮数据库。
  • 如何解决:想要解决缓存穿透,就必须想办法,能够识别出,哪些请求的数据,是数据库没有的,然后,对这些请求的查询,进行过滤。而redis为我们提供了一个工具来解决这个问题“布隆过滤器”。

布隆过滤器:是redis提供的一种数据结构,它可以在海量数据当中来判断当前值存不存在。但它的准确率不是百分百。

        布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。     –引自《维基百科,自由的百科全书》

 什么是缓存击穿,缓存击穿带来的问题,如何解决缓存击穿?

  • 缓存击穿是什么:
    • key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把数据库压垮。也是没有体现缓存的意义,减少数据库的压力。
  • 解决方案:
    • 对于一些非常高频的热点数据不设置过期时间,并且去开启定时任务定期查看缓存当中的数据有没有被删除,因为不设置过期时间只能保证redis不对其进行删除,但不能保证再其它服务当中不对这些缓存当中的数据进行删除。

什么是缓存雪崩,缓存雪崩带来的问题。如何解决缓存雪崩?

  • 缓存雪崩是什么:
    • 缓存服务器重启或者大量缓存集中在某一个时间段失效,导致请求要进入数据库当中进行查询,对于数据库产生很大的压力。
  • 解决方案:
    • 缓存雪崩是因为缓存再某一个时间段同时过期,那么我们就将缓存失效时间分散开,不让它同时过期,对于key的过期时间做合理的规划,例如对于过期时间设置为1-3分钟的随机值。这样同时失效的概率就大大降低了。对于高频数据不设置过期时间

缓存穿透,与击穿的区别:
        击穿:数据库里“有”数据;
        穿透:数据库里“没”数据。

什么情况下要考虑这三个问题?

看用户量和并发量和数据量(单表数据达到200多万)这三者的量级大。

你可能感兴趣的:(缓存,redis,数据库)