缓存穿透:查询一个不存在的数据,MySQL查不到数据,也无法写入缓存,就会导致每次请求都会查询数据库,当程序被人恶意攻击,如,每次查询都查询id=-1的操作,当请求数量达到一定的次数,就会造成缓存穿透
解决方案一:
缓存空数据,查询返回的数据为空,仍然把这个数据存入到缓存中
优点:简单
缺点:当有大量的id查询出来的数据都是null,缓存的压力大
有可能会发生数据不一致的问题,如第一次查询的值为null,在第二次请求查询之前,一个值储存进了这里,那第一次查询和第二次查询就会发生数据不一致的问题
解决方案二:
布隆过滤器:可以检索一个数据是否在一个集合(bitmap集合)中,实现方案:redisson,guara
bitmap:是一个以位为单位的集合,数组中每个单元只能存储0或1
当我们存储数据的时候,可以通过多个hash函数获取hash值,根据哈希计算数组的对应位置的值该为1(初始状态全是0),当我们取数据的时候使用相同的数据获取hash值,判断对应位置的值是否都是1
优点:节省内存
缺点:存在误判,数组越小,误判率越大,数组越大,误判率越小,但是数组大也会造成更多内存消耗 ,我们可以在初始的时候设置误判率,一般设置在百分之五左右,不会占用过多内存,同时也不会在高并发下被穿透