缓存相关

前言

今天看了一个博客,了解了一下关于缓冲一致性与穿透的问题,特此记录一下

缓存穿透

概念:什么是缓存穿透?

  其实按照字面意思理解很简单,就是穿透缓存,直接访问DB。举个例子吧,假设使用的是redis,我们使用key,value来进行存储,当我们查询一个key时发现其不存在,我们以为是没命中,所以就去数据库中查找,查找之后发现也没有,这时候我们才知道原来就没有这个数据。这是一个很正常的场景,但你想想,每次查找一个根本不存在的记录时,都要穿过缓存直接访问数据库,无疑带来了没必要的开销,因为数据本身就没有嘛,所以缓存自然没有。
  其实这个问题很危险,假设有个人一直使用一个不存在的id访问,这时候会一直访问数据库,数据库可能就会宕机.....(类似于拒绝服务攻击一样)

  那么怎么解决这个问题呢?怎么拦截一些查询结果为null的请求呢,让其访问缓存的时候就知道结果是null呢?

  其实很简单,要想让它拦截,你就要给它数据啊,让它知道什么该拦什么可以放行,我在网上看到了两种解决办法:

  • 1、就是把那些数据库访问结果为null的也存储在缓冲中,对应key的value设置成一个空对象就行了,这样下次再来的时候就可以直接返回了,等数据库相应更新之后就来更新这个key

  • 2、还有之中就是使用布隆过滤器,访问结果为空的就存储在这里,每次有访问为空的就更新一下这个过滤器,用这个就可以过滤掉一些重复的
     我个人觉得比较喜欢第二种方法,第一种感觉开销太大了,

你可能感兴趣的:(缓存相关)