一、什么是缓存雪崩?redis
好比:Redis不可能把全部的数据都缓存起来,全部redis须要对数据设置过时时间,而且采用惰性删除与定时删除两种策略对过时键删除。若是缓存数据设置的过时时间都是相同的,而且redis刚好将这部分的数据都删除了,这就形成了缓存所有失效,全部的请求都跑到数据库中。数据库
总而言之:就是咱们的缓存数据库(Redis)挂掉了,所有的请求都跑到数据库中。缓存
二、如何解决缓存雪崩?对象
在给缓存设置一个随机的过时时间,这样能够减小缓存在同一个时间点过时。高可用
当redis挂掉了,能够分为三个点解决:请求
1)在事发前,实现redis的高可用,尽可能避免redis挂掉的状况发生数据
2)在事发时,能够设置本地缓存与限流机制,尽最大的可能防止数据库GG查询
3)在事发后,redis持久化,重启后自动从磁盘加载数据,快速的恢复到灾难前状态。di
三、什么是缓存穿透?时间
缓存穿透指的是查询一个必定不存在的数据。由于处于容错性考虑,当缓存中没有这个数据时,则就会从数据库中找,若是数据库中找不到也就不会保存到缓存中。这就形成了这个不存在的数据每次请求都链接数据库,到数据库中找,失去了缓存的意义。
总而言之:就是请求的数据在缓存中大量不命中,致使请求都走数据库。
四、如何解决缓存穿透?
两种方案:
1)若是请求的数据时不合法的,不存在的,则可使用布隆过滤器(BloomFilter)提早拦截,不合法的就不让这个请求到数据库层。
2)当请求的数据找不到的时候,能够将这个空的对象保存到缓存中(通常设置一个较短的过时时间),当再次请求的时候能够从缓存里边拿到了。
五、什么是缓存与数据库双写一致?
当咱们须要更新数据的时候,不少状况都会形成数据库和缓存中的数据不一致。从理论上来讲,只要设置了过时时间,就能保证缓存和数据库中的数据最终是一致的。只要缓存数据过时了,就会被删除,随后读的时候,就会查找数据库的数据,将数据读取写入到缓存中。