因为mysql是从磁盘上来加载数据的,在加上mysql有一套完整的事务机制
    我们就会选择把一些,非常常用,而且不容易发生变化的数据,把他加载到
    redis里面去

    捕获.PNG
    现在这样做的原因是为了避免别人有事没事就来访问我们的数据库
    由于数据库他能承载的并发并不高查询和redis比起来查询速度就会比较慢

    如果别人发起了数据库中不存在数据的:
    此时请求就会达到数据库如果这个时候别人用一些脚本来攻击你的系统
    这些脚本以极高的频率发起这样的请求那么这个时候你的系统就会被
    打崩这个就是缓存击穿

    如何解决这个问题?
    百度答案:
    如果是负数直接不让访问
    如果当前请求是固定不存在的数据,哪怕数据库没有查询出来,它都会往redis里面去写一个key,这种解决方案会避免一些明显不存在的请求

    但是以上两个解决方案 其实没有办法解决一个问题,如果采用一个非负数的随机数呢?
    就是说当前它的随机数是7867868然后我的数据库里面没有这个数字
    他就回去访问的redis然后依次重复使用根本就没法解决这个问题
    我的redis就会存在大量的随机数我的redis压力就会大
    也就是或它只会处理负数和单独不存在的数据
    那么这种方案我们如何解决?
    捕获.PNG
    我们会去搞一个白名单里面只会存在对应的ID
    然后它发起请求进入到我们的白名单当中,我白名单会有一个逻辑
    书写一个拦截器当用户发起id的请求如果它存在 这个时候才会让他
    向后走,如果不存在就不往后放了
    因为白名单的数据与我们数据库里面的数据保持一致
    所以如果我白名单里的数据没有那就没有必要把放过去
    所以负一这样的数据就解决了

    但是这样的方案也会存在一个问题:
    以淘宝商品为列:在10年左右 淘宝sku也就是淘宝的商品突破十亿
    后台的数据库表就会进行分库分表操作因为达到一定体量了
    而且为了保存分库分表之后主键不唯一了 他可能会采用雪花算法
    就是单个数据就会变的很长:所以这个时候我的白名单的压力就会
    很大光这个白名单的集合就会吃掉五十个亿的内存
    所以它就不划算

    解决方案:
    引入一个东西叫做布隆过滤器:
    布隆过滤器:
    实际上就是一个超级庞大的二进制数组核心思想就是利用
    哈希思想用一些省内存的二进制去替代掉浪费空间的主键
    那么我的白名单就会变成一个超大的二进制集合
    那么我要去处理这样的数据:就会存在两步操作:
    放和拿:
    放的时候会先走哈希算法
    捕获.PNG
    如果说前面传过来一个随时数我拿进去进行算法处理,然后算出来打比说
    是一个1那么它就会去看对应的1下面的脚表是多少那么一看是一个0
    那么这个数字就是一个攻击

    先走我通过哈希思想我就用当前比较省内存的二进制比特,直接可以表示一个32位的数据类型内存就省了很多极大的节约了我们的查询内存
    那么其中也会存在一个问题叫做哈希冲突

    所以布隆过滤器实际上有一个东西要考虑叫做误差虑
    实际上说的就是哈希冲突
    所以说不隆过滤器有一个特点:如果不存在,就一定不存在
    如果存在那就可能存在

    比如说我现在有一个数字我算出来是一个0那么我那个数组里面就不一定不存在
    因为有可能是一个哈希冲突
    如果说我算出来是一个1我去找下标那么他就一定不存在这个数据